اگر اسم Cosmos-SDK به گوشتان خورده، اما اطلاعات و درک کاملی از آن ندارید این مقاله کاملا مناسب شماست. کازموس پروژهای است که طرفداران و دنبالکنندگان زیادی دارد و در لبه تکنولوژی بلاک چین حرکت میکند. این پروژه در حال ساخت یک اکوسیسم قدرتمند و گسترده است و یکی از مشکلات بلاکچین یعنی قابلیت همکاری را برطرف میکند. به کمک کازموس اسدیکا به راحتی میتوان روی Tendermint بلاکچینهای عمومی و خصوصی ایجاد کرد و بزرگترین مزیت آن ماژولار بودن است. در این مقاله به بررسی این که فریمورک Cosmos SDK چیست، چرا از آن استفاده میشود، معماری بلاکچین و ماژولهای اصلی آن پرداخته شده است. با میهن بلاکچین همراه باشید.
فریمورک Cosmos SDK چیست؟
Cosmos-SDK یک فریمورک متنباز برای ساخت بلاکچینهای عمومی دارای چندین دارایی (Multi Asset) و با الگوریتم اجماع گواه اثبات سهام (PoS) مانند Cosmos Hub، و همچنین بلاکچینهای دارای مجوز (Permissioned) با مکانیزم اجماع اثبات اعتبار (Proof Of Authority) است. بلاکچینهای ساختهشده با Cosmos SDK معمولا به عنوان بلاکچینهای مخصوص برنامه (Application-Specific) شناخته میشوند که در ادامه توضیحاتی درباره این مدل بلاکچین میدهیم.
هدف Cosmos SDK این است که شرایطی را فراهم کند تا توسعهدهندگان بتوانند به راحتی بلاکچینهای سفارشی را با ماژولهای موجود بسازند، به نحوی که امکان تعامل با سایر بلاکچینها به طور بومی وجود داشته باشد. SDK چارچوبی برای ایجاد برنامههای بلاکچینی ایمن روی Tendermint است. بلاکچینهای مبتنی بر SDK از ماژولهای قابل ترکیب ساخته شدهاند که بیشتر آنها منبعباز و بهراحتی برای هر توسعهدهندهای در دسترس هستند. هر کسی میتواند یک ماژول برای کازموس اسدیکا ایجاد کند و یکپارچهسازی با ماژولهای ساخته شده از قبل، به سادگی وارد کردن آنها به برنامه بلاک چین شما است.
بلاکچین مخصوص اپلیکیشن چیست؟
یکی از پارادایمهای توسعه در دنیای بلاک چین امروز، بلاکچینهای دارای ماشین مجازی مانند اتریوم است. به طور کلی در این مدل بلاکچینها، توسعه حول ایجاد یک برنامه غیرمتمرکز در بالای یک بلاک چین موجود به کمک مجموعهای از قراردادهای هوشمند میچرخد. در حالی که قراردادهای هوشمند میتوانند برای برخی موارد مانند برنامههای کاربردی که یک مصرف دارند (مثلا ICO) بسیار خوب باشند، اما اغلب برای ساختن پلتفرمهای غیرمتمرکز پیچیده کارآمد نیستند. به طور کلی قراردادهای هوشمند از نظر انعطافپذیری، حاکمیت و عملکرد ممکن است محدودکننده باشند.
بلاکچینهای مخصوص برنامه، الگوی توسعه کاملا متفاوتی نسبت به بلاکچینهای ماشین مجازی ارائه میدهند. در یک بلاک چین مخصوص برنامه که برای اجرای یک اپلیکیشن واحد شخصیسازی شده است، توسعهدهندگان برای اتخاذ تصمیمات طراحی مورد نیاز برای اجرای بهینه برنامه کاملا آزاد هستند. آنها همچنین می توانند حاکمیت، امنیت و عملکرد بهتری را فراهم کنند.
در اصل توسعهدهندگان بهجای ساختن یک برنامه غیرمتمرکز در بالای بلاکچین زیربنایی مانند اتریوم، بلاکچین خود را از پایه میسازند. این به معنای ساختن فولنودها، گرهها و تمام رابطهای لازم (CLI، REST، …) برای تعامل با گرهها است.
چرا Cosmos SDK
Cosmos SDK در حال حاضر پیشرفتهترین فریمورک برای ساخت بلاکچینهای مخصوص برنامه و سفارشی است. در ادامه به مزایایی اشاره میکنیم که ممکن است توسعهدهندگان را برای ساخت برنامه غیرمتمرکز به استفاده از کازموس اسدیکی ترغیب کند.
- موتور اجماع پیشفرض موجود در کیت توسعه کازموس، Tendermint Core است. Tendermint بالغترین موتور اجماع تابآور در برابر خطای بیزانس (Byzantine Fault Tolerance) موجود است. این موتور اجماع به عنوان یک استاندارد طلایی برای ساخت سیستمهای گواه اثبات سهام در نظر گرفته میشود.
- Cosmos SDK متنباز است و به گونهای طراحی شده که ساخت بلاکچینها از ماژولهای قابل ترکیب را آسان میکند. با رشد اکوسیستم ماژولهای اپنسورس SDK، ساختن پلتفرمهای غیرمتمرکز پیچیده با آن آسانتر میشود.
- مهمتر از همه این که کازموس اسدیکا قبلا برای ساخت بسیاری از بلاکچینهای مخصوص برنامه استفاده شده است. از جمله موارد دیگر میتوان به Cosmos Hub، IRIS Hub، بایننس چین، ترا و کاوا اشاره کرد. پروژههای بسیار دیگری نیز در حال شکلگیری روی Cosmos SDK هستند.
معماری بلاکچین
ساختار و معماری بلاکچین دارای سه مولفه اصلی است که در ادامه توضیحاتی در رابطه با هر کدام ارائه میکنیم.
ماشین حالت (State Machine)
یک بلاکچین ذاتا یک ماشین حالت قطعی (Deterministic) تکرارشونده است. State Machine یک مفهوم علم کامپیوتر است که به موجب آن یک ماشین میتواند چندین حالت داشته باشد، اما فقط یک حالت در هر زمان. حالتی وجود دارد که وضعیت فعلی سیستم و تراکنشها را توصیف میکند که باعث انتقال حالت میشود.
در بلاک چین، ماشین حالت قطعی است. این یعنی اگر یک گره، در یک حالت مشخص شروع شود و به همان ترتیب قبلی تراکنشها را تکرار کند، همیشه به همان حالت نهایی قبلی میرسد. Cosmos SDK حداکثر انعطافپذیری را به توسعهدهندگان میدهد تا حالت اپلیکیشنها، انواع تراکنشها و فانکشنهای انتقال حالت خودشان را تعریف کنند.
Tendermint
به لطف Cosmos SDK، توسعهدهندگان فقط باید ماشین حالت را تعریف کنند و Tendermint انتشار روی شبکه را برای آنها انجام میدهد. Tendermint یک موتور است که وابسته به اپلیکیشنها نیست و وظیفه مدیریت شبکه و لایههای اجماع بلاک چین را بر عهده دارد. در عمل میتوان گفت که تندرمینت مسئول انتشار و قراردادن تراکنشها به ترتیب است. Tendermint Core برای رسیدن به اجماع در مورد ترتیب تراکنشها از الگوریتم تحمل خطای بیزانس (BFT) استفاده میکند.
الگوریتم اجماع Tendermint با مجموعهای از نودها به نام Validator کار میکند. اعتبارسنجها مسئول اضافه کردن بلاکهای تراکنش به بلاک چین هستند. مجموعهای از اعتبارسنجها وجود دارند که یکی از آنها توسط الگوریتم به عنوان پیشنهاددهنده بلاک بعدی انتخاب میشود. بلاک زمانی معتبر تلقی میشود که تمام تراکنشهای موجود در آن معتبر باشند و بیش از دو سوم اعتبارسنجها آن را تایید کرده باشند. مجموعه اعتبارسنجها را با قوانین نوشته شده در ماشین حالت میتوان تغییر داد.
ABCI
Tendermint تراکنشها را از طریق رابطی به نام ABCI به برنامهها منتقل میکند که باید این رابط را پیادهسازی کنند. توجه داشته باشید که تندرمینت فقط بایتهای تراکنشها را مدیریت میکند و هیچ اطلاعی از معنای این بایتها ندارد. تمام کاری که Tendermint انجام میدهد این است که این بایتهای تراکنش را به طور قطعی مرتب کند. تندرمینت بایتها را از طریق ABCI به اپلیکیشن ارسال میکند و انتظار دارد یک کد بازگشتی به آن اطلاع دهد که آیا پیامهای موجود در تراکنشها با موفقیت پردازش شدهاند یا خیر. سه مورد از مهمترین پیامهای ABCI عبارتند از:
- CheckTx. هنگامی که یک تراکنش توسط Tendermint Core دریافت میشود، به اپلیکیشن ارسال میشود تا بررسی کند که آیا تعدادی از الزامات اساسی برآورده شدهاند یا خیر. CheckTx برای محافظت از ممپول (Mempool) فولنودها در برابر تراکنشهای اسپم استفاده میشود. یک کنترلکننده خاص به نام AnteHandler برای اجرای یک سری مراحل اعتبارسنجی مانند بررسی کافیبودن کارمزدها و تایید اعتبار امضاها استفاده میشود. اگر نتیجه کنترلها معتبر بودن را نشان دهد، تراکنش به Mempool اضافه شده و به سایر نودها منتقل میشود. توجه داشته باشید که تراکنشها با CheckTx پردازش نمیشوند (یعنی هیچ تغییری در حالت صورت نمی گیرد)، زیرا هنوز در یک بلاک گنجانده نشدهاند.
- DeliverTx. هنگامی که یک بلاک معتبر توسط Tendermint Core دریافت میشود، هر تراکنش آن از طریق DeliverTx برای پردازش شدن به برنامه ارسال میشود. در این مرحله است که انتقال حالت (State Transition) رخ میدهد. AnteHandler مجددا همراه با سرویس پیام RPC برای هر پیام در تراکنش اجرا میشود.
- BeginBlock/EndBlock. این پیامها در ابتدا و انتهای هر بلاک اجرا میشوند، خواه بلاک دارای تراکنش باشد یا نباشد. این برای راهاندازی اجرای خودکار منطق مفید است. باید کاملا محتاط باشید، زیرا حلقههای محاسباتی گرانقیمت میتوانند بلاکچین شما را کند کنند یا اگر حلقه بینهایت باشد، ممکن است بلاکچین را فریز کند.
هر برنامهای که روی تندرمینت ساخته میشود، باید رابط ABCI را پیادهسازی کند تا بتواند با آن ارتباط برقرار کند. خوشبختانه به کمک Cosmos SDK، پروژهها مجبور نیستند رابط ABCI را از ابتدا پیادهسازی کنند، زیرا این رابط را در قالب Baseapp و به صورت بویلرپلیت (Boilerplate) ارائه میدهد. بویلرپلیت یک اصطلاح در برنامهنویسی است و به معنی کدها و تنظیمات پیشفرضی است که برای اجرای هر پروژه نیاز است و بارها استفاده میشود.
مولفه اصلی Cosmos SDK
همانطور که گفته شد کازموس اسدیکا چارچوبی است که توسعه ماشینهای حالت امن در بالای Tendermint را تسهیل میکند. SDK در هسته خودش، اجرای بویلرپلیت ABCI را در قالب زبان برنامهنویسی Go ارائه میکند که دارای یک Multistore برای حفظ دادهها و یک Router برای مدیریت تراکنشها است. اگر بخواهیم خیلی ساده بیان کنیم نحوه مدیریت تراکنشها هنگام انتقال از Tendermint، توسط یک اپلیکیشن ساختهشده در بالای کازموس اسدیکی از طریق DeliverTx به صورت زیر است:
- رمزگشایی تراکنشهای دریافتی از موتور اجماع Tendermint.
- استخراج پیامها از تراکنش و انجام دادن کنترلهای اولیه.
- انتقال هر پیام به ماژول مناسب به منظور پردازش آن.
- انجام دادن تغییرات حالت.
قدرت Cosmos SDK در ماژولار بودن آن است. برنامههای SDK با تجمیع مجموعهای از ماژولهای قابل همکاری ساخته میشوند. هر ماژول زیرمجموعهای از حالت را تعریف میکند و شامل پردازشگر پیام یا تراکنش خاص خود است، در حالی که SDK مسئول مسیریابی هر پیام به ماژول مربوطه است. تصویر زیر نمای سادهای است از نحوه پردازش یک تراکنش توسط فولنودهای یک اپلیکیشن، زمانی که از یک بلاک معتبر دریافت میشود.
هر ماژول را میتوان به عنوان یک ماشین حالت کوچک دید. توسعهدهندگان باید زیرمجموعهای از حالت که توسط ماژول مدیریت میشود و همچنین انواع پیامهای سفارشی که منجر به تغییر حالت میشوند را تعریف کنند.
اکثر توسعهدهندگان هنگام ساخت ماژولهای خود، دسترسی به ماژولهای اشخاص دیگر را هم نیاز دارند. با توجه به اینکه Cosmos-SDK یک فریمورک متنباز است، برخی از ماژولها ممکن است مخرب باشند؛ این یعنی باید اصول و قواعد امنیتی برای استدلال در مورد تعاملات بین ماژولها وجود داشته باشد. این اصول مبتنی بر قابلیتهای اشیا (Object-Capabilities) هستند. این بدان معنی است که هر ماژول به جای اینکه یک لیست کنترل دسترسی برای ماژولهای دیگر داشته باشد، اشیای خاصی به نام نگهدارنده (Keepers) را پیادهسازی میکند که میتواند به ماژولهای دیگر منتقل شود و مجموعهای از قابلیتهای از پیش تعریفشده را ارائه دهد.
ماژولهای SDK در فولدر x آن تعریف شدهاند. علاوه بر ماژولهای موجود در x که هر کسی میتواند در برنامه خود از آنها استفاده کند، SDK به شما امکان ساخت ماژولهای سفارشی خودتان را هم میدهد. برخی از ماژولهای اصلی عبارتند از:
- Auth. برای اعتبارسنجی اکانتها و تراکنشها استفاده میشود.
- Bank. برای فعال کردن توکنها و انتقال آنها کاربرد دارد.
- Staking. لایه گواه اثبات سهام را برای بلاکچینهای عمومی فعال میکند.
- Slashing. برای مکانیزم مجازات اعتبارسنجها استفاده میشود.
- Capability. برای پیادهسازی قابلیت اشیا به کار میرود.
- Crisis. برای متوقف کردن بلاک چین تحت شرایط خاص کاربرد دارد.
- Distribution. نحوه توزیع کارمزدها و پاداش استیک کردن را مشخص میکند.
- Evidence. برای بررسی شواهد و مدارک دوبار امضا کردن، رفتارهای نادرست و غیره استفاده میشود.
- Governance. حاکمیت On Chain را فراهم میکند که به کمک آن میتوان پیشنهاد ارائه و برای آن رایگیری کرد.
- Mint. برای ایجاد توکنها به کار میرود.
- Upgrade. مدیریت و هماهنگی ارتقاء نرمافزارها را انجام میدهد.
جمعبندی
اگر بخواهیم به طور خلاصه بیان کنیم، ما یک موتور اجماع به نام تندرمینت داریم که در پایینترین لایه قرار دارد. بر روی تندرمینت، Cosmos-SDK وجود دارد که یک فریمورک متنباز و ماژولار است و برنامههای غیرمتمرکز در بالاترین لایه و روی SDK وجود دارند. شما میتوانید بلاکچین عمومی یا خصوصی خودتان را با ترکیبی از ماژولهای موجود بسازید یا اگر به ماژول دیگری نیاز دارید، آن را ایجاد کرده و در کنار سایر ماژولها از آن استفاده کنید. با کامل شدن کتابخانه ماژولها، ایجاد برنامههای پیچیده نیز به سادگی ممکن میشود. در این مقاله به معرفی این که فریمورک Cosmos SDK چیست و چه ساختار و ماژولهایی دارد پرداختیم. نظر شما در رابطه با Cosmos-SDK چیست؟ آیا در آينده اکثر برنامهها به استفاده از آن روی میآورند؟