Tendermint چیست؟
Tendermint در سال ۲۰۱۴ توسط جائه کووان (Jae Kwon) و ایثن بوکمن (Ethan Buchman) راهاندازی شد. بهطور کلی اگر بخواهیم یک پاسخ کوتاه اما کامل به سوال «تندرمینت چیست» بدهیم، باید بگوییم Tendermint وظیفه مدیریت شبکه و لایههای اجماع بلاکچین را برعهده دارد. به زبان ساده تر، تندرمینت تراکنشها را مرتب و منتشر میکند. این پروتکل یکی از اجزای کیت توسعه نرمافزاری شبکه Cosmos است که ارتباط بهتر با شبکههای دیگر و پیادهسازی برنامههای مبتنی بر بلاکچین کمک میکند. برای درک بهتر از چیستی تندرمینت و مزیت آن نسبت به الگوهای دیگر، باید درباره موضوعاتی مانند معماری بلاکچین و تحمل خطای بیزانس (BFT) صحبت کنیم.
تحمل خطای بیزانس
یکی از جمله مشکلاتی که بلاکچین با روشهای اجماع خود آن را حل کرده خطای بیزانس است. در BFT مشارکتکنندگان در یک محیط توزیعشده باید بتوانند در یک زمان تقریبا مشخص با هم به توافق برسند و ارتباط برقرار کنند، درحالی که نمیدانند آیا افراد دیگر در رفتار و کلام خود صادق هستند یا خیر. از کار افتادن دلبهخواه نودها یا ماشینها در شبکه یا رفتار مخرب آنها، بهنوعی خطای بیزانس محسوب میشود و مدیریت و تحمل آن، بهعنوان تحمل خطای بیزانس یا Byzantine Fault Tolerance شناخته شده است. نظریه BFT چندین و چند سال قدمت دارند و فناوری بلاکچین تنها یک اصلاح در فضای مدرنتر است.
معماری بلاکچین در tendermint
تندرمینت را شاید بتوان مانند بیت کوین و اتریوم یک بلاک چین دانست. البته منظورمان از بلاکچین، تنها یک پایگاه داده مطلق نیست و به مواردی مانند شبکه همتا به همتای نودها و نحوه تعامل آنها، امور مربوط به تراکنشها و قرارداد هوشمند نیز مربوط میشود. در بیشتر بلاکچینها این موارد نیز وجود دارند و از آنها استفاده میکنند، اما مساله اینجاست که اکثرا بهصورت یکپارچه عمل میکنند. بهعبارت دیگر یا نمیتوان در یک قسمت مشخص از کل سیستم تغییر ایجاد کرد، یا در صورت ایجاد تغییر، ساختار از حالت پیوستگی خارج میشود. مشکل معماری یکپارچه را میتوان در هارد فورک یک شبکه مشاهده کرد. برای ایجاد تغییر در بعضی از شبکهها نیاز است که یک هاردفورک از شبکه اصلی انجام شود. برای مثال نیز مجدد میتوانیم به دو شبکه بیت کوین و اتریوم اشاره کنیم که برای اعمال تغییرات، هارد فورکهایی از آنها بهوجود آمدند.
در طرف دیگر، معماری ماژولار وجود دارد. این نوع از معماری شبکه میتواند این امکان را فراهم کند که با انعطافپذیری و بدون نگرانی از ایجاد شکستگی در ساختار کلی، تغییرات لازم روی یک قسمت مشخص پیادهسازی شود. علاوهبر این، در مواقعی که نیاز است تنها روی یک وضعیت (State) توافق شود، این کار حتی درصورت عدم اعتماد به افراد دیگر، امکانپذیر باشد.
با درنظرگرفتن معماری بلاکچین و نیاز آن به وجود یک روش اجماع و حل مشکلی به نام خطای بیزانس، لایههای یک بلاکچین عبارتند از لایه کاربردی (Application Layer)، لایه اجماع (Consensus Layer) و لایه شبکه (Networking Layer).
دو لایه شبکه و اجماع لایههایی هستند که نودهای شبکه با هم در ارتباط هستند و روی مسائل موجود بحث و توافق میکنند. لایه کاربردی همانطور که از نامش پیداست برای پیادهسازی قابلیتهای موجود مانند برنامه غیرمتمرکز، قرارداد هوشمند و غیره استفاده میشود.
پس از توضیحات مقدماتی که دادیم، بهتر است به سراغ معرفی و تشریح تندرمینت برویم که ببینیم چگونه مشکلات مطرحشده را برطرف میکند.
معرفی الگوریتم اجماع Tendermint و اجزای آن
تندرمینت را میتوان یک نرمافزار دانست که بهطور ایمن و پیوسته فعال است و یک برنامه را روی ماشینها مختلف اجرا میکند. منظور از ایمن بودن حالتی است که درصورت توقف فعالیت یکسوم از ماشینها، تندرمینت همچنان به کار خود ادامه میدهد. منظور از پیوستگی نیز حالتی است که ماشینها یک وضعیت و تراکنش را میبینند و محاسبه میکنند.
تندرمینت دو بخش اصلی دارد؛ یکی بخش مرکزی یا هسته تندرمینت (Tendermint Core) که موتور اجماع و پروتکل شبکه همتابههمتا است و دیگری، رابط کاربری تندرمینت که رابط برنامه بلاک چین یا Application BlockChain Interface نام دارد. در ادامه از مخفف ABCI بهجای رابط برنامه بلاک چین استفاده میکنیم.
ممکن است چندین سوکت ارتباطی میان ABCI و یک برنامه وجود داشته باشد. Tendermint Core سه مسیر ارتباطی از ABCI به برنامه ایجاد میکند. یکی برای تایید تراکنشها بعد از انتشار در ممپول، یکی دیگر برای موتور اجماع و اجرای بلاکهای پیشنهادی و دیگری برای انجام کوئری (Query) و اطلاع از حالت برنامه.
هسته تندرمینت (Tendermint Core)
در گام نخست، از آنجایی که مکانیسم اجماع مورد استفاده گواه اثبات سهام (PoS) است، نودها بهصورت تصادفی انتخاب میشوند. این انتخاب به روش Round Robin است که یعنی نوبت به همه نودها میرسد. هرچه میزان استیکیگ یک نود بیشتر باشد، شانس او برای انتخاب شدن، بیشتر میشود.
نود انتخاب شده باید یک بلاک پیشنهاد دهد. در صورت رضایت نودهای دیگر، بلافاصله بلاک به زنجیره اضافه میشود و برخلاف شبکههای دیگر نیازی به منتظر ماندن برای تایید اعتبار تراکنش نیست. Tendermint Core تضمین میکند که تراکنشها روی تمام دستگاهها با یک ترتیب مشخص قرار بگیرد. این بخش یک موتور اجماع BFT بلاکچینی و یک شبکه همتابههمتا است.
بهصورت خلاصه، تندرمینت کور مسئول اشتراکگذاری بلاکها و تراکنشها میان نودها و ایجاد نظم متعارف و غیرقابل تغییر تراکنشها در بلاکچین است.
رابط ABCI
Tendermint با استفاده از معماری ماژولار، لایه برنامه را از لایه اجماع و شبکه جدا کرده است؛ به همین خاطر کسانی که قصد دارند برنامهای بسازند، میتوانند بدون در نظر گرفتن لایههای دیگر، برنامه خود را راهاندازی کنند. شاید این برای کاربران نهایی یا معمولی هیجانانگیز نباشد، اما برای توسعه دهندگان که میتوانند بدون نیاز به بوت استرپ کردن یک شبکه کامل، برنامههای خود را بسازند، بسیار حائز اهمیت است. وجه تمایز دیگر تندرمینت در اینجا است. توسعهدهندگان میتوانند با هر زبان برنامه نویسی اقدام به انجام تراکنش و ساخت برنامه کنند و با استفاده از رابط کاربری ABCI، به هسته تندرمینت و در نهایت به بلاکچین متصل شوند.
رابط ABCI شامل سه نوع پیام اصلی است که از هسته به لایه برنامه (کاربردی) انتقال میدهد.
پیام DeliverTX: هر تراکنش در بلاکچین با این پیام تحویل داده میشود. برنامه باید هر تراکنش دریافتی را با پیغام DeliverTX تایید کند سپس نیاز است که هر تراکنش تاییدشده، حالت برنامه را بهروزرسانی کند. برای مثال این کار با آپدیت دیتابیس UTXO یا ذخیره مقادیر کلیدی انجام میشود.
پیام CheckTX: این پیام مشابه پیام قبل است؛ اما فقط برای اعتبارسنجی تراکنشها استفاده میشود. ممپول Tendermint Core ابتدا اعتبار تراکنشها را با پیام CheckTX بررسی میکند و در صورت صحت آن، آن را به همتایانش منتقل میکند.
پیام Commit: این پیغام برای محاسبه انجام رمزنگاری در برنامه حالت فعلی و اضافه شدن در هدر بلاک بعدی استفاده میشود. یکی از مزیتهای این ویژگی، تسهیل توسعه کلاینتهای سبک و ایمن است؛ زیرا میتوان اثباتهای هش مرکل (Merkle Hash) را با بررسی هش بلاک و حدنصاب امضا تایید کرد.
هدف Tendermint چیست؟
تندرمینت میخواهد تمرکز توسعهدهندگان بر لایه کاربردی و توسعه برنامههای غیرمتمرکز باشد. برای این که آنها روی دو لایه دیگر بهصورت همزمان کار نکنند، بستری را بهصورت مجزا از لایه شبکه و اجماع بلاکچین فراهم میکند.
کارکردتندرمینت
تندرمینت از معماری ماژولار استفاده میکند که برخلاف معماری یکپارچه، از اجزای نرمافزاری مستقل برخوردار است. این قابلیت باعث میشود بدون ایجاد تغییرات قابل توجه در کل سیستم، بتوان بخشی از برنامه را تغییر داد. این راه حل با توجه به الگوریتم تحمل خطای بیزانس حاصل میشود. یک الگوریتم اثبات سهام BFT با استفاده از یک مدل نیمه همزمان (Partially Synchronous) بر مشکل خطای بیزانس غلبه میکند. این به معنای این است که اعتبارسنجها یا Validatorها نیازی ندارند در یک زمان از پیش تعیینشده یا بهعبارت دیگر همزمان عمل کنند. اعتبارسنجی بهصورت دورهای انجام میشود و در صورت اشتباه، همان قسمت اصلاح میشود.
الگوریتم Tendermint برای فعالیت به مفروضات زمانبندی متکی است. این پروتکل از یک ماشین حالت (State Machine) ساده به شکل زیر پیروی میکند. ماشین حالت یک مفهوم در علوم کامپیوتری است که باتوجه به آن، یک ماشین میتواند چندین حالت داشته باشد. لازم بهذکر است که این ماشین در هر زمان تنها میتواند یک حال داشته باشد. این مفهوم در بلاکچین به این معناست که اگر یک نود از یک حالت قبلی تبعیت کند و فرایندی را انجام دهد، مرحله نهایی را به همان شکل به اتمام میرساند.
منطق الگوریتم اجماع Tendermint
این پروتکل توسط اعتبارسنجها (validators) اجرا میشود. از جمله وظایف آنها، پیشنهاد (Propose) و رای (Vote) به بلاکهای جدید است. هر بلاک پیشنهادی برای رایگیری در صف قرار میگیرد. اگر در زمان رایگیری به شبکه اضافه نشود، پروتکل به مرحله (Round) بعدی خواهد رفت. نود بعدی باید برای آن شماره (Height) یک بلاک پیشنهاد کند. برای اضافه شدن موفقیتآمیز یک بلاک به زنجیره، دو مرحله رایگیری لازم است. این دو مرحله پیش رای (Pre-Vote) و پیش اعمال (Pre-Commit) نام دارند. یک بلاک زمانی در شبکه اضافه میشود که بیش از دوسوم اعتبارسنجها آن را Pre-commit کنند.
در گوشه پایین و سمت چپ تصویر عکس دو نفر را مشاهده میکنید که در حال رقص پولکا (Polka) هستند. هنگامی که بیش از دوسوم اعتبارسنجها به همان بلاک Prevote میدهند، تیم Tendermint آن را پولکا مینامد. هر پیش اعمالی باید توسط یک پولکا در همان مرحله مشخص و تعیین شود.
در برخی از مواقع ممکن است ولیدیتورها نتوانند در فرایند گفتهشده، شرکت کنند؛ علت آن نیز ممکن است آفلاین بودن یا کندی شبکه باشد. پروتکل تندرمینت اجازه میدهد که آن نود نادیده گرفته شود. از آنجایی که تندرمینت یک الگوریتم اجماع نیمه همزمان است، به نودها این امکان را میدهد که قبل از رفتن به مرحله بعدی، برای دریافت بلاک پیشنهادی کامل صبر کنند.
با فرض این موضوع که کمتر از یکسوم ولیدتورها جز بازیگران بد هستند یا در بهترین حالت در قالب خطای بیزانسی قرار دارند، Tendermint امنیت شبکه را تضمین میکند. برای مثال الگوریتم تندرمینت به نودها اجازه نمیدهد که در یک Height بلاکهای دیگر و متضاد اعمال کنند. این پروتکل از یک روش بلوکه یا قفل کردن استفاده میکند. زمانی که یک اعتبارسنج یک بلاک را Pre-Commit میکند، در آن بلاک قفل میشود. بعد از قفل شدن باید به همان بلاکی که روی آن قفل شده است، پیش رای دهد. تنها زمانی ولیدیتور مورد نظر ما از حالت بلوکه خارج میشود و میتواند یک بلاک جدید را Precommit کند که برای آن بلاک در دوره بعدی پولکا وجود داشته باشد.
چه پروژههایی از تندرمینت و کیت توسعه کازمس استفاده میکنند؟
برخی از پروژهها از الگوریتم تندرمینت و کیت توسعه کازمس در سیستم خود استفاده میکنند و برخی دیگر نمونه پیادهسازی شده در اکوسیستم Cosmos هستند. شبکههایی مانند ترا (Terra)، اوسیس (Oasis)، ریجن نتورک (Regen Network) و IRISnet و بایننس دکس از جمله این پروژهها هستند.
همانطور که گفتیم، برخی از پروژهها یک نمونه از مدل اصلی شبکه روی اکوسیستم کازمس هستند. از برجستهترین این پروژههای میتوان به اتریوم اشاره کرد. این شبکه اترمینت (Ethermint) نام دارد. فناوری مورد استفاده در این تبدیل، هارد اسپون (Hard Spoon) است. مکانیسم اجماع PoW از اتریوم حذف شده است و هولدرهای اتر برای پرداخت فی شبکه در کازمس، رمزارز فوتون دریافت میکنند (فوتون توکن پیشنهادی برای پرداخت کارمزد در شبکه Cosmos است). توسعهدهندگان اتریوم میتوانند قراردادهای هوشمند خود را بهراحتی روی موتور جدید انتقال دهند. این سازوکار میتواند یک دید کلی درباره اجرای Casper در اتریوم ۲ به کاربران دهد.
مزایا و معایب تندرمینت چیست؟
+توان عملیاتی بالا (تراکنشها بهسرعت تایید میشوند)
+مقیاس پذیری افقی (با استفاده از سیستم Zoning)
+پشتیبانی از تمام زبانهای برنامهنویسی
+صرفهجویی در منابع محاسباتی در مقایسه با PoW
-انگیزه پایین افرادی که سپردهگذاری کمی دارند
-بلوکه شدن طولانی سرمایه
دیدگاهتان را بنویسید