تراکنش اتمیک فرایندی است که تنها در صورت برآورده شدن یک سری از الزامات اجرا میشود و در صورتی که یکی از الزامات برآورده نشود، به حالت پیشین خود باز میگردد. در مطلب پیش رو که ترجمهای از بلاگ Comit Network است، نحوه انجام تراکنش Atomic بدون نیاز به اعتماد، بین دو شبکه بیت کوین و مونرو را توضیح خواهیم داد. برای یافتن توضیحات بیشتر در خصوص مبادلات اتمی، مطلب زیر را مطالعه فرمایید:
نحوه انجام تراکنش اتمیک بین بیت کوین و مونرو
در تلاش برای اتصال تمامی بلاک چینها بدون اضافه کردن شبکهای دیگر، این بار تلاشمان را معطوف به شبکه مونرو کردیم. مونرو دفتر کلی عمومی است که مبدا، مقصد و مقدار تراکنش از دید نظارهگران پنهان است.
تیم ما مدتها به مونرو علاقهمند بود لیکن تا گذشتهای نزدیک، انجام تراکنش اتمیک را ممکن نمیدانستیم چرا که مونرو از قفلهای زمانی (توابع Hashed Timelock شبکه بیت کوین) پشتیبانی نمیکند. اما پس از ارائه مقاله جوئل گاگر (Joel Gugger) در کنفرانس 36C3، دریافتیم که انجام این تراکنش با استفاده از قفلهای زمانی تنها در یکی از شبکهها نیز میسر است. با این حال مونرو همچنان چالشانگیز بود:
مونرو فاقد زبان اسکریپت نویسی است که بدین معنی است که فرایند مرسوم قفلهای هش شده قابل اجرا نیستند. همچنین این شبکه از خمهای بیضوی edward25519 در تولید کلیدهای عمومی و خصوصی خود استفاده میکند که قابلیت ما را در استفاده از امضاهای آداپتور (نوعی از امضا ناقص است که در صورت تکمیل، اطلاعات جالبی را به طرف مقابل میدهد. میتوان کلید رمزنگاری را به شکل یک بار مصرف توسط این امضا به دست آورد) در حین کار با شبکههایی همچون اتریوم و بیت کوین که از نوع متفاوتی از خمهای بیضوی استفاده میکنند، محدود میکند.
حل چالش اول نیاز به طراحی دوباره مونرو دارد اما چالش دوم را میتوان با روشی هوشمندانه در رمزنگاری آن حل کرد.
فرآیند ایجاد پروتکل
در ابتدا، تصمیم به پیادهسازی پروتکل پیشنهادی جوئل گرفتیم اما سپس فرصتی برای ساده کردن آن یافتیم و نوعی دیگر از آن را طراحی کردیم که در آن تعداد تراکنشها در شبکه بیت کوین یکی کمتر میشد. خوشبختانه جوئل و تیمش با مطالعه و بررسی طراحی ما، ایراد آن را متذکر شدند. در طراحی ما در برخی حالات، به دلیل عدم قطعیت نهایی تراکنشها در بیت کوین (و بسیاری دیگر از شبکهها)، مسابقهای برای انجام تراکنش یا بازگشت آن به مبدا در میگرفت.
در نهایت روش پیادهسازی ما شباهت بسیاری به پیشنهاد اولیه جوئل داشت. تنها چند تفاوت در میان بود:
- کیف پول چند امضایی (۲ از ۲) برای تراکنشهای بیت کوین
- قفلهای زمانی در سطح تراکنش
- رویکردی متفاوت به گواه اثبات برابری لگاریتم گسسته (Discrete Log Equality) احتیاج بود تا بتوان اطمینان حاصل کرد که کلیدهای صحیحی در هنگام دریافت یا برگشت خوردن بیت کوین آشکار شده است
مفروضات این پروتکل
- وقتی از کلیدهای مخفی صحبت میکنیم از x (کوچک) استفاده میکنیم و هنگامی که از کلید عمومی حرف میزنیم از X (بزرگ) استفاده میکنیم.
- آلیس صاحب رمز ارز مونرو است و قصد دارد آن را با بیت کوین معاوضه کند. باب سمت مقابله معامله است که بیت کوین در اختیار دارد و مونرو میخواهد.
- فرض میکنیم که آلیس و باب چند ویژگی را قبل از استفاده پروتکل، بین خود مشخص کردهاند: مقادیر معامله و زمان دو قفل زمانی به کار رفته در تراکنشهای بیت کوین (t_1 و t_2 که t_2>t_1)
انجام تراکنش Atomic بین شبکه بیت کوین و مونرو
پروتکل به طور ساده به شکل زیر کار میکند:
- آلیس و باب آدرسها، کلیدها و گواه اثبات دانش صفر و امضاها را مبادله میکنند.
- باب تراکنش Tx_lock (یک تراکنش با شرط زمانی) را به شبکه میفرستد و بیت کوینهایش را با یک خروجی دو امضایی (با امضای خودش و آلیس) به آدرس آلیس میفرستد. از آنجا که در قدم قبلی، برخی اطلاعات رد و بدل شد. باب میتواند پس از گذشت زمان t_1 با فرستادن تراکنش Tx_cancel و Tx_refund تراکنش را لغو و به حساب خود بفرستد. اگر باب پس از زمان t_1 این کار را نکند، آلیس میتواند باب را به خاطر عدم اجرای توافقشان، تنبیه کند. او ابتدا تراکنش Tx_cancel را به شبکه میفرستد و سپس پس از گذشت زمان t_2 خروجی را با تراکنش Tx_punish (تراکنش تنبیه) خرج میکند.
- آلیس مشاهده میکند که باب بیت کوینهایش را قفل کرده، بنابراین او نیز تراکنش Tx_lock را در شبکه مونرو منتشر میکند و مونروهایش را در خروجی که تنها میتوان با داشتن کلید پنهان خودش (s_a) و کلید پنهان باب (s_b) آن را خرج کرد، قفل میکند. این بدین معنی است که هیچ یک از آنها عملا نمیتواند این مونرو را خرج کند مگر آن که از کلید پنهان طرف دیگر باخبر شود.
- باب میبیند که آلیس قدم قبلی را انجام داده است، بنابراین او برای آلیس بخشی از اطلاعات را میفرستد که به آلیس اجازه میدهد تا بیت کوینها را با استفاده از تراکنش Tx_redeem دریافت کند.
- آلیس از این اطلاعات برای فرستادن بیت کوین به آدرس خودش استفاده میکند. با این عمل، بخشی از کلید پنهان (Secret Key) s_a او درز پیدا میکند. این جاست که جادوی امضای آداپتور به میان میآید.
- باب تراکنش Tx_redeem را روی شبکه بیت کوین میبیند، کلید پنهان آلیس را استخراج میکند و با کلید خود ترکیب میکند تا بتواند مونرو را به آدرس خود بفرستد.
این تبادل اتمیک چگونه انجام میشود؟
آنچه در بالا اشاره شد، تمام کاری است که باب و آلیس برای انجام این تبادل باید انجام دهند. برای درک بهتر فرآیند تراکنش اتمیک میان شبکه مونرو و بیت کوین، به شرح این فرآیند میپردازیم.
تبادل آدرسها
آلیس و باب از کیف پولهای بیت کوین خود آدرس را دریافت میکنند: address_a و address_b. این آدرسها مقصد تراکنشهایی خواهد بود که ارسال خواهد شد. آنها این آدرس را با دیگری به اشتراک میگذارند.
تبادل کلید
دو طرف کلید پنهان بیت کوین را استخراج میکنند: a و b. اینها کلیدهایی هستند که وقتی با یکدیگر ترکیب شوند، میتوانند تراکنش قفل شده باب را خرج کنند. آنها کلیدهای عمومی متناظر با آن را با یکدیگر به اشتراک میگذارند: A و B.
سپس هر یک دو کلید پنهان مونرو تولید میکند: (s_a و v_a) و (s_b و v_b). که کلید s برای خرج کردن لازم است و کلید v برای مشاهده جزییات تراکنش. آلیس در ادامه مونروی خود را در با استفاده از کلید عمومی (S_a + S_b، V_a + V_b) قفل میکند.
برای آن که دو طرف بتوانند خروجی را مشاهده کنند، کلیدهای پنهان v_a و v_b با یکدیگر به اشتراک گذاشته میشود. سپس کلیدهای عمومی خرج کردن S_a و S_b را به یکدیگر میدهند.
تنها کسی که به هر دو کلید پنهان s_a + s_b دسترسی داشته باشد میتواند تراکنش مشترک را خرج کند.
سازگاری بین secp256k و edward25519
همانطور که پیشتر اشاره کردیم، بیت کوین و مونرو از خمهای بیضوی متفاوتی برای تولید کلیدها استفاده میکنند. در نتیجه، یک جفت کلید (کلید عمومی و خصوصی) در یک شبکه، عموما در شبکه دیگر موجود نیست. این بدین معنی است که اگر ما کلید پنهان x را با استفاده از امضاهای آداپتور از کلید عمومی X در یک شبکه بیرون بکشیم و منتشر کنیم، نخواهیم توانست کلید پنهان متناظر با کلید عمومی Y را در شبکه دیگر پیدا کنیم که آن را بیاستفاده میکند.
اما چه اتفاقی میافتد بی آن که بخواهیم مقادیر کلید پنهان x را افشا کنیم، به طرف مقابل ثابت کنیم که X و Y دارای یک کلید پنهان (x) مشترک هستند؟ پروتکل جوئل ما را از این امکان مطلع کرد. در پیشنهاد او، گواه اثباتی معرفی شده است که توسط سرنگ نوتر (Sarang Noether) در این مقاله فنی توضیح داده شده است.
اضافه کردن چنین گواهی به امضای آداپتور میتواند این نکته را ثابت کند که افشای کلید پنهان در یک شبکه، معنایی قابل پیشبینی در شبکه دیگر دارد؛ به معنی افشای کلید خصوصی یک کلید عمومی از پیش دانسته است.
الگوریتم اثبات دانش
با اطلاعاتی که تا کنون بین طرفین رد و بدل شده است، باب همچنان نمیتواند امضای آداپتوری بسازد که در هنگام رمزگشایی و استفاده توسط آلیس، به باب کلید پنهان s_a را بدهد. چون همانطور که اشاره شد، هیچ تناظری بین S_a در مونرو و کلید عمومی S_a در شبکه بیت کوین وجود ندارد که بتوان با استفاده از کلید خصوصی s_a در بیت کوین آن را استخراج کرد.
اما طبق چیزی که در قسمت قبل گفتیم، اگر آلیس کلید عمومی بیت کوین S_a را از s_a تولید کند و گواه اثبات دانش صفری بسازد که نشان دهد کلید پنهان S_a در بیت کوین و S_a در مونرو هر دو یکی هستند و این اطلاعات را با باب به اشتراک بگذارد، آنگاه باب میتواند امضای آداپتوری بر روی S_a در بیت کوین تولید کند که وقتی رمزگشایی شود و توسط آلیس استفاده شود، به او s_a را خواهد داد. این کلید پنهان وقتی با s_b ترکیب شود، قابلیت خرج کردن تراکنش مونرو را خواهد داشت.
پس آلیس این کار را انجام میدهد و باب نیز کاری مشابه با کلید خرج کردن خودش (در شبکه مونرو) s_b انجام می دهد تا اگر به هر دلیلی او تراکنش بیت کوینی خود را برگشت زد، به آلیس اجازه دهد تا مونروی خود را بازگرداند. او کلید عمومی بیت کوینی S_b را ایجاد میکند تا در کنار کلید عمومی مونرویش (که پیشتر برای آلیس فرستاده بود) گواه اثبات با دانش صفری را تشکیل دهد که ثابت میکند هر دو به نحوی به یک کلید پنهان s_b مرتبط هستند.
شاید بدیهی به نظر برسد، اما هر دو طرف باید از صحت گواه ارائه شده توسط طرف مقابل مطمئن شوند و آن را بررسی کنند.
اگر اوضاع خوب پیش نرود چه رخ خواهد داد؟
اگر دو طرف به تعهدات خود عمل کنند، نیازی به استفاده از تراکنشهای تنبیهی و بازگشتی نخواهد بود، اما اگر این اعتماد وجود داشت، نیازی به تراکنش اتمیک نبود. در جهان واقعی، احتیاج به مکانیزمی برای تشویق انجام مبادله، به محض اینکه باب بیت کوینهایش را بر روی شبکه ارسال کرد داریم. همچنین فرایندی برای اطمینان حاصل کردن از اینکه هر دو طرف فرصت کافی برای لغو تراکنش و بازگشت زدن موجودی خود در اختیار دارند.
آلیس و باب هر دو تراکنش لغو Tx_cancel را امضا میکنند؛ تراکنشی که اگر منتشر شود موجب انتقال بیت کوین قفل شده در تراکنش Tx_lock به خروجی دیگری با همان شرایط خرج کردن قبلی و دو امضایی (A,B) میشود. آنها این تراکنش را به نحوی ایجاد میکنند که پس از گذشت زمان t_1 قابل اجرا باشد. این تراکنش توسط هر یک از طرفین میتواند به عنوان مکانیزمی برای ناممکن کردن دریافت برای طرف دیگر ایجاد شود و پروتکل را در حالتی قفل کند که تنها گزینههای تنبیه و بازگشت ممکن باشد.
آلیس امضای آداپتوری بر روی تراکنش بازگشت (Tx_refund) گذاشته و آن را با باب به اشتراک میگذارد. این امضا به باب اجازه میدهد تا تراکنش لغو (Tx_cancel) را اجرا کند و موجودی را به آدرس خودش بازگرداند. آلیس این مساله را به شکلی میسازد که اگر باب تصمیم به لغو تراکنش زند، باید به وسیله کلید خصوصی مونرویش (s_b) این کار را انجام دهد و آن را در هنگام انتشار در بلاکچین افشا کند. بدین وسیله آلیس نیز میتواند تراکنش مونرو خود را لغو کند. این تراکنش احتیاجی به قفل زمانی ندارد چرا که وابسته به تراکنش Tx_cancel است که خود دارای قفل زمانی (>t_1) است.
باب تراکنش تنبیه (Tx_punish) را به مقصد آدرس آلیس address_a امضا میکند اما آن را به نحوی قفل میکند تا پس از زمان t_2 قابل اجرا باشد (برای آن قفل زمانی تعریف میکند). باب این تراکنش را با آلیس به اشتراک میگذارد تا به او اجازه دهد که در صورت غیرفعال بودن او پس از گذشت t_2 آن را خرج کند. این تراکنش برای این وجود دارد تا از حالتی که هر دو طرف موجودی خود را قفل کردهاند اما باب به هر دلیلی از افشای امضای آداپتور لازم خودداری میکند یا آن را لغو نمیکند، جلوگیری شود. بدون این تراکنش، آلیس ممکن است به شکلی غیرمنصفانه به دلیل در دسترس نبودن باب تنبیه شود و موجودیاش بیدلیل تا زمانی نامعلوم قفل شود. با این تراکنش، آلیس میتواند در صورت عدم همکاری باب، پس از گذشت زمان لازم، بیت کوین باب را خرج کند.
ارسال به شبکه
با امضای تراکنش لغو توسط آلیس و امضای رمزنگاری شده تراکنش بازگشت، باب حالا میتواند به شکلی امن بیت کوین خود را در تراکنش قفلی که پیشتر طراحی شده بود، قفل سازد. چرا که در صورت عدم همکاری آلیس، حالا میتواند بیت کوینهای خود را بازگرداند.
برای انجام این کار، او توسط کیف پول خود تراکنش قفل را امضا و به شبکه ارسال میکند. آلیس در نهایت اضافه شدن این تراکنش به بلوک شبکه را مشاهده خواهد کرد. او ممکن است برای اطمینان چند بلوک برای تایید بیشتر، صبر کند.
آلیس حالا میتواند مونرو خود را قفل کند چرا که مطمئن است که در صورت لغو تراکنش توسط باب، میتواند آن را بازگرداند و اگر باب پاسخگو نباشد، میتواند به بیتکوینها برسد. آلیس با استفاده از والت مونرو خود، مقدار مونرو توافقی را به خروجی منتقل میکند (S_a + S_b، V_a + V_b). از آن جا که باب از پارامترهای مشخص شده مطلع است (به علاوه v_a و v_b)، میتواند تراکنش را مشاهده کند. در صورت تایید مقدار و گذر چند بلوک برای اطمینان، او میتواند روند انتقال را ادامه دهد.
امضای آخر
شرایط حاضر به طرفین اجازه میدهد بدون همکاری طرف مقابل، تراکنش را لغو کنند. حالا باب میتواند به شکلی مطمئن امضای آداپتور خود را با آلیس به اشتراک بگذارد. امضایی که شامل کلید پنهان بیت کوین او (b)، رمزنگاری شده با کلید عمومی آلیس در شبکه بیت کوین در تراکنش دریافت (Tx_redeem) است. تراکنشی که به مقصد آدرس آلیس است.
آلیس حالا میتواند با استفاده از این امضای آداپتور، آن را بدل به امضایی صحیح بر روی آدرس عمومی باب کند که در ترکیب با امضای خود، به او اجازه خرج کردن تراکنش دریافت را میدهد. باب سپس باید شبکه بیت کوین را زیر نظر بگیرد تا تراکنش دریافت را رصد کند و از کلید پنهان خرج کردن آلیس در شبکه مونرو (s_b) مطلع شود. این افشا به مدد قدرت امضای آداپتور ممکن شده است.
با در اختیار داشتن s_a و s_b باب اکنون تنها مالک خروجی مونرو است. او حتی احتیاجی به انتقال مونرو به آدرس شخصی خود ندارد.
جمعبندی
روش ذکر شده، تلاشی برای مبادله اتمیک بین شبکههای بیت کوین و مونرو بود که توسط پروژه Comit Network