راهنمای آموزشی CBC Casper (ویتالیک بوترین)

به منظور کمک به انبوه بیشتری از مردم برای درک کسپر دیگر یعنی CBC Casper‌‌ ولاد زامفیر (Vlad Zamfir) و به ویژه بهترین نمونه‌‌سازی ممکن برای پروتکل‌‌های بلاکچین، تصمیم گرفتیم شرحی بر آن بنویسیم و با نگاهی که کمتر انتزاعی و بیشتر کاربردی و ملموس است، آن را آموزش دهیم.

0 94

CBC Casper از اساس طوری طراحی شده که بسیار فراگیر و انتزاعی باشد و تقریبا با هر ساختار دیتایی سازگاری پیدا کند. می‌‌توانید CBC را به کار گیرید تا بین 0 و 1 یکی را گزینش کنید؛ می‌‌توانید یک زنجیره‌‌ بلوک به بلوک ساده روی CBC درست کنید و همزمان می‌‌توانید یک تنگل DAG هایپرمکعب292 بعدی روی آن بسازید و در بازه‌‌ میان این دو نمونه تقریبا هرچیزی می‌‌توانید با آن ایجاد کنید.

برای سادگی کار ابتدا به سراغ یک نمونه‌‌ منسجم و پیوسته می‌‌رویم. یک ساختار ساده‌‌ که مبنای زنجیره‌‌ای دارد. یک مجموعه‌‌ی ثابت از اعتبارسنج‌‌ها (validator) را فرض می‌‌کنیم که از N اعتبارسنج تشکیل شده است. مقصود از اعتبارسنج همان گره‌‌های سهم‌‌گذار (staking nodes) است. همچنین فرض می‌‌کنیم هر یک از گره‌‌های سهم یکسانی از سکه را گرو می‌‌گذارند و مواردی را که این شرایط برقرار نباشد، با اختصاص دادن چند شناسه (ID) اعتبارسنجی به شماری از گره‌‌ها شبیه‌‌سازی می‌‌کنیم. زمان به بازه‌‌های 10 ثانیه‌‌ای بخش‌‌بندی می‌‌شود. اعتبارسنج k  می‌‌تواند در بازه‌‌‌‌ی k, N + k, 2N + k و غیره یک بلوک ایجاد کند. هر بلوک به یک بلوک مادر (parent block) می‌‌رسد. روشن است که اگر بخواهیم کار را تا جایی که جا دارد ساده کنیم، این ساختار را ایجاد می‌‌کنیم، سپس قانون بلندترین زنجیره را روی آن می‌‌زنیم و کار را تمام می‌‌کنیم.

chain

زنجیره سبز، بلندترین زنجیره‌‌ است (با درازای 6) پس آن را زنجیره‌‌ی مبنا می‌‌دانیم.

آنچه در اینجا برای ما اهمیت دارد، افزودن مفهوم قطعیت (finality) به ماجرا است. مفهومی که می‌‌گوید: می‌‌توان یک بلوک را چنان در زنجیره استوار کرد که هیچ بلوک رقیبی نتواند جای آن را بگیرد مگر اینکه بخش بسیار بزرگی از اعتبارسنج‌‌ها (برای نمونه 4/1 آن‌‌ها) خطای نسبت‌‌دهی یکتا (uniquely attributable fault ) انجام دهند. انجام این خطا یعنی انجام کاری که آشکارا و به لحاظ کریپتوگرافیکی بدخواهانه است و می‌‌توان بدخواهی آن را اثبات کرد. اگر بخش بسیار بزرگی از اعتبارسنج‌‌ها با انجام رفتار بدخواهانه، یک بلوک را باطل کنند، می‌‌توان اثبات بدرفتاری (proof of misbehavior) را در زنجیره به اجرا درآورد و علاوه بر گرفتن تمامی سپرده‌‌های این اعتبار‌‌سنج‌‌ها، هزینه‌‌ی بسیار سنگینی برای باطل کردن قطعیت موجود تعریف نمود (هزینه‌‌ای در حد چند صد میلیون دلار).

LMD GHOST

نحوه‌‌ کار ما به این صورت است که گام به گام پیش ‌‌می‌‌رویم. ابتدا قانون گزینش فورک (fork choice rule) را کنار می‌‌گذاریم. این قانون از میان شمار زیادی از گزینه‌‌های ممکن، «زنجیره مبنا» (canonical chain) را برمی‌‌گزیند. کاربران باید این زنجیره را مبنای کار خود قرار دهند. از این پس به جای قانون ساده‌‌ی بلندترین زنجیره از قانون « GHOST مبتنی بر آخرین پیام» (latest message driven GHOST) استفاده می‌‌کنیم که مخفف آن می‌‌شود LMD GHOST. برای نشان دادن طرز کار LMD GHOST نمونه‌‌ی بالا را تغییر می‌‌دهیم. باید آن را منسجم‌‌تر کنیم. به این منظور یک مجموعه‌‌ی اعتبارسنجی را در نظر بگیرید که اندازه‌‌ی آن 5 است و اعضای آن A, B, C, D, E هستند. اعتبارسنج A در بازه‌‌های 0 و 5 بلوک می‌‌سازد. اعتبارسنج B در بازه‌‌های 1 و 6 بلوک می‌‌سازد و … . اگر یک کلاینت قانون گزینش فورک LMD GHOST را ارزیابی کند تنها به آخرین (یعنی بالاترین بازه) پیام (یعنی بلوک) امضاء شده به دست هر اعتبارسنج اهمیت می‌‌دهد.

chain

آخرین پیام‌‌ها در بلوک آبی، بازه‌‌ها از چپ به راست (برای نمونه بلوک متعلق به A در سمت چپ در بازه‌‌ 0 است و …)

اکنون این پیام‌‌ها را تنها به عنوان دیتای منبع برای قانون گزینش فورک « سنگین‌‌ترین زیردرخت آزمند مشاهده شده » (greedy heaviest observed subtree) یا GHOST به کار می‌‌بریم. از بلوک پیدایش شروع کنید و هر جا به فورک رسیدید مسیری را برگزینید که شمار بیشتری از پیام‌‌های آخر از زیردرخت آن بلوک پشتیبانی می‌‌کنند (یعنی بیشتر پیام‌‌های آخر از آن بلوک یا یکی از نوادگان آن پشتیبانی می‌‌کنند). این کار را ادامه دهید تا به بلوکی برسید که بچه ندارد. می‌‌توانیم برای هر بلوک، زیرمجموعه‌‌ی آخرین پیام‌‌هایی را که از آن بلوک یا یعنی از نوادگان آن پشتیبانی می‌‌کنند، محاسبه نماییم.

chain

 

اکنون برای به دست آوردن سر (head) از ابتدا شروع می‌‌کنیم و در هر فورک گزینه‌‌ای که شماره‌‌ی بالاتر دارد را انتخاب می‌‌کنیم. ابتدا زنجیره‌‌ پایینی را برگزینید، زیرا 4 پیام آخر دارد که از آن پشتیبانی می‌‌کنند و در مقابل 1 پیام از زنجیره‌‌ی بالایی که تک بلوک دارد پشتیبانی می‌‌کنند. پیام‌‌ها سپس در فورک بعدی از زنجیره‌‌ی وسط پشتیبانی می‌‌کنند. نتیجه‌‌ی کار همان بلندترین زنجیره‌‌ است که قبلا بود. در شبکه‌‌هایی که به خوبی کار می‌‌کنند (نرخ جدا افتادگی پایینی دارند)، تقریبا همیشه پاسخ LMD GHOST زمان و قانون بلندترین زنجیره یکی است. ولی در شرایط پیچیده این روند همیشه برقرار نیست. برای نمونه، زنجیره‌‌ی زیر را در نظر بگیرید که فورک سه بلوکی مهم‌‌تری دارد:

chain

شماره‌‌گذاری بلوک‌‌ها براساس درازای زنجیره. اگر قانون بلندترین زنجیره را مبنا بگیریم، زنجیره‌‌ی بالایی بلندتر است در نتیجه زنجیره‌‌ی بالا برنده می‌‌شود.

chain

شماره‌‌گذاری بلوک‌‌ها براساس شمار آخرین پیام‌‌های پشتیبان و قانون GHOST (آخرین پیام هر اعتبارسنج با رنگ آبی نشان داده شده است). زنجیره پایینی پشتیبان بیشتری دارد، بنابراین اگر از قانون LMD GHOST پیروی کنیم، زنجیره پایین برنده می‌‌شود. با این وجود روشن نیست کدامیک از سه بلوک تقدم دارد.

شیوه‌‌ LMD GHOST از این مزیت برخوردار است که در صورت وجود تاخیر بالا بهتر می‌‌تواند اطلاعات استخراج کند. اگر دو اعتبارسنج از یک مادر دو بلوک به وجود آورند، باید هر دو را به عنوان رای‌‌های همیاری برای بلوک مادر لحاظ کرد، حتی با اینکه با رای دادن به خود در حال رقابت هستند. قانون بلندترین زنجیره در لحاظ کردن این نکته‌‌ی ظریف ناتوان است ولی قوانین مبتنی بر GHOST این توانایی را دارند.

شناسایی قطعیت

افزون بر آنچه گفتیم، رویکرد LMD GHOST یک ویژگی خوب دیگر هم دارد. این رویکرد «چسبنده» است. برای نمونه فرض کنید طی دو دور، 5/4 اعتبارسنج‌‌ها به یک زنجیره رای داده‌‌اند (فرض می‌‌کنیم یکی از پنج اعتبارسنج یعنی B که چنین رایی نداده می‌‌خواهد حمله کند):

chain

باید چه اتفاقی برای زنجیره‌‌ی بالایی بیفتد تا به زنجیره‌‌ی مبنا تبدیل شود؟ چهار نفر از پنج اعتبارسنج روی نخستین بلوک E، کار ساخت انجام دادند و هر چهار نفر گفتند E در گزینش فورک LMD بیشترین امتیاز را دارد. تنها با دیدن ساختار این زنجیره دسته‌‌کم از برخی پیام‌‌هایی که اعتبارسنج‌‌ها باید در زمان‌‌های مختلف دیده باشند آگاه می‌‌شویم. آنچه از دیده‌‌های این چهار اعتبارسنج می‌‌دانیم این‌‌ است:

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

chain

توجه داشته باشید که هر چهار اعتبارسنج می‌‌توانسته یک یا هر دو بلوک B را دیده باشد. D و E می‌‌توانستند بلوک دوم C را دیده باشند که اگر این طور باشد، به جای نخستین بلوک C ، آخرین پیام از دید آن‌‌ها خواهد بود. با این وجود ساختار خود زنجیره هیچ شواهدی از آنچه آنان دیده‌‌اند به ما نمی‌‌دهد. خوشبختانه، همان گونه که در ادامه خواهید دید، این ابهام برای ما اهمیتی ندارد.

از دید A چهار پیام آخر پشتیبان زنجیره‌‌ پایینی مشخص است و هیچ پیامی که از بلوک B پشتیبانی کند وجود ندارد. بنابراین در شبیه‌‌سازی ما از دید A ، شماره‌‌هایی که امتیاز زنجیره‌‌ی پایینی محسوب می‌‌شود دسته‌‌کم 1-4 است. وضعیت از دید C و D و E به همین صورت است و چهار پیام آخر از زنجیره‌‌ی پایینی پشتیبانی می‌‌کنند. بنابراین، هر چهار اعتبارسنج در جایگاهی قرار دارند که نمی‌‌توانند نظر خود را عوض کنند، مگر اینکه ابتدا دو اعتبارسنج دیگر نظرشان را تغییر دهند و امتیاز را 3-2 به نفع بلوک B عوض کنند.

دقت کنید که شبیه‌‌سازی ما از آنچه اعتبارسنج‌‌ها می‌‌بینند منقضی شده است. یعنی برای نمونه این را لحاظ نمی‌‌کند که D و E ممکن است آخرین بلوک مربوط به C را دیده باشند. این مساله محاسبات مربوط به زنجیره‌‌ی بالایی در مقابل زنجیره‌‌ی پایینی را تغییر نمی‌‌دهد، زیرا می‌‌توانیم به طور کلی بگوییم پیام تازه‌‌ی هر اعتبارسنج حاوی همان دیدگاه پیام‌‌های پیشین او است، مگر در صورتی که دو اعتبارسنج دیگر از قبل موضع chain خود را تغییر داده باشند.

جمله ماندگاری کمینه. A و C در اقدامی غیرقانونی موضع خود را به پشتیبانی از بلوک B تغییر می‌‌دهند (و ممکن است به خاطر این کار جریمه شوند). آن‌‌ها به بلوک B برتری 3-2 می‌‌دهند. حالا D و E هم قانونا می‌‌توانند موضع خود را عوض کنند.

با این تفاسیر قوانین گزینش فورک همچون LMD GHOST چسبنده هستند و کلاینت‌‌های می‌‌توانند تشخیص دهند چه زمانی قانون گزینش فورک روی یک بلوک مشخص گیر کرده است. در نتیجه می‌‌توانیم از این روش برای دستیابی به اجماع امن به شکل ناهمگام (آسنکرون) استفاده کنیم.

اوراکل‌‌های ایمنی

در حقیقت، شناسایی تمامی حالت‌‌های گیر کردن زنجیره روی بلوک (در CBC lingo، بلوک‌‌ها «قطعی شده» یا «امن» هستند) بسیار دشوار است. ولی می‌‌توانیم یک سری راهکار ابتکاری (اوراکل ایمنی [safety oracles]) پیدا کنیم که در شناسایی برخی از این موارد کار را آسان می‌‌کنند. ساده‌‌ترین این راهکارها اوراکل دسته (clique oracle) نام دارد. اگر چند زیرمجموعه‌‌ی V  از اعتبارسنج‌‌ها وجود داشته باشد که سهمی به اندازه‌‌ی p  از مجموعه‌‌ی کل اعتبارسنج‌‌ها را تشکیل دهد (که p > 1/2) به گونه‌‌ای که همه‌‌ی آن‌‌ها بلوک‌‌هایی در پشتیبانی از یک بلوک B بسازند و سپس یک دور دیگر بلوک‌‌هایی در پشتیبانی از B بسازند که مرجع آن دور نخست بلوک‌‌های ساخته شده است، آنگاه می‌‌توانیم به این صورت استدلال کنیم:

با توجه به دو دور پیام‌‌رسانی، در مورد زیرمجموعه‌‌ V می‌‌دانیم: (1) از B پشتیبانی می‌‌کند، (2) می‌‌دانند B از پشتیبانی خوبی برخوردار است در نتیجه هیچ یک از آن‌‌ها نمی‌‌تواند قانونا موضع خود را عوض کند مگر اینکه ابتدا شمار کافی از دیگر افراد این کار را انجام دهند. اگر یک B’ بخواهد با B رقابت کند و آن را شکست دهد، به لحاظ قانونی در ابتدا حداکثر می‌‌تواند از پشتیبانی 1-p  برخوردار باشد (حداکثر تمام کسانی که عضو دسته نیستد). B’ برای برنده شدن در گزینش فورک LMD GHOST باید به اندازه‌‌ی 1/2 از پشتیبانی برخوردار باشد. از این رو دسته‌‌کم باید

\[ 1/2 – (1-p) = p – 1/2 \]

به صورت غیرقانونی موضع خود را تغییر دهند تا شرایط به گونه‌‌ای رقم بخورد که قانون LMD GHOST از B’ پشتیبانی کند.

برای نمونه می‌‌توان گفت اوراکل دسته p=3/4  امنیتی در سطح 1/4 فراهم می‌‌کند و یک مجموعه بلوک مورد نیاز دسته، در صورتی می‌‌تواند تولید شود که 3/4 گره‌‌ها آنلاین باشند (و در شرایط عادی تولید می‌‌شود). به این ترتیب از لحاظ BFT، سطح تحمل‌‌پذیری خطا در دو دور اوراکل دسته، 1/4 است؛ هم از نظر برقراری (liveness) و هم از نظر ایمنی (safety).

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

جلوتر رفتن

CBC را می‌‌توان از راه‌‌های بسیاری گسترش داد. نخست، می‌‌توان اوراکل‌‌های ایمنی دیگری تهیه کرد. اوراکل‌‌های دسته که دور بالاتری دارند تا سطح 1/3  تحمل‌‌پذیری خطا دارند. دوم اینکه می‌‌توانیم از مکانیزم‌‌های گردش اعتبارسنج استفاده کنیم. ساده‌‌ترین روش این است که اجازه دهیم هر بار اوراکل دسته q=3/4 محقق شد، درصد کمی از مجموعه اعتبارسنج‌‌ها تغییر کند. با این وجود، روش‌‌های دیگری هم وجود دارد که می‌‌توانیم به کار ببریم. راهکار سوم در زمینه‌‌ گسترش CBC این است که از ساختارهای زنجیر – مانند فراتر رویم و از ساختارهایی استفاده کنیم که تراکم پیام‌‌ها را برحسب زمان افزایش می‌‌دهند. برای نمونه ساختار گواهی زنجیره‌‌ بیکن Serenity :

chain

در این مورد، جداسازی گواهی‌‌ها (attestation) از بلوک‌‌ها ارزش دارد. بلوک شیئی است که در حقیقت DAG زیربنایی را رشد می‌‌دهد، در حالی که گواهی در قانون گزینش فورک کاربرد دارد. خصوصیات زنجیره‌‌ی بیکن Serenity به گونه‌‌ای است که هر بلوک صدها گواهی مربوطه دارد. با این وجود، از هر روشی استفاده کنید، منطق اصلی کسپر CBC همچنان دست نخورده باقی می‌‌ماند.

به منظور اجرایی کردن ایمنی کسپر CBC از لحاظ کریپو – اقتصادی، باید اعتبار (validity) و شرایط ابطال (slashing) را وارد آن کنیم. ابتدا با قانون اعتبار شروع می‌‌کنیم. هر بلوک حاوی یک بلوک مادر و مجموعه‌‌ای از گواهی‌‌ها است که از آن‌‌ها آگاهی دارد و هنوز بخشی از زنجیره نیستند (شبیه «عمو‌‌ها» [uncles] در زنجیره‌‌ی اثبات کار اتریوم). برای معتبر شدن بلوک باید بلوک مادر نتیجه‌‌ی اجرای قانون گزینش فورک LMD GHOST باشد با این فرض که اطلاعات موجود در زنجیره در خود بلوک هم وجود داشته باشد.

chain

خط‌‌چین‌‌ها پیوندهای عمویی (uncle links) هستند. برای نمونه هنگامی که E یک بلوک می‌‌سازد، متوجه می‌‌شود که C هنوز بخشی از زنجیره نیست، در نتیجه یک ارجاع به C را لحاظ می‌‌کند.

اکنون می‌‌توانیم کسپر CBC را تنها با یک شرایط ابطال (slashing condition) ایمن‌‌ کنیم: نمی‌‌توان دو گواهی و انجام داد، مگر اینکه یا در زنجیره‌‌ای باشد که را به آن گواهی می‌‌کنیم یا در زنجیره‌‌ای باشد که را به آن گواهی می‌‌کنیم.

chain

توصیف اعتبار و شرایط ابطال تقریبا آسان است. البته اجرا کردن آن‌‌ها در عمل نیاز به چک کردن زنجیره‌‌های هش و اجرای قوانین گزینش فورک با اتفاق آرا دارد. بنابراین اصلا به سادگی گرفتن دو پیام و چک کردن چند نامساوی میان اعدادی کارکردی پیام‌‌ها نیست؛ کاری که در Casper FFG می‌‌توانید برای شرایط ابطال NO_SURROUND  و NO_DBL_VOTE  انجام دهید.

در کسپر CBC، برقراری (Liveness) دیگر متکی به برقراری الگوریتم زنجیره‌‌ی مبنا نیست (برای نمونه اگر شرایط به صورت یک بلوک در هر بازه باشد، آنگاه برقراری به این فرض همگامی بستگی دارد که می‌‌گوید همه‌‌ی گره‌‌ها هر چیزی را که در بازه‌‌ی N تولید شود، پیش از شروع بازه‌‌ی N+1 می‌‌بینند). امکان ندارد به شکلی گیر کنیم که نتوان پیش رفت ولی می‌‌توان از هر وضعیتی به قطعی کردن بلوک‌‌های جدید رسید؛ حتی در صورت وجود حمله کننده یا زمانی که تاخیر شبکه بالاتر از میزان مورد نیاز الگوریتم زنجیره‌‌ی مبنا است.

فرض کنید در زمان T شبکه فروکش می‌‌کند (calm down) و فرض‌‌های همگامی بار دیگر برقرار می‌‌شوند. در این صورت همگان با سر H یکسان، به سمت یک دید از شبکه همگرایی پیدا می‌‌کنند. از اینجا به بعد اعتبارسنج‌‌ها شروع به امضای پیام‌‌هایی می‌‌کنند که از H یا نوادگان H پشتیبانی می‌‌کنند. از اینجا به بعد زنجیره به آرامی کار می‌‌کند و در نهایت یک اوراکل دسته را برقرار می‌‌سازد که در این هنگام H قطعی می‌‌گردد.

chain

شبکه‌‌ آشفته (Chaotic) ناشی از تاخیر بالا.

chain

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

 

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

به پایان این بخش رسیدیم. CBC به لحاظ پیاده‌‌سازی می‌‌تواند به مراتب بحث‌‌ برانگیزتر و پیچیده‌‌تر از FFG باشد، ولی از لحاظ توانایی استدلال درباره‌‌ پروتکل و ویژگی‌‌های ناشی از آن به شکل غافلگیر کننده‌‌ای ساده است.

شاید از این مطالب هم خوشتان بیاید.

ارسال پاسخ

آدرس ایمیل شما منتشر نخواهد شد.