شبکه لایتنینگ (Lightning network) قسمت سوم: تکمیل کار و بستن کانال
سمیرا ابراهیم پور | 2017.12.04

درک شبکه لایتنینگ

در حال حاضر حداقل سه شرکت در حال کار بر روی پیاده سازی شبکه لایتنینگ هستند؛ شرکت هایی نظیر Lightning (متعلق به Poon  و Dryja)، Blockstream و Blockchain. اما غیر از این خط مقدم کوچک، تعداد کمی هستند که درک کرده اند چگونه “آینده ی پرداخت های خرد” می تواند قابلیت های بیتکوین را افزایش دهد.

در این مقاله که توسط Bitcoin Magazine ارائه شده، به توضیح مسائل پایه ای شبکه لایتنینگ و چگونگی هماهنگی اجزای آن با یکدیگر جهت درک پروتکلی که در آینده اجرا خواهد شد، می پردازیم. بخش اول این مقاله به توضیح اجزای اصلی سازنده و چگونگی ترکیب آن ها برای ساختن “قراردادهای هوشمند” می پردازد که می توان گفت اولین نیاز برای درک شبکه لایتنینگ یعنی “کانال پرداخت دو طرفه” است.

شبکه لایتنینگ

بخش سازنده شماره1: تراکنش های تایید نشده

پروتکل بیتکوین در واقع شامل تراکنش هایی می شود که با تراکنش های قبلی و بصورت بالقوه با تراکنش های بعدی در ارتباط (یا متصل) هستند. هر تراکنش شامل ورودی ها و خروجی ها می شود. ورودی ها همان آدرس هایی ست که بیتکوین ها از آن ارسال شده اند، و خروجی ها آدرس هایی ست که بیتکوین ها به آن ها فرستاده شده اند. علاوه بر این، ورودی ها باید شامل اجزایی باشند که لازمه ارسال بیتکوین است؛ اجزایی مثل امضاها، که “مالکیت” مربوط به آدرس های ورودی را اثبات می کند. خروجی ها نیز الزامات جدیدی را ایجاد می کنند که باید در ورودی تراکنش بعدی قرار بگیرند.

یکی از ویژگی های کلیدی شبکه لایتنینگ این است که تقریبا از روی تراکنش های معمولی بیتکوین ساخته شده است. نکته متمایز کننده اینجاست که تراکنش های انجام شده در این شبکه، در واقع در کل شبکه بیتکوین منتشر نمی شود. به جای منتشر شدن تراکنش ها در شبکه بیتکوین، آن ها بصورت محلی در نودهای کاربران ذخیره می شوند، اما در هر لحظه که کاربر اراده کند، امکان انتشار آن ها بر روی شبکه وجود دارد.

در این سری مقالات، رنگ تراکنش های تایید نشده مشکی است. تراکنش های آبی رنگ بدان معناست که امکان انتشار آن توسط Alice وجود دارد، ولی تنها اگر تراکنش قبلیِ آن تایید شده باشد. تراکنش های قرمز رنگ هم بدان معناست که امکان انتشار آن توسط Bob وجود دارد، ولی تنها اگر تراکنش قبلیِ آن تایید شده باشد.

 در مثال زیر، Alice می تواند تراکنش تایید نشده خودش (اولین تراکنش از سمت چپ) را در هر زمان که بخواهد بر روی شبکه منتشر کند و دو بیتکوین برای Bob بفرستد. برای اینکه Bob بتواند به Carol یک بیتکوین بفرستد (و یکی هم بعنوان بقیه پول برای خودش بفرستد)، Alice باید تراکنش خودش را امضا و منتشر کرده باشد.

شبکه لایتنینگ

بخش سازنده شماره 2: حفاظت در برابر دوبار خرج شدن

دومین بخش سازنده مورد نیاز برای شبکه لایتنینگ نیاز به توضیح زیادی ندارد چرا که جز جدا نشدنی بیتکوین به حساب می آید و آن “حفاظت در برابر دوبار خرج شدن” یا “double-spend protection” است. اگر دو تراکنش (یا ورودی) به یک خروجی یکسان وابستگی داشته باشد، تنها یکی از آن ها می تواند تایید شود.

موضوع مهمی که اینجا باید در نظر گرفت این است که حتی با اینکه تراکنش های تایید نشده می تواند گیج کننده باشد، اما بدان معناست که تنها و تنها یکی از آن ها می تواند تایید شود.

دوبار خرج کردن: در مثال زیر، Alice باید تصمیم بگیرد که کدام تراکنش را امضا و منتشر کند؛ او نمی تواند هر دو را امضا و منتشر کند (اگر این کار را کند، تنها یکی از آن ها تایید می شود).

شبکه لایتنینگ، حفاظت در برابر دوبار خرج شدن

بخش سازنده شماره 3: چندامضایی

سومین بخش سازنده شبکه لایتنینگ نیز موضوع پیچیده ای نیست: آدرس های چندامضایی یا multisig addresses که به آن آدرس های P2SH هم می گویند.

آدرس های چندامضایی، آدرس هایی بیتکوینی هستند که برای خرج کردن بیتکوین های آن ها، به چندین کلید خصوصی نیاز است. آدرس های چندامضایی را میتوان به هر شکل مورد نظر تنظیم کرد. مثلا طوری تنظیم کرد که برای خرج کردن از یک آدرس، به دو کلید از سه کلید نیازمند باشد و یا به پانزده کلید از پانزده کلید نیاز داشته باشد، یا هر شرایط دیگری.

شبکه لایتنینگ معمولا از حالت چندامضایی “دو از دو” استفاده می کند. برای استفاده از بیتکوین های مربوط به آدرس های چندامضاییِ “دو از دو”، دو امضا مورد نیاز است.

چند امضایی: در این مثال، Alice و Bob یک آدرس چندامضایی ساخته اند که هر کدام از آن ها یک کلید از این آدرس را دارند. اگر Alice بخواهد از این آدرس بیتکوینی برداشت کند، تا زمانی که امضای Bob هم موجود نباشد، نمی تواند این کار را انجام دهد.

این نکته را نیز باید در نظر داشت که زمانی که امضایی به تراکنشی اضافه می شود، دیگر نمی توان محتوای آن تراکنش را تغییر داد.

شبکه لایتنینگ،چندامضایی

بخش سازنده شماره 4: قفل های زمانی

چهارمین بخش سازنده، قفل زمانی است. قفل های زمانی می توانند بیتکوین ها را در یک خروجی قفل کنند تا تنها در زمانی مشخص در آینده قابل خرج کردن باشند.

دو نوع قفل زمانی وجود دارد: نوع مطلق که با نام CheckLockTimeVerify (بصورت مخفف: CLTV) از آن یاد می شود، و نوع نسبی که با نام CheckSequenceVerify (بصورت مخفف: CSV) شناخته می شود.

نوع CLTV، بیتکوین ها را تا زمان و تاریخ مشخصی در آینده، یا تا ارتفاع مشخصی از یک بلاک  (مثلا بلاک شماره 496889( قفل نگه می دارد. در عوض CSV از زمان نسبی استفاده می کند؛ هنگامی که یک خروجی CVS در بلاکچین ثبت شود، بعد از تعداد مشخص شده ای از بلاک ها، تازه می توان آن بیتکوین ها را دوباره خرج کرد.

قفل زمانی: در مثال زیر نمونه ای از یک قفل زمانی CSV را مشاهده می کنید.

شبکه لایتنینگ، قفل های زمانی

بخش سازنده شماره 5: هش ها و ارزش ها در شبکه لایتنینگ

پنجمین و آخرین بخش سازنده، یکی از بنیادی ترین بخش های سازنده خود بیتکوین است. بطور خلاصه، یک “ارزش” یا “رمز” یک رشته طولانی و منحصر به فرد از اعداد است که حدس زدن آن حتی برای یک کامپیوتر، غیرممکن است. این “ارزش” (یا رمز) از طریق محاسباتی خاص، می تواند به رشته دیگری از اعداد تبدیل شود که به آن “هش” می گویند. نکته مهم اینجاست: هر فردی که آن “ارزش” را بداند، می تواند هش را نیز بسازد؛ اما این برعکس این کار امکان پذیر نیست. در واقع یک مسیر یکطرفه است.

این روش در بیتکوین نیز برای قفل کردن بیتکوین ها قابل استفاده است.  برای مثال، یک هش می تواند در یک خروجی گنجانده شود، و برای خرج کردن دوباره ی آن، نیاز باشد که ورودی بعدی شامل مقدار “ارزش” متناظر باشد.

ارزش یا رمز: در این سری از مقالات، “ارزش” یا “رمز” با یک کلید رنگی شماره دار نمایش داده می شود (در شکل زیر با نام SECRET/Value مشخص شده) و هش مربوط به آن مقدار، از طریق یک قفل شماره دار با همان رنگ نشان داده می شود (در شکل زیر با نام HASH مشخص شده است)

شبکه لایتنینگ، هش ها و ارزش ها در شبکه لایتنینگ

اولین چالش: کانال های پرداخت دو طرفه

مفهوم کانال های پرداخت، مدتی پیش از معرفی شبکه لایتنینگ نیز وجود داشته است. کانال های پرداخت معمول کاربردهای مختلفی دارند، اما یک محدودیت بزرگ هم دارند: یکطرفه هستند. آلیس می تواند تراکنش های خارج از زنجیره متعددی برای باب ارسال کند، اما باب نمی تواند از طریق “همان کانال” برای آلیس تراکنشی ارسال کند.

Poon و Dryja بعنوان ویژگی کلیدی شبکه لایتنینگ، کانال های پرداخت دوطرفه را پیشنهاد کردند.

باز کردن کانال در شبکه های لایتنینگ

برای راه اندازی یک کانال پرداخت دو طرفه، هر دو طرف باید بر روی یک تراکنش اولیه توافق کنند. این تراکنش اولیه (یا تراکنش گشاینده)، مشخص می کند که هر کدام از دو طرف، چه تعدادی بیتکوین در کانال سپرده می کنند.

فرض کنیم آلیس می خواهد برای باب یک بیتکوین بفرستد. از آنجایی که باب و آلیس می دانند که تراکنش های زیادی با یکدیگر خواهند داشت، یک کانال دو طرفه ساخته اند. (ارسال یک بیتکوین کامل ممکن است برای یک کانال پرداخت سنگین باشد، چرا که مورد مصرف آن بیشتر برای پرداخت های خرد است، اما این کار کاملا امکان پذیر است)

برای باز کردن این کانال، آلیس و باب هر کدام تعداد 5بیتکوین به یک آدرس چندامضاییِ دو-از-دو فرستاده اند (آدرسی که برای خرج کردن بیتکوین های آن، هر دو امضا مورد نیاز است). این امر، تراکنش اولیه یا “تراکنش گشاینده” است. همانطور که گفته شد، بیتکوین ها تنها زمانی قابل استفاده هستند که هم آلیس و هم باب یک تراکنش را امضا کنند.

علاوه بر این، هر دوی این افراد یک “ارزش” یا “رمز” (رشته ای از اعداد) می سازند و مقدار هش شده آن را با یکدیگر جابجا می کنند.

حال آلیس تراکنش بعدیِ تراکنش گشاینده را می سازد. به این تراکنش می گویند “تراکنش تعهد”. با این تراکنش تعهد، آلیس 4بیتکوین به خودش و 6بیتکوین به یک آدرس چندامضایی دیگر می فرستد. این آدرس چندامضایی دوم کمی محدودیت دارد؛ تنها زمانی باب می تواند به تنهایی از آن استفاده کند (یا به عبارت دیگر، فقط از طریق امضای خود، قفل آن را باز کند) که بعد از قرار گرفتن این تراکنش در بلاکچین، 1000بلاک دیگر استخراج شده باشد؛ در واقع در این آدرس از قفل CSV استفاده شده است. از طرف دیگر آیا آلیس می تواند به تنهایی و از طریق امضای خود قفل مورد نظر را باز کند؟ او تنها زمانی می تواند این کار را انجام دهد که “رمز” یا “ارزش” مربوط به باب را در اختیار داشته باشد. همان “رمزی” که باب مقدار هش شده ی آن را برای آلیس فرستاد، اما از آنجایی که از طریق مقدار هش شده ی یک “رمز” نمی توان به خود آن “رمز” دست پیدا کرد، پس آلیس امکان باز کردن قفل را ندارد.

آلیس تراکنش تعهد را در سمت خودش امضا می کند اما آن را در شبکه منتشر نمی کند، در عوض آن را به باب می دهد.

در این میان، باب هم تقریبا کاری مشابه انجام می دهد. او نیز یک “تراکنش تعهد” می سازد که طی آن 6بیتکوین برای خودش می فرستد و 4بیتکوین هم به یک آدرس چند امضایی جدید می فرستد. آلیس می تواند این قفل این آدرس را پس از گذر 1000 بلاک دیگر باز کند و یا باب می تواند با استفاده از “رمز” آلیس آن را باز کند.

حال باب این تراکنش تعهد را در سمت خود امضا می کند و آن را به آلیس می دهد.

بعد از تمام جابجایی های “نیمه معتبر” تراکنش های تعهد و هش های “رمز”ها، آلیس و باب “تراکنش گشاینده” را امضا و در شبکه منتشر می کنند تا مطمئن شوند که در بلاکچین ثبت شده. حال بطور رسمی کانال افتتاح شده است.

در این مرحله، باب و آلیس هر کدام می توانند تراکنش تعهد “نیمه معتبر” را که از طرف مقابل خود گرفته اند، امضا و منتشر کنند. اگر آلیس چنین کاری کند، باب فورا 6بیتکوین می گیرد و اگر باب چنین کاری کند، آلیس فورا 4بیتکوین دریافت می کند. اما هرکدام از آن ها که تراکنش تعهد را امضا و منتشر کنند، باید به اندازه 1000بلاک صبر کنند تا آدرس چند امضایی را بتوانند باز کنند و باقی بیتکوین ها را دریافت کنند. این نکته کلیدی کانال پرداخت است: هیچ کدام نیمه تراکنش خود را امضا و منتشر نکنند.

درک شبکه لایتنینگ، باز کردن کانال در شبکه های لایتنینگ

بروزرسانی کانال

حال بعد از مدتی باب می خواهد یک بیتکوین را به آلیس پس بدهد و به حالتی برگردند که هر کدام 5بیتکوین داشتند. برای اجرایی شدن چنین موضوعی آن ها باید دو کار را انجام دهند.

اول: هر دو باید مراحل توضیح داده شده ی بالا را تکرار کنند (به غیر از تراکنش گشاینده که دیگر ساخته و در بلاکچین ثبت شده است). ایندفعه باب و آلیس برای خود مقدار 5بیتکوین را تعیین می کنند و هر دوی آن ها 5بیتکوین به آدرس چند امضایی می فرستند. شرایط این آدرس های چند امضایی نیز مشابه قبل است؛ فقط اینکه این بار “رمز”های متفاوتی می خواهند، آلیس و باب به یکدیگر هش های جدیدی می دهند. هر دو، نیمه تراکنش تعهد خود را امضا کرده و برای دیگری می فرستند.

درک شبکه لایتنینگ، قسمت اول: ساخت کانال پرداخت دوطرفه بیتکوین

دوم: آلیس و باب اولین “رمز” خود را برای یکدیگر می فرستند.

در این مرحله، دوباره آلیس و باب می توانند تراکنش تعهد “نیمه معتبر” خود را که به تازگی دریافت کرده اند امضا و منتشر کنند. طرف مقابلشان به سرعت 5بیتکوین دریافت می کند و فرد منتشر کننده باید به اندازه 1000بلاک منتظر بماند. بدین ترتیب کانال آن ها بروزرسانی شد.

اما چه چیزی مانع باب برای انتشار تراکنش تعهد قبلی می شود؟ آن تراکنش تعهد باعث شد که او 6بیتکوین به جای 5بیتکوین دریافت کند.
چیزی که مانع وی می شود، اولین “رمز” یا “ارزش” اوست که حالا آن را به آلیس داده است.

باب دیگر نمی تواند به راحتی تراکنش تعهد قبلی را امضا و منتشر کند، چرا که حالا آلیس اولین “رمز” باب را داد. اگر باب چنین کاری کند، او سریعا 4بیتکوین برای آلیس فرستاده است و باید 1000بلاک منتظر بمانده تا 6بیتکوین خود را بگیرد. مشکل اینجاست که حالا که آلیس “رمز” باب را می داند، ایندفعه می تواند به باب نارو بزند و 6بیتکوین دیگر را نیز برای خود بردارد. از آنجایی که باب نیز “رمز” آلیس را دارد، همین اتفاقات و همین مراحل برای آلیس نیز صادق است.

این ها بدان معناست که هر دو طرف در یک کانال پرداخت، انگیزه کافی برای درست رفتار کردن را دارند؛ و البته تنها آخرین وضعیت کانال را امضا و منتشر خواهند کرد.

در ادامه، این تنظیمات کانال پرداخت دوطرفه باید گسترش یابد تا اجازه تراکنش ها در یک شبکه صادر شود.

انتظار می رود که شبکه لایتنینگ (Lightning Network) ، یکی از نوآوری های فناوری محوری باشد که بر روی بیتکوین اجرا شود. لایه پرداخت، تقریبا یک سال پیش توسط Joseph Poon و Tadge Dryja معرفی شد. این لایه پرداخت تضمین کرده که از بی نهایت تراکنش خارج از زنجیره یا همان off-chain که بین کاربران انجام می شود پشتیبانی کند؛ همچنین اطمینان داده در حالی که از امنیت ارائه شده توسط شبکه بیتکوین چیزی کم نشود، این تراکنش ها تقریبا بدون هزینه باشند.

به گزارش کوین ایران به نقل از مجله بیتکوین، در حال حاضر حداقل سه شرکت در حال کار بر روی پیاده سازی شبکه لایتنینگ هستند؛ شرکت هایی نظیر Lightning (متعلق به Poon  و Dryja)، Blockstream و Blockchain. اما غیر از این خط مقدم کوچک، تعداد کمی هستند که درک کرده اند چگونه “آینده ی پرداخت های خرد” می تواند قابلیت های بیتکوین را افزایش دهد.

حال می خواهیم ببینیم که اگر آلیس بخواهد به فرد سومی به نام کرول (Carol) یک بیتکوین پرداخت کند چه اتفاقی میافتد.

برای این کار، آلیس و کرول می توانند بین خودشان یک کانال پرداخت باز کنند. اما در واقع نیازی به این کار نیست چرا که باب و کارول یک کانال مشترک دارند (قبلا هم باب و آلیس کانالی مشترک درست کرده بودند)، در نتیجه آلیس می تواند از طریق باب برای کارول بیتکوین ارسال کند؛ آلیس می تواند یک بیتکوین به باب بدهد و باب آن یک بیتکوین را برای کرول بفرستد.

البته ممکن است آلیس به باب یا کرول اعتماد کامل نداشته باشد. مثلا می ترسد که اگر بیتکوین را به باب بدهد، باب آن را برای کرول نفرستد. یا حتی اگر باب بیتکوین را برای کرول بفرستد، این امکان وجود دارد که کرول ادعا کند که هیچ وقت بیتکوینی دریافت نکرده و در نهایت آلیس نمی فهمد که مقصر کدامشان است.

در نتیجه آلیس می خواهد مطمئن شود که تنها در صورتی به باب یک بیتکوین می دهد که باب هم یک بیتکوین به کرول بدهد. این امر را میتوان توسط یک روش رمزنگاری ساده اجرایی کرد.

مروری تا به اینجا

(تا به اینجا در بخش سازنده شماره 5 درباره “ارزش” یا “رمز” توضیح داده شد که برای یادآوری دوباره به توضیح مختصر آن می پردازیم: یک “ارزش” یا “رمز”، رشته ای طولانی و منحصر به فرد از اعداد است که حدس زدن آن حتی برای یک کامپیوتر، غیرممکن است. این “ارزش” (یا رمز) از طریق محاسباتی خاص، می تواند به رشته دیگری از اعداد تبدیل شود که به آن “هش” می گویند. نکته مهم: هر فردی که آن “ارزش” را بداند، می تواند هش را نیز بسازد؛ اما این برعکس این کار امکان پذیر نیست. در واقع یک مسیر یک طرفه است.)

ماجرا در یک نگاه بدین صورت خواهد شد: زمانی که آلیس می خواهد به کرول بیتکوین بفرستد، به او می گوید که یک “ارزش” بسازد و مقدار هش شده ی آن را برایش ارسال کند. آلیس به کرول می گوید که عدد واقعی “ارزش” را در ازای دریافت بیتکوین از باب، به باب بدهد.

جزئیات ماجرا بدین صورت است:

آلیس مقدار هش شده ی “ارزش” را از کرول می گیرد. سپس به باب می گوید که اگر به او مقدار متناظر با هشی که در دست دارد را بدهد ( یعنی همان “ارزشی” که فقط کارول آن را دارد)، او هم به باب یک بیتکوین می دهد. حالا باب به کرول یک بیتکوین می دهد و آن مقدار متناظری که آلیس از باب می خواست، یعنی “ارزش” را از کرول می گیرد.

حال باب به سراغ آلیس می رود و “ارزش” را به او می دهد. از این راه آلیس متوجه می شود که باب این مقدار را در ازای دادن بیتکوین به کرول گرفته است، پس یعنی کرول یک بیتکوین خود را گرفته است. حال آلیس با خیال راحت یک بیتکوین به باب می دهد. بدین صورت است که انگار یک بیتکوین از آلیس به کرول منتقل شده است و همه راضی هستند.

شبکه لایتنینگ (Lightning network)، قسمت دوم: درکی از این شبکه

البته “همه” هم راضی نیستند!

در این سناریو، باب که نقش واسطه را دارد باید به آلیس و کرول اعتماد کند. به کرول باید اعتماد کند چون شاید او بعد از دریافت یک بیتکوین خود از باب، دیگر “ارزش” را به باب ندهد. از طرف دیگر باید به آلیس اعتماد کند که پس از اینکه مقدار “ارزش” را به او داد، به او یک بیتکوینش را بدهد.

به همبن خاطر دادوستدها یا همان تریدهای مبتنی بر “بیتکوین در ازای ارزش” باید در شبکه تضمین شده باشند. یعنی اگر باب یک بیتکوین به کرول داد، باید به او تضمین داده شود که یک بیتکوین از آلیس پس می گیرد. اینجاست که HTLC که مخفف Hash Time-Locked Contracts است وارد کار می شوند. (HTLC به معنی قراردادهای قفل شده زمانی هش است)

قراردادهای قفل شده زمانی هش در شبکه لایتنینگ

خب حالا آلیس و باب می خواهند از طریق یک HTLC، بیتکوین و “ارزش” را با یکدیگر جابجا کنند. برای این کار، آلیس بجای ارسال مستقیم بیتکوین به باب، آن را به یک آدرس چند امضایی جدید می فرستد. بیتکوینی که در این آدرس قفل شده، از دو طریق می تواند آزاد شود.

اولین راه این است که باب از امضای خودش و “ارزش” استفاده کند.دومین راه هم این است که آلیس از امضای خودش استفاده کند. البته این روش، یک  CLTV-timelock دارد. یعنی آلیس بعد از مثلا دو هفته می تواند آن را امضا و در شبکه منتشر کند.

این یعنی باب دو هفته وقت دارد تا یک تراکنش متناظر بسازد که در آن امضای خود و “ارزش” را قرار داده و آن را منتشر کند تا بتواند بیتکوین را از آن آدرس چندامضایی برای خودش بفرستد. این دادوستد تضمین شده است. باب تنها زمانی می تواند بیتکوینی که آلیس در آن آدرس چند امضایی قرار داده را بردارد که “ارزش” را دست داشته باشد (یعنی از کرول گرفته باشد) و آن را در شبکه بیتکوین منتشر کند که آلیس بتواند ببیند.

حال اگر باب در مدت زمان مناسب، “ارزش” را بدست نیاورد، زمان محدود کننده برای آلیس (که دو هفته بود) سر می رسد و او می تواند بیتکوین خود را از آن آدرس چندامضایی پس بگیرد.

شبکه لایتنینگ (Lightning network)، قسمت دوم: درکی از این شبکه

به شبکه برگردیم، چرا که دلیل نیاز به HTLC به شبکه بر می گردد

نه تنها آلیس و باب، بلکه باب و کرول نیز یک HTLC ساختند. باب و کرول بدین دلیل HTLC  ساختند که اگر کرول بیتکوین را از باب گرفت، باب هم در مقابل بتواند “ارزش” را از وی بگیرد؛ این ارزش بر روی بلاکچین نمایان خواهد شد. به همین خاطر، اگر این اتفاق بیافتد، باب هم مطمئنا بیتکوین خود را از آلیس می گیرد. باب می تواند “ارزش” را که کرول روی بلاکچین گذاشته را بردارد، آن را در HTLC خود و آلیس قرار دهد و بیتکوینش را بگیرد. هر دو کانال به طور موئری با یکدیگر در ارتباط هستند.

این نکته را باید در نظر گرفت که باب باید “ارزش” را پیش از آنکه دسترسی آلیس به آدرس چندامضایی باز شود، بدست بیاورد. اگر باب “ارزش” را دیر از کرول بگیرد، بقول معروف سرش بی کلاه می ماند چون آلیس بیتکوین را از آن آدرس برداشته است. در نتیجه تاریخ انقضای مربوط به HTLC کرول و باب، باید زودتر از تاریخ انقضای HTLC باب و آلیس باشد.

شبکه لایتنینگ (Lightning network)، قسمت دوم: درکی از این شبکه

در آخر، یک مشکل دیگر مانده که باید حل شود: برای اینکه شبکه لایتنینگکارآمد باشد، تمام اینها باید “خارج از زنجیره” اتفاق بیافتند. اینکه چنین کاری چطور امکان پذیر است موضوعی است که در ادامه این مقاله به آن خواهیم پرداخت.

به گزارش کوین ایران به نقل از Bitcoin Magazine، در حال حاضر حداقل سه شرکت در حال کار بر روی پیاده سازی شبکه لایتنینگ هستند. اما غیر از این خط مقدم کوچک، تعداد کمی هستند که درک کرده اند چگونه “آینده ی پرداخت های خرد” می تواند قابلیت های بیت کوین را افزایش دهد.

شبکه لایتنینگ

تا اینجا آلیس و باب یک کانال پرداخت دو طرفه ایجاد کردند؛ هر کدام از آن ها مقدار 5 بیت کوین در این کانال قرار دادند. آن ها دو تراکنش را فرستادند و گرفتند؛ در حالت فعلی کانال، آلیس یا باب می توانند با فرستادن کانال روی بلاکچین، 5 بیت کوین خود را بگیرند.

حال آن ها می خواهند که یک HTLC به این کانال اضافه کننداین کار به منظور ایجاد اطمینان از آن است که اگر کرول بیت کوین را در ازای “ارزش” از باب بگیرد، باب هم می تواند از آلیس بیت کوین خود را بگیرد.

مانند مراحل قبل، آلیس و باب با ساختن یک تراکنش تعهد کار خود را شروع می کنند. این تراکنش های تعهد از جهات زیادی به تراکنش های تعهد قبلی شباهت دارد. این تراکنش ها شامل یک خروجی نرمال و یک خروجی به آدرسی چند امضایی که دارای قفل زمانی CSV است می شود؛ همچنین این تراکنش ها دارای یک قفل هش خاص هستند.  همانند مراحل قبل، آلیس و باب به تبادل مقدار قدیمی “ارزش” خود با یکدیگر می پردازند؛ آن ها این کار را به جهت نامعتبر ساختن کانال قبل انجام می دهند. به محض تبادل، هم آلیس و هم باب می توانند نیمه تراکنش تعهد خود را امضا کرده و آن را به بلاکچین بفرستند.

همه موارد به جز یک مورد آشنا هستند چرا که قبلا در مورد آن ها صحبت کردیم. تراکنش های تعهد آلیس و باب حالا شامل یک خروجی جدید می شود که یک بیت کوین ارزش دارد؛ این امر حساب را 5-4-1 می کند؛ یعنی 4 بیت کوین برای آلیس، 5 عدد برای باب و یکی هم برای خروجی جدید.

این خروجی جدید در واقع HTLC است و سه راه هم برای قفل گشایی آن وجود دارد.

راه های قفل گشایی این HTLC

اول آنکه این خروجی جدید (در تراکنش های تعهد آلیس و باب)، در صورتی بیت کوین را آزاد می کند که امضای باب و “ارزش” در تراکنش بعدی آن وجود داشته باشد. از این رو، مهم نیست که آیا آلیس یا باب تراکنش تعهد را امضا و منتشر کرده باشند؛ چراکه تنها باب می تواند قفل این خروجی را باز کند و البته در صورتی که “ارزش” را داشته باشد. اما یک تفاوت کوچک بین دو تراکنش تعهد وجود دارد؛ اگر باب کانال را بفرستد، یک قفل زمانی CSV درگیر بازی است. در نتیجه او مجبور است تا به اندازه 1000 بلاک منتظر بماند. (اگر آلیس کانال را بفرستد، باب می تواند سریعا این بیت کوین را بگیرد).

دلیلی که باب باید 1000 بلاک منتظر بماند به چیزی که قبلا شاهد آن بودیم شباهت دارد؛ این کار به آلیس اجازه می دهد تا در صورت تلاش باب برای امضا و انتشار حالت کانال قبلی، این بیت کوین را بگیرد. اینجا جایی ست که دومین راه قفل گشایی این بیت کوین ظاهر می شود. آلیس می تواند در صورت ارائه “ارزش” جدید به باب، سرمایه را “بدزدد”.

فرض کنیم آلیس سعی در تقلب و انتشار این کانال بعد از منقضی شدن آن داشته باشد؛ در اینصورت باب می تواند این بیت کوین را با استفاده از “ارزش” آلیس، از آن خود کند.

سوم آنکه همانند تمام HTLC ها، هر دو تراکنش تعهد شامل تامر زمانی CLTV برای بازگشت به آلیس هم می شود؛ فرض کنیم باب برای مثال تا دو هفته “ارزش” را ارائه نکند (شاید مثلا نتوانسته آن را از کارول بگیرد)؛ در اینصورت آلیس می تواند بیت کوین های خود را پس بگیرد. برای این مورد اگر آلیس یا باب کانال را بفرستند، اهمیتی ندارد.

با تمام این موارد به کجا می رسیم؟

شبکه لایتنینگ (Lightning network) قسمت سوم: تکمیل کار

باب و آلیس هر دو یک تراکنش تعهد نیمه معتبر دارند. اگر آلیس تراکنش تعهد خود را به بلاکچین بفرستد، سریعا 5 بیت کوین برای باب می فرستد. علاوه بر این، او می تواند به مدت 1000 بلاک منتظر بماند و  4 بیت کوین برای خود بگیرد. در ادامه، باب دو هفته زمان دارد تا “ارزش” را ارائه کند و بیت کوین موجود در “خروجی HTLC” را بگیرد. (اگر طی دو هفته این کار را نکند، آلیس می تواند این بیت کوین را بگیرد).

در این میان باب می تواند تراکنش تعهد خود را هر وقت خواست منتشر کند و 4 بیت کوین برای آلیس بفرستد. سپس باید 1000 بلاک منتظر بماند تا 5 بیت کوین دیگر از یک آدرس، و یک بیت کوین دیگر از خروجی HTLC بگیرد. (آن یک بیت کوین را در صورت ارائه “ارزش” می تواند بگیرد؛ اگر زی دو هفته این کار را نکند، آلیس آن را می گیرد).

اگر آلیس یا باب سعی کنند در آینده تقلبی کنند و این کانال که منقضی شده را امضا و منتشر کنند، هر دو می توانند دیگری را بلاک کرده و تمام بیت کوین ها کامال را بدزدند.

تنظیم وضعیت

در این نقطه از کار، برای باب اطمینان حاصل شده که در ازای ارائه “ارزش”، بیت کوین خود را می گیرد. تمام کاری که او باید انجام دهد، امضا و انتشار تراکنش تعهدی است که از آلیس گرفته؛ البته باید “ارزش” را در تراکنش متعاقب جای داده و آن را نیز امضا و منتشر کند.

آلیس این را می داند، پس راهی برای آنکه بر سر باب کلاه بگذارد وجود ندارد. به همین منظور، هر دوی این افراد تنها می توانند خارج از کانال به توافق برسند؛ باب می تواند “ارزش” را به آلیس دهد؛ و آلیس توافق کند که وضعیت کانال را به حالت نرمالی که HTLC و زمان پایان مشخص نداشته باشد بروزرسانی کند.

فرض کنیم هر دوی این افراد بخواهند کانال را باز نگه دارند؛ این کار دردسر کمتری نسبت به انتشار کانال بر روی بلاکچین دارد.

شبکه لایتنینگ (Lightning network) قسمت سوم: تکمیل کار

 بستن کانال در لایتنینگ

قدرت واقعی شبکه لایتنینگ اینجاست؛ تقریبا تمام مواردی که در این سه مقاله توضیح داده شد، هیچ وقت نیازی به استفاده از بلاکچین بیت کوین ندارند.

اگر آلیس و باب بخواهند کانال را بصورت “صلح آمیز” ببندند، می توانند به سادگی یک تراکنش از تراکنش بازگشایی اصلی بسازند تا همه چیز را از زمان تراکنش بازگشایی از بین ببرد. از این “تراکنش بستن”، هر کدام سهم خود از این کانال را با توجه به آخرین وضعیت کانال بر میدارد.

شبکه لایتنینگ (Lightning network) قسمت سوم: تکمیل کار

مشخصا این بدان معناست که اگر آلیس بخواهد کانال را ببندد، می تواند در این مرحله به راحتی یک تراکنش برای پرداخت به خود بسازد؛ و در ادامه به خودش 4 بیت کوین به به باب 6 بیت کوین بدهد. از باب هم بخواهد که تراکنش را امضا و منتشر کند. از آنجایی که هیچ دلیلی برای باب جهت عدم انجام این کار وجود ندارد، او نیز همکاری کرده و کانال بسته می شود.

در آخر، تنها دو تراکنش در شبکه بیت کوین منتشر شده و در بلاک قرار گرفته است؛ تراکنش بازگشایی و تراکنش بستن. اگر آلیس و باب میلیون ها تراکنش هم انجام دهند، این موضوع باز هم صادق خواهد بود.

یکی از دلایل اهمیت شبکه لایتنینگ همین است؛ که باعث کاسته شدن تعداد بسیار زیادی از تراکنش ها بر روی بلاکچین بیت کوین می شود.