به نظر میرسه ممکنه به زودی ویژگی جدیدی به پروتکل بیتکوین اضافه بشه که هم حریم خصوصی بیشتری به شبکه اضافه میکنه و هم مقیاسپذیری شبکه رو بالاتر میبره. تخمین زده میشه که تپروت 30 تا 75 درصد از هزینهی کارمزد شبکه کم کنه و سرعت رو هم تا 2.5 برابر افزایش بده. در نتیجه لازم هست که راجعبهش بدونیم.
تپروت (Taproot) از لحاظ لغوی به معنی ریشهی اصلی گیاه است. در این مقاله میخوایم بررسی کنیم که این ریشهی اصلی در شبکه بیتکوین چیه و اعمال اون چطور میتونه به بهتر شدن شبکه کمک کنه. برای اینکه بتونیم این سیستم رو درک کنیم نیاز داریم تا راجعبه اصطلاحات زیر بدونیم:
- P2PK و P2PSH
- Script
- P2SH
- MAST
- Schnorr
بیاین از ظاهر یک تراکنش شروع کنیم و بعد کمکم وارد جزییات اون بشیم. در یک تراکنش اولین چیزی که میبینیم، آدرسهای بیتکوینی هستند. پس اول آدرسها رو بررسی کنیم.
P2PK و P2PSH
ما توی شبکهی بیتکوین هویتهای نیمهناشناس داریم؛ یعنی کیف پول هر شخص با یک سری عدد و حروف مشخص میشه؛ و مشاهدهکننده میتونه ببینه که کیف پول X به کیف پول Y، مقدار Z بیتکوین منتقل کرده؛ اما این کار، بدون دونستن اینکه X و Y چه کسانی هستند انجام میگیره. مثل آدرس زیر:
(13avfVx5LwRNkytEa5JwQGuEyChufaXe1g (1
اگر این آدرس رو در شبکه سرچ کنین، ورودی، خروجی و مقدار رو میبینید.
این آدرس درواقع کلید عمومی ای است که از تابع هش عبور کرده و بهاصطلاح هش شده؛ ومیتونه پذیرنده یا فرستنده پول باشه و برای همه قابل دسترس و مشاهده است.
در ابتدا آدرسها به این شکل نبودن و از خودِ کلید عمومی به عنوان آدرس استفاده میشد. مثلن:
(f4184fc596403b9d638783cf57adfe4c75c605f6356fbc91338530e9831e9e16 (2
کلید عمومی بالا (2) مربوط به اولین تراکنش بیتکوین تو سال 2009 است؛ توی این تراکنش، ساتوشی ناکاموتو تو بلوک 170 ، 50 بیتکوین به آدرس کلید عمومی Hal Finney فرستاده. اما همونطوری که امروزه میبینیم (1) آدرسها به یک رشتهی کوتاهتر تبدیل میشن.
وقتی پرداخت به این رشتهی طولانی از اعداد و حروف، یعنی کلید عمومی، انجام بگیره میگیم Pay To Public Key یا P2PK که اختصار پرداخت به کلید عمومی است. اما اگر پرداخت به هش این کلید عمومی باشه، میگیم Pay To Public Key Hash یا P2PKH ینی به Hash این کلید عمومی پرداخت شده.
مثال از یک تراکنش به هش کلید عمومی یا P2PKH:
(a1075db55d416d3ca199f55b6084e2115b9345e16c5cf302fc80e9d5fbf5d48d (3
چرا کلید عمومی رو هش کنیم؟
جواب این سوال رو باید از ساتوشی بپرسیم. اما ممکن است برای سهولت اشتراکگذاری کلیدهای عمومی باشه. هش کردن کلید عمومی و بعد استفاده از Base58 باعث کوچکتر شدن رشته میشه.
اسکریپت (Script)
در چه شرایطی شما میتونین بیتکوینتون رو خرج کنین؟
در رایجترین حالت، شما فقط به یک شرط میتونین بیتکوینهاتون رو خرج کنید: داشتن کلید خصوصی.
درست مثل زمانی که شما برای باز کردن گاوصندوق به کلیدتون نیاز دارید، باز کردن قفل بیتکوینهای محصورشده در تراکنش هم ملزم به داشتن کلیدست.
اسکریپت در شبکهی بیتکوین همون چیزیه که این شرایط رو مشخص میکنه. مثلن میگه “اگر” کلید خصوصی با کلید عمومی همخوانی داشت، شما اجازه انتقال پولهاتون رو دارید.
تقریبن تمامی شرایطی (یا اسکریپتهایی) که امروزه روی بلاک چین میبینیم رو میشه در 3 حالت خلاصه کرد:
- کلید خصوصی (یا امضا) تراکنش به عنوان اثبات مالکیت ارائه بشه.
- یک مدت زمان خاصی از اون تراکنش گذشته باشه (کوینها میتونن بعد از یک زمان مشخص و یا تعداد تصدیقهای معین خرج بشن.)
- تراکنشها چند امضایی یا multisig باشن (برای انتقال پول نیاز به تعدادی امضا باشه)
این حالات یک نوع قرارداد محسوب میشن. قراردادی که به زبان برنامهنویسی اسکریپت نوشته شده. البته میشه به این قراردادهای هوشمند یک سری پیچیدگی هم اضافه کرد. (بله؛ بیتکوین قرارداد هوشمند داره که هر روزه در شبکه استفاده میشه:) )
پیچیدگی مثل موارد زیر:
- پول رو بفرست اگر هم J و هم Z اون رو امضا کنن.
- اگر J به تنهایی بعد از یک هفته تراکنش رو امضا کرد.
- اگر Z امضا کنه و یک عدد مخفی رو هم به همراهش وارد کنه
- و غیره
هر کدوم از این شرایط که اتفاق بیفته، قفل بیتکوینهای قفلشدهی شما در تراکنش باز میشه و پولها قابل انتقال هستن.
“پس به طور کلی، اسکریپت چند خط کد جمعوجور و کوچک است که میتونه در هر تراکنش جا بگیره و با بررسی برآورده شدن شرایط انتقال پول، به عنوان یک سیستم تصدیقکننده عمل کنه. اسکریپت در بستر بلاک چین یعنی شرایط خرج بیتکوین.“
اگر علاقه دارید از زبان اسکریپت نمونه و کاربرد دیگهای ببینید از اینجا بخونید.
[لینک بالا مربوط به زبان بش اسکریپت هست. (با تشکر از محمد عزیز برای تصحیح)]
و توجه داشته باشین که در شبکه بیتکوین اسکریپت یک سیستم صحتسنجیست و زبان برنامهنویسی اصلی شبکه نیست.
حالا که میدونیم اسکریپت چیه، میتونیم از هش اسکریپت صحبت کنیم.
P2SH یا Pay To Script Hash
گاهی ما اسکریپتی داریم که در اون چندین شرط از مواقعی که میشه پول رو خرج کرد بیان شده و حالات پیچیدهتری رو در برمیگیره. برای مثال تراکنشهای چندامضایی با شروط زمانی. فرمت P2SH یا پرداخت به هش اسکریپت در سال 2012 پیشنهاد شد تا تراکنشهای پیچیدهتر رو مقدور کنه. پرداخت به هش اسکریپت یعنی شما بیتکوینهاتون رو به هش یک اسکریپت وصل میکنین و فقط زمانی که میخواهید خرجش کنین، اسکریپت اصلی رو برای باز کردن قفل بیتکوینها ارائه میدین.
حالا کوینهای موجود در این آدرس به چه شکل قابل خرج شدن است؟
صاحب (صاحبان) این کوینها، میاد کل اسکریپت یا شرایط رو همراه با راهحلهاش (ینی حالاتی که امکان خرج پول هست) نشون میده. افراد شبکه هش اولیه رو با اسکریپت ارائهشده مقایسه میکنن که ببینن آیا چیزی که این فرد ارائه کرده جزو شرایط خرج کوین هست یا خیر. اگر مورد ارائهشده در بین شروط وجود داشت، تراکنش فرد رو تصدیق میکنن. اگر هم نه که رد میشه. [ این ویژگی مربوط به کریپتوگرافی است که هش یک چیز همیشه ثابت و غیرقابل تغییره؛ پس امکان صحت سنجی رو به افراد میده.]
این سناریو یک مشکل اساسی داره.
شما باید کل شرایط (اسکریپت) رو ارائه بدی تا افراد شبکه مقایسه انجام بدن. در حالی که ارائهی فقط یکی از اون شروط (مثلن 2 نفر از 3 نفر امضا کنن) نیاز بوده.
با ارائهی اطلاعات اضافی:
- حجم دادهها سنگینتر میشه > چیزی که مشکل مقیاسپذیری رو ایجاد میکنه
- حریم خصوصی پایین میاد > این موارد میتونن اطلاعاتی مثل نوع کیف پول شما و اطلاعات جانبی زیادی رو در اختیار بیننده قرار بدن.
پس باید به نحوی از نشت این اطلاعات جلوگیری کنیم. همینجاست که MAST وارد میشود!
MAST یا Merkelized Abstract Syntax Tree
از اسم طولانیش نترسین؛ سادهست. ولی اول یه دورهی سریع بر وقایع تا به الان بکنیم.
تا قبل از سال 2012، اسکریپت تراکنشها مشخص بود. اما این مساله باعث افشای اطلاعات بیش از مقدار مورد نیاز میشد و همینطور فضا اشغال میکرد. برای حل این مشل، دادهها رو هش کردند تا امنیت و حریم خصوصی ارتقا پیدا کنه. اما موقع انتقال بیتکوین و خرجش، لازم بود که همهی اطلاعات به شکل عمومی نمایش داده بشه تا افراد شبکه صحتسنجی انجام بدهند. پس اگر چه اطلاعات هش شده بود اما با اقدام به خرج کردن پول، تمامی اطلاعات نشت میکرد.
پروتوکل MAST که در BIP114 مطرح شد، راهحلی برای این مشکل ارائه داده.
این روش میگه خب بیایم هر کدوم از شرایط رو که میتونن کوین رو خرج کنن یک بار به تنهایی هش کنیم و در ساختاری ، به اسم مرکل، قرار بدیم که از اون فقط یک هش بیاد بیرون که بهش ریشهی مرکل میگیم. پس ما همهی اسکریپتها (شرایط) رو برداشتیم، دونه دونه هش کردیم، در درخت مرکل قرار دادیم و الان یک هش نهایی خارج شده داریم (هشِ هش اسکریپتها!)
[درخت مرکل یه ساختار نگهداری دادهست که به افتخار ایجادکنندهاش مرکل نامگذاری شده.]
فایدهی خاص MAST چیه؟
فایدهی خاص MAST در اینست که هر کدوم از دادهها مستقل هستن و به منظور صحتسنجی، نیاز به افشای کل دادهها نیست. پس یعنی برای verify کردن اینکه آیا داده در ریشه مرکل بوده یا نه، فقط به ریشه و مسیرهای مرکل نیازه؛ و دادههای دیگر، مخفی باقی میمونه.
اما بازم یه مشکلی وجود داره: تراکنشهای MAST و همینطور چندامضاییها مثل گاو پیشونی سفید متمایزند! یعنی در بین تراکنشها اونقدری مشخصاند که نمیشه ادعا کرد حریم خصوصی دارند. راهحل در این مورد، امضای اشنور است.
امضای اشنور (Schnorr Signature)
خب تبریک میگم که تا به اینجای مقاله رسیدین :)
دووم بیارین! این آخرین ابزاری است که نیاز داریم تا بتونیم تپروپ رو بسازیم.
اشنور که به افتخار Claus Schnorr نامگذاری شده، میتونه کاری کنه که تراکنشهای MAST از سایر تراکنشهای استاندارد و معمول قابل تشخیص نباشند. این نوع امضا که از قدیمالایام در دسترس بوده، اخیرن مورد توجه دولوپرهای بیتکوین است و سعی میکنن که در یک سافتفورک اون رو به شبکه اضافه کنن.
اشنور دو تا ویژگی جالب داره:
Threshold کردن: یعنی تلفیق چند امضا.
اشنور میتونه امکان جمعآوری امضاها و خروج فقط یک امضا رو مهیا کنه. برای مثال کلید خصوصی 1 و 2 و 3 و 4 میتونند از معادلهی خطی اشنور بگذرند و تبدیل به یک کلید خصوصی بشن. از طرفی، کلید عمومی 1 تا 4 هم با هم تلفیق بشن و یک کلید عمومی رو بسازن. کلید خصوصی کل میتونه کلید عمومی کل رو باز کنه. به این شکل مشخص نمیشه که شما چندین امضا داشتین و تراکنش غیرمعمول از تراکنش معمول تمایزی نداره. همچنین شما نیازی به پرداخت هزینهی بیشتر برای چندامضایی ندارید و این ویژگی افراد رو تشویق به استفاده از روشهای امنتر میکنه.
Tweak یا دستکاری کلیدها: ویژگی دیگر اشنور این که میتونه در کلید عمومی و خصوصی یک تغییر جزیی بده؛ و بیننده متوجه این موضوع نشه. برای مثال کلیدخصوصی رو ضربدر 2 کنه و کلید عمومی همون کلید رو هم ×2 میکنه.
میشه از این قابلیتهای اشنور استفاده کرد تا بتونیم همهی تراکنشها رو در نظر بیننده یکسان جلوه بدیم و هیچ اطلاعاتی از جزییات اون نشت نکنه.
پس به طور کلی،
در صورتی که چندین شرط وجود داشته باشه، MAST میاد و شرایط (اسکریپتها) رو هش میکنه و یک خروجی میده.
اما اشنور میتونه از امضاها (یا کلیدهای خصوصی و عمومی) هش بگیره و یک خروجی بده.
و اما تپروت چیه؟
تپروت یا Taproot
تپروت روشی است که تمامی این تکههای پازل رو کنار هم به درستی قرار داده تا بتونه یک تصویری تشکیل بده از بلاک چینی امنتر و مقیاسپذیرتر.
این روش بین MAST و Schnorr پل میزنه تا انواع تراکنشها در بستر بلاک چینِ بیتکوین از همدیگه قابل تشخیص نباشن.
تپروت بر اساس این ایده است که میتونیم یک کلید عمومی رو به وسیلهی اسکریپتش تغییر جزیی بدیم (در مثال ما این تغییر شامل ×2 کردن کلید در نظر گرفته شده بود. اما این تغییر میتونه هر چیزی باشه مثل: کلید عمومی × اسکریپت)
در این حالت، اگر شما کلید عمومی اصلی و اسکریپت رو بدونی، میتونی کلید عمومی تغییریافته رو از طریق فرمول مربوط به تپروت محاسبه کنی. اگر کلید خصوصی اصلی و تغییرات رو بدونی، میتونی کلید خصوصی مطابق با کلید عمومی تغییریافته رو پیدا کنی. ولی اگر کلید عمومی تغییریافته رو داشته باشی، نمیتونی کلید اصلی و اسکریپتش رو بدست بیاری. (مشابه رمزنگاری که یک طرفهست)
درنتیجه، ما میتونیم ازین ویژگی استفاده کنیم تا P2SH رو با P2PK تلقیق کنیم؛ و در نهایت یک خروجی اسکریپتی داشته باشیم که در واقع کلید عمومی تغییریافته با یک اسکریپت است. شما میتونین با کلید عمومیتون خرجش کنین و یا با ارائهی کل اسکریپت این کار رو انجام بدین؛ اما چیزی که روی بلاک چین قرار میگیره فقط یک کلید عمومی است؛ و در نظر بیننده یک تراکنش عادیست.
اما چرا داشتن امکان ارائه کل اسکریپت مهم است؟
بلاک چین رو یک دادگاه بسیار عادلانه در نظر بگیرید؛ و کل اسکریپت مثل مدارک اثبات ادعای شماست. اگر زمانی در انتقال پول مشکلی ایجاد بشه، شما میتونین اسکریپت رو ارائه بدین. از طرفی، چون امکان ارائه مدرک و برقراری دادگاه وجود داره، آدمها تشویق میشن که کار خلاف نکنن. ایدهی اینکه امکان داره به دادگاه برن، میتونه از انجام اعمالی که خلاف منفعت شبکهست، خودداری کنن.
تپروت کی فعال میشه؟
ابتدا باید توافق جمعی شکل بگیره.
تپروت چهطوری فعال میشه؟
برای فعالسازی تغییرات کوچیک، از سافتفورک استفاده میشه. سافتفورک میتونه از سمت کاربر، ماینر و یا نودها اتفاق بیفته. شبکه مشابهاش رو در سگویت وUASF تجربه کرده.
مطلب مرتبط:
چرا مهم است که در فعالسازی تپروت مشارکت کنیم؟
این رو شما بگین :)
به نظرتون این تغییر برای شبکه حرکت مثبتی تلقی میشه؟
کلام آخر هم اینکه، تمام مراحلی که بررسی کردیم به این شکل بود که یک نیازی وجود داشته و ابزاری برای پاسخ به اون ساخته شده؛ و بعد از اون مرحلهبهمرحله مشکلات اون ابزار رفع شده و ارتقا پیدا کرده. در حقیقت بیتکوین یک نیاز جامعه بشری است که با مرور زمان و با مشارکت انسانها ارتقا پیدا میکنه.
برای نگارش این مقاله از منابع زیر استفاده شده است:
زنده باد
خیلی خوب و ساده توضیح دادین
عالی بود هرچند که ساده و روان بود ولی خود ذات مفاهمیم پیچیدگی داره که به مرور جا م افته