عبارت «قرارداد هوشمند» برای مفاهیم متنوع و مختلفی استفاده شده است که همه آنها به این حوزه مربوط نمیشوند. برای مثال، اولین استفاده از این عبارت به سال ۱۹۹۷ برمیگردد که نیک زابو (Nick Szabo) از آن برای تعریف اشیائی فیزیکی استفاده کرد که بر اساس دادههای مشخص، رفتار خود را تغییر میدهند. اخیرا نیز از این عبارت برای تعریف یه مفهوم کاملا متضاد استفاده شده است؛ محاسبات بر روی یک بلاک چین که تحت تاثیر عوامل خارجی – برای مثال آب و هوا – قرار میگیرد. اجازه دهید فعلا چنین تعریفهایی را کنار بگذاریم.
در این مقاله میخواهیم از عبارت «قراردادهای هوشمند» در مفهوم «محاسبات کلی که روی یک بلاک چین انجام میشوند» استفاده کنیم. این مفهوم از زمان راهاندازی اتریوم محبوب و رایج شد. در وایت پیپر اتریوم نوشتهشده است «یک پلتفرم نسل بعدی قراردادهای هوشمند و اپلیکیشن غیرمتمرکز». از آنجایی که اتریوم توجه زیادی را به خود جلب کرد، این مفهوم بسیار متداول شد و بانکها و سایر توسعهدهندگان شروع به کار بر روی اثبات مفهوم (Proof of Concept) قراردادهای هوشمند کردند. البته، از آنجایی که موضوع صحبتهای ما موسسات مالی قانونی است، این مفهوم بیشتر مربوط به حوزه بلاک چینهای خصوصی یا مجاز است که دارای یک مجموعه محدود از اعضای شناختهشده هستند. بنا بر دلایل شناخته شده، بلاک چینهای عمومی علیرغم نبوغ خود هنوز برای اهداف سازمانی مناسب نیستند.
بررسی قراردادهای هوشمند
آیا برای قرارداد هوشمند در بلاک چین خصوصی آینده روشنی در پیش است؟
به نوعی بله، اما نه کاملا. مشکل بلاکچینهای خصوصی در این است که قراردادهای هوشمند در آنها، ۴ ایده خوب را با ۱ ایده بد ترکیب میکنند.
ایدههای خوب را میتوان اینگونه شرح داد:
۱. ارائه منطق تجاری به شکل یک برنامه کامپیوتری
۲. نمایش عواملی که این منطق را فعال میکنند به صورت پیامهایی که به برنامه ارسال میشوند
۳. استفاده از امضاهای دیجیتال که نشان میدهد چه کسی پیام را ارسال کرده است
۴. قرار دادن تمام موارد بالا در بلاک چین
و اما ایده بد در بلاک چینهای خصوصی، اجرای هر برنامه برای هر پیام روی هر نود بلاک چین است. به بیان دیگر، به جای استفاده از بلاک چین بهعنوان محل ذخیره برنامهها و پیامها، اجرای تمام برنامهها به کار اصلی بلاک چین تبدیل میشود. با این حال این اجرای سراسری، دلیل اصلی پیدایش و خلق اتریوم است.
اگر از ماهیت قطعی محاسبات آگاه هستید، از مسئله توقف (Halting Problem) نیز آگاه هستید و متوجه میشوید که چگونه وابستگی داده مانع همروندی میشود و به احتمال زیاد تا به حال قانع شدهاید. اگر نه، برای درک بهتر و بررسی مطلب به صورت عمیقتر، در این مقاله با میهن بلاکچین همراه باشید.
درک اتریوم
برای درک قراردادهای هوشمند به سبک اتریوم، ابتدا باید از بیت کوین، اولین و همچنان محبوبترین بلاک چین عمومی، شروع کنیم. بلاکچین بیت کوین در اصل تنها برای یک هدف طراحی شده است؛ انتقال ارز دیجیتال بیت کوین از یک فرد به فرد دیگر. اما پس از راهاندازی و شروع به کار، افراد برای اهداف دیگری مانند داراییهای دیجیتال و معتبرسازی اسناد، شروع به جایگذاری «فراداده» (Metadata) در تراکنشها کردند. علیرغم اینکه برخی از طرفداران بیت کوین با چنین کاربردهایی مخالف بودند، با رشد تصاعدی این استفادهها در ماه مارس ۲۰۱۴ یک مکانیسم رسمی برای فراداده معرفی شد.
همزمان با ساخت پروژهها بر بستر بلاک چین بیت کوین، تعداد زیادی بلاک چین عمومی نسل بعد مانند NXT، بیتشیرز (Bitshares)، استلار و ریپل، توسعه و راهاندازی شدند. این بلاک چینها از ابتدا برای اهداف و فعالیتهای گستردهتر مانند داراییهای خلقشده توسط کاربر، صرافیهای غیرمتمرکز و وامگیری با وثیقه، طراحی شده بودند. هر کدام از این بلاک چینها مجموعه ویژگیهای متفاوتی دارند که توسط توسعهدهنده آن مشخص شده است و زمانی که یک ویژگی جدید به بلاک چین اضافه میشود، تمام کاربران باید آن را بروزرسانی کنند.
ویتالیک بوترین (Vitalik Buterin) که در تعدادی از این پروژهها فعالیت داشته است، یک سوال بسیار خوبی را پرسید؛ به جای تعدادی زیادی از بلاک چینهای تخصیصشده به برنامههای ویژه، چرا یک بلاک چین عمومی را که پاسخگوی تمام نیازهای ما باشد، طراحی نکنیم؟ این ابربلاکچین، بینهایت قابل گسترش خواهد بود و تنها در تخیل کاربران آن محدود خواهد شد. جامعه ارزهای دیجیتال تقریبا با این ایده قدرتمند متقاعد شدند و درنتیجه با جذب ۱۸ میلیون دلار سرمایه عمومی و با شور و شوق بسیار، اتریوم خلق شد.
اتریوم یک بلاک چین عمومی جدید است که همانند صدها بلاک چین قبل از خودش، دارای یک ارز دیجیتال اختصاصی به نام «اتر» (Ether) است. اتریوم به هر فردی این امکان را میدهد که یک «قرارداد» بر روی بلاک چین ایجاد کند. قرارداد یک برنامه کامپیوتری با یک پایگاه داده یا دیتابیس کوچک مرتبط است که تنها توسط برنامهای که مالک آن است، قابل تغییر است. اگر یک کاربر بلاک چین بخواهد یک دیتابیس را تغییر دهد، باید یک پیامی را که به صورت دیجیتالی امضا شده است به قرارداد خود ارسال کند. کد قرارداد، پیام را بررسی کرده و تصمیم میگیرد که چگونه و چه واکنشی به این پیام دهد. (این کپسولهسازی کد و داده، اساس برنامهنویسی شیءگرا نیز هست.)
قراردادهای اتریوم را میتوان در زبانهای برنامهنویسی مختلف جدید مانند سالیدیتی (Solidity) و سرپنت (Serpent) نوشت. مشابه اکثر زبانهای برنامهنویسی، این زبانها نیز تورینگ کامل (Turing complete) هستند؛ یعنی میتواند هر گونه رایانش همهمنظوره را انجام دهد. یک ویژگی منحصربفرد زبانهای تورینگ کامل ساختار حلقهای (Loop) آنها است که یک عملیات را به طور متناوب تکرار میکند تا هدفی را تکمیل کند. بهعنوان مثال از لوپ میتوان برای پرینت اعداد ۱ تا یک میلیون استفاده کرد، بدون آنکه نیاز به یک میلیون خط کد باشد. برای کارایی بهتر، برنامههای نوشتهشده برای اتریوم قبل از آنکه در زنجیره ذخیره شوند به بایتکدهای فشردهتر تبدیل میشوند. نودهای اتریوم میتوانند این بایتکد را به وسیله یک ماشین مجازی که یک کامپیوتر شبیهسازی شده در داخل یک کامپیوتر واقعی است، اجرا کنند.
وقتی یک قرارداد اتریوم بر روی بلاک چین ساخته میشود، حالت (State) اولیه دیتابیس خود را ایجاد میکند. سپس متوقف میشود و تا زمانی که احضار شود، بدون هیچ فعالیتی منتظر میماند. زمانی که یک کاربر بلاک چین (یا قرارداد دیگر) پیام خود را در یک تراکنش ارسال میکند، قرارداد شروع به فعالیت میکند. بسته به کد، میتواند منبع پیام را شناسایی کرده، قراردادهای دیگر فعال کرده و با تغییر دیتابیس خود به کاربر پاسخ دهد. تمام این مراحل به صورت مستقل در هر نود شبکه اجرا شده و نتایج کاملا یکسانی ظاهر میشوند.
بهعنوان مثال، یک قرارداد ارز دیجیتال فرعی ساده یک دیتابیسی از موجودی کاربران برای یک دارایی خاص را ایجاد میکند. اگر پیامی مبنی بر انتقال داراییها از فردی به فرد دیگر دریافت کند، ابتدا بررسی میکند که پیام توسط ارسالکننده امضا شده باشد. سپس بررسی میکند که ارسالکننده موجودی کافی داشته باشد. در مرحله سوم، در دیتابیس داراییها را از حساب ارسال کننده به حساب دریافت کننده منتقل میکند و نهایتاً پاسخ میدهد که عملیات با موفقت انجام شد. البته ما برای این کار به اتریوم نیاز نداریم. زیرا یک بلاک چین ساده به سبک بیت کوین که از نوعی دارایی پشتیبانی میکند، میتواند این کار را انجام دهد. اتریوم در برهان تجاری چندمرحلهای پیچیده ماند تامین مالی جمعی، صرافیهای غیرمتمرکز و ساختارهای مدیریتی سلسلهمراتبی کاربرد دارد.
شیوه کار قراردادهای هوشمند اتریوم
اکنون که از شیوه کار قراردادهای هوشمند اتریوم آگاه شدیم، میتوانیم کار آنها را به ۵ بخش اصلی تقسیم کنیم:
۱. بیان منطق تجاری بهعنوان برنامههای کامپیوتری
۲. نمایش رویدادهایی که برهان را تحریک و فعال میکنند به شکل پیامهای وارده به برنامهها
۳. استفاده از امضاء دیجیتال برای اثبات فرستنده پیام
۴. قراردادن برنامهها، پیامها و امضاها بر روی بلاک چین
۵. اجرای هر برنامه برای هر پیام بر روی هر نود
همانطور که در ابتدای مقاله اشاره شد، بخشهای ۱ تا ۴، ایدههای بسیار خوبی هستند. بیایید دو بخش اول را که چندان هم جدید نیستند، بررسی کنیم. بر خلاف قراردادهای قانونی که میتوانند به شکلهای متفاوت تفسیر شوند، برنامههای کامپیوتری کاملا بدون ابهام هستند. برای هر برنامهای که با یک زبان برنامهنویسی بهخوبی تعریف شده باشد، یک ورودی همیشه به یک خروجی منتهی میشود. پس اگر یک برهان تجاری به صورت یک برنامه کامپیوتری بیان شود و رویدادها بهعنوان پیامهایی که به برنامه وارد میشوند، نمایش داده شوند، نتیجه تجاری ثابت و بدون تغییر خواهد بود. در واقع این ویژگی رایانش قطعی، تصادفیبودن را به یک مشکل دشوار در علم کامپیوتر تبدیل میکند که حتی متخصصان گوگل را نیز میتواند دچار اشتباه کند.
کارایی امضاهای دیجیتال و بلاک چینها چیست؟ با وجود اینها نیازی به یک مرجع مرکزی برای تعیین اینکه کدام پیامها در چه ترتیبی و توسط چه کسانی ارسال شدهاند، نیست. در عوض هر کاربر یک کلید عمومی و خصوصی ایجاد میکند و کلید عمومی خود را تنها یک بار به دیگر کاربران میدهد. سپس، پیام خود را قبل از انتشار به شبکه، با کلید خصوصی خود امضا میکند. پس از آن کاربر دیگر میتواند تنها با استفاده از کلید عمومی فرستنده پیام، منبع پیام را تایید کند. نهایتاً، با قراردادن برنامه و پیامهای امضاشده بر یک بلاک چین، هر کاربر به صورت مشابه میتواند ببیند چه کسی در چه زمانی چه کاری را انجام داده است. با توجه به رایانش قطعی، کاربران نمیتوانند با نتیجه تجاری نهایی مخالفت کنند.
اما ایده آخر چطور؟ اینکه هر نود هر برنامه را برای هر پیام اجرا میکند؟ این همان بخش مناقشهانگیز است. زیرا این اجرای سراسری با اینکه خوب است، اما نیازی به وجود آن نیست. از آنجایی که رایانش قطعی است، فرقی نمیکند که برنامه توسط یک نود، هر نود و یا توسط فرایند خارجی اجرا شود. و مهم نیست که این اتفاق در زمان واقعی، در زمان تقاضا و یا ۱۰ سال دیگر اتفاق بیفتد. نتیجه رایانش همیشه یکسان خواهد بود. و اگر اینگونه پیش نرود، قطعا مشکلی در نرمافزار بلاک چین و شبکه وجود دارد.
مشکل در رایانش
وقتی اهمیتی ندارد که رایانش و محاسبات در کجا انجام میشود، چرا آن را همه جا انجام ندهیم؟ خب، ظاهراً برنامههای کامپیوتری غیرقابلپیشبینی هستند. برخی از برنامهها ممکن است زمانی زیادی برای اجرا نیاز داشته باشند. و گاها تا مدت زیادی فعال باقی میمانند. مثال زیر را که به LCG معروف است، درنظر بگیرید:
۱. X را به دلخواه یک عدد تک رقمی درنظر بگیرید
۲. Y را 123*x+567 در نظر بگیرید
۳. X را دو رقم آخر Y قرار دهید (X برابر است با باقیمانده تقسیم Y بر ۱۰۰)
۴. اگر X بزرگتر از عدد ۲ است، به مرحله ۲ برگردید
۵. در غیر اینصورت محاسبات را متوقف کرده و مقدار X را بدست بیاورید
ساده به نظر میآید. اما سوالی که پیش میان این است؛ آیا این برنامه به پایان میرسد؟ و یا در یک چرخه بینهایت گیر خواهد کرد؟ پاسخ این است که بستگی به مقدار اولیه X دارد.
اگر X، عددهای ۰، ۱، ۲، ۵، ۶، ۷، یا ۸ باشد، برنامه سریعاً متوقف میشود. اما اگر X عددهای ۳، ۴، یا ۹ باشد تا بینهایت ادامه پیدا میکند.
طبیعی است که تنها با نگاه کردن به کد، متوجه این مسئله نشوید. زیرا نه تنها فهمیدن این مسئله برای افراد سخت است، بلکه برای کامپیوترها غیرممکن است. مسئله تشخیص اینکه آیا اجرای یک برنامه پایان خواهد یافت یا نه، مسئله توقف نام دارد. در سال ۱۹۳۶ آلن تورینگ، مخترع تورینگ کامل، ثابت کرد که این مسئله در موارد کلی قابل حل نیست. بدون درنظر گرفتن استثناها، تنها راه فهمیدن اینکه آیا اجرای یک برنامه پایان خواهد یافت یا نه، اینست که برنامه تا زمان متوقف شدنش اجرا شود و این میتواند تا ابد طول بکشد.
برای ماها که ترجیح میدهیم بدون صفحههای آبی مرگ و ارورها زندگی کنیم، این مسئله کمی آزاردهنده است. اما اکثر نرمافزارها در بیشتر اوقات به خوبی کار می کنند. و اگر مشکلی پیش بیاید، سیستمهای عامل مانند ویندوز به ما اجازه بستن برنامهها به صورت دستی را میدهد. اما چنین کاری در یک بلاک چین مانند اتریوم قابل انجام نیست. اگر به نودهای مختلف اجازه دهیم تا به اختیار خود رایانشها و محاسبات را پایان دهند، نودهای مختلف نظرات مختلفی برای نتایج رایانشها خواهند داشت. به بیان دیگر، اجماع شبکه از بین خواهد رفت. پس راهحل چیست؟
جواب اتریوم بر اساس کارمزهای تراکنش یا گس (Gas) است. ارسالکننده هر تراکنش برای رایانشهایی که باعث راهاندازی آن میشود، هزینهای را پرداخت میکند و این هزینه توسط ماینری که تراکنش را در بلاک تایید میکند، دریافت میشود. به بیان دقیقتر، هر تراکنش اتریوم از قبل مشخص میکند که چه مقدار از اترهای فرستنده میتواند برای پردازش تراکنش صرف شود. کارمزد تراکنش قدم به قدم و همزمان با فعالیت قرارداد در ماشین مجازی اتریوم مصرف میشود. اگر کارمزد تراکنش قبل از پایان فرایند تمام شوند، تغییرات دیتابیس بازگشت داده میشود اما کارمزد قابل بازگشت نیست. اگر تراکنش با موفقیت انجام شود، کارمزد باقیمانده به فرستنده بازگشت داده میشود. در این صورت، تراکنشها تا زمانی شبکه را تحت فشار قرار میدهند که مایل به پرداختن کارمزد آنها باشد. قطعا این یک راهحل اقتصادی بینقص است اما برای کارکردن، به یک ارز بلاک چین بومی نیازمند است.
تقابل قراردادهای هوشمند با مفهوم همزمانی
اگر گس میتواند جلوی رایانش غیرقابلکنترل را بگیرد، آیا میتوان گفت که مشکل قراردادهای هوشمند حل شده است؟
خب، نه کاملا. چون یک مشکل دیگری نیز در رابطه با قراردادهای هوشمند وجود دارد:
قراردادهای هوشمند در شرایط وجود نرخ بالای تراکنش بد عمل میکنند.
همزمانی یکی از اساسیترین مسائل در معماری کامپیوتر است. اگر یک سیستم اجازه اجرای چندین پردازش را به طور همزمان و در هر ترتیبی بدهد، از همزمانی خوبی برخوردار است. یک سیستمهای همزمان با استفاده بهینه از تکنولوژهایی مانند برنامهریزی فرایند، پردازش موازی و پارتیشنبندی دادهها، تاخیرها را کاهش داده و به طور کلی توان عملیاتی بیشتری را ارائه میدهند. این همان ویژگی است که گوگل با استفاده از آن میتواند ۳۰ تریلیون وبسایت را تنها در یک ثانیه، تقریباً ۱۰۰ هزار بار جستجو کند.
در هر سیستم کامپیوتری، یک مجموعه تراکنش تنها زمانی میتوانند به صورت همزمان پردازش شوند که به هم وابسته نبوده و با یکدیگر تداخل داشته نباشند. در غیر این صورت، دستورهای پردازش مختلف به نتایج متفاوت منجر میشوند. حال در نظر بگیرید که قراردادهای هوشمند دارای یک دیتابیس مرتبط هستند و رایانشهای همهمنظوره از جمله لوپها را پردازش میکنند. این یعنی یک قرارداد هوشمند ممکن است در پاسخ به یک پیام خاص، تمام اطلاعات را خوانده یا در دیتابیس خود بنویسد. برای مثال، اگر یک ارزی را اداره میکند، شاید بخواهد سودی به تمام نگهدارندههای آن ارز بدهد. البته همیشه اینگونه نخواهد بود، ما مشکل این است که قبل از اجرای برنامه قرارداد برای یک پیام خاص، یک نود بلاک چین نمیتواند پیشبینی کند که قرار است از کدام زیرمجموعه دیتابیس قرارداد استفاده کند. حتی نمیتواند تشخیص دهد که این زیرمجموعه در شرایط مختلف متفاوت بوده است یا خیر. و اگر یک قرارداد بتواند قرارداد دیگری را تحریک کند، این مشکل به کل محتوای دیتابیس تمام قراردادها گسترش خواهد یافت. در نتیجه با هر تراکنش باید به گونهای رفتار شود که گویی ممکن است با تراکنشهای دیگر تداخل داشته باشد. به اصطلاح، هر تراکنش نیازمند یک قفل سراسری است.
به دنیایی که یک نود بلاک چین در آن قرار دارد فکر کنید. از آنجایی که یک صف مدیریتشده مرکزی وجود ندارد، تراکنشها از نودهای دیگر و بدون هیچ ترتیب خاصی میآیند. علاوه بر این، در میانگین فواصل بین 12 ثانیه (اتریوم) و 10 دقیقه (بیتکوین)، یک بلاک جدید ظاهر میشود و مجموعهای از تراکنشها را در یک ترتیب خاص تأیید میکند. یک نود احتمالاً اکثر تراکنشهای یک بلاک را از قبل خواهد دید، اما ممکن است برخی از تراکنشها جدید باشند. در هر صورت، ترتیب تراکنشها در یک بلاک به ترتیب ورود آنها نخواهد بود. و از آنجایی که ترتیب تراکنشها در نتیجه اثر میگذارد، تا زمانی که ترتیب تراکنشها در بلاک چین تایید نشوند، تراکنشها پردازش نخواهند شد.
درست است که یک تراکنش تاییدنشده بیت کوین به دلیل دوبار خرج کردن (Double spend) احتمالا نیاز به بازگشت داشته باشد. اما یک تراکنش تاییدنشده اتریوم هیچ نتیجه قابلپیشبینی ندارد. در واقع پیادهسازیهای فعلی اتریوم تراکنشهای تاییدنشده را پردازش نمیکنند. اما اگر یک نود اتریوم بخواهد تراکنشها را سریعاً پردازش کند، باز هم باید آنها را به عقب برگرداند و هنگام وارد شدن یک بلاک، آنها را به ترتیب صحیح دوباره پردازش کند. این پردازش دوباره یک اتلاف زحمت بزرگ است و از خواندن همزمان دیتابیس اتریوم هنگام اجرا توسط پروسههای خارجی جلوگیری میکند (اگر بخواهیم صادق باشیم، در واقع پیادهسازی مرجع – Refrence Implementation – بیتکوین نیز هنگام ورود یک بلاک، تراکنشها را به عقب برمیگرداند و دوباره پردازش میکند. اما این تنها به دلیل بهینهسازی ناکافی رخ میدهد.)
مدل تراکنش بیت کوین چگونه است که اجرای خارج از ترتیب را ممکن میکند؟ در بیت کوین هر تراکنش ارتباط خود با تراکنش دیگر را به صراحت نشان میدهد. هر کدام دارای مجموعهای از ورودیها و خروجیها هستند که هر ورودی با خروجی تراکنش قبلی که «خرج میکند»، مرتبط است. هیچ وابستگی دیگری وجود ندارد. تا زمانی که دو تراکنش بیت کوین قصد خرج کردن خروجی یکسانی را نداشته باشند و تا زمانی که خروجی یک تراکنش به ورودی تراکنش دیگر منجر نشود، یک نود بیت کوین میتواند مطمئن شود که تراکنشها مستقل هستند و میتواند تراکنشها را در هر ترتیبی پردازش کند. جایگاه نهایی تراکنشها در بلاک چین مهم نیست.
اگر بخواهیم از اصطلاحات علوم کامپیوتر استفاده کنیم، تراکنشهای اتریوم باید مرتب به کلی اکید (Strictly Totally Ordered) باشند. به این معنی که، ترتیب نسبی بین هر جفت تراکنش باید مشخص شود. بر خلاف اتریوم، تراکنشهای بیت کوین یک گراف جهتدار غیرمدور (DAG) شکل میدهند که تنها قسمتی از آن دارای ترتیب است. یعنی وجودی مقداری ابهام در ترتیب تراکنش، مجاز است. در مورد همزمانی، این ویژگی تفاوت بسیار زیادی ایجاد میکند.
در نگاه دقیقتر، صحبتهای زیادی درباره بلاک چینهای خصوصی میشود. اما یک بلاک چین خصوصی تنها یک دیتابیس توزیعشده با تعدادی ویژگی اضافی است. و اگر امروزه تلاش کنید یک دیتابیس در سطح سازمانی را که از همزمانی پشتیبانی نمیکند بفروشید، به شما خواهند خندید. همچنین اینکه یک نود قبل از دیدن نتایج تراکنشهای خودش باید ۱۲ ثانیه صبر کند، به همان اندازه مضحک است. ویتالیک بوترین اخیراً توییتی را با این متن منتشر کرد:
مزایای اتریوم
ممکن است این سوال برای شما نیز پیش بیاید که وقتی هر نود به سادگی میتواند برنامه موردنظر خود را انتخاب کند، چرا خالقان اتریوم وجود یک برنامه اجرایی سراسری در دیتابیس توزیعشده عمومی را ضروری دانستند؟ آیا دلایل خوبی برای روش اتریوم وجود دارد؟
در حقیقت، زمانی که درباره بلاک چینهای عمومی صحبت میکنیم، ظاهراً دلایل خوبی وجود دارد. اما برای درک بهتر این دلایل باید مکانیسم شبکه اتریوم را بررسی کنیم.
جلوگیری از تراکنشهای اسپم
بلاک چین دارای یک شبکه همتا به همتا است که در آن هر نود به طور تصادفی به یک زیرمجموعهای از نودهای دیگر متصل میشود. زمانی که یک تراکنش جدید در یک نود ایجاد میشود، از طریق فرایندی به نام «رلهشدن یا تقویتشدن» (relaying) سریعاً به نودهای دیگر پخش میشود. در یک شبکه عمومی باز، هر کسی میتواند تراکنش ایجاد کند. در نتیجه ما باید با یک روش، از خودمان در برابر تراکنشهای اسپم که ممکن است به سیستم آسیب بزنند محافظت کنیم. از آنجایی که شبکه غیرمتمرکز است، این محافظت تنها زمانی انجام میشود که تک تک نودها تراکنشهای جدید را ارزیابی کنند و تصمیم بگیرند که تراکنش تقویت کنند یا خیر. با اینکه این روش از آسیب به یک نود جلوگیری نمیکند، اما از کل شبکه محافظت میشود.
در شبکه عمومی، یه معیار مهم برای اینکه یک نود تصمیم بگیرد یک تراکنش جدید را تقویت کند یا نکند، نسبت کارمزد آن به هزینه آن برای شبکه است. در مورد بیت کوین، این هزینه عمدتاً بر اساس حجم خام تراکنش بر حسب بایت است. در اتریوم بر اساس توان رایانشی که برای تراکنش مصرف خواهد شد، یک فرمول پیچیدهتر استفاده میشود. در هر صورت، کارمزدها به عنوان یک مکانیسم مبتنی بر بازار در برابر تراکنشهای اسپم عمل میکنند.
اما یک نود چگونه تشخیص میدهد که آیا فرستنده موجودی کافی برای پرداخت کارمزد دارد یا خیر؟ در مورد اتریوم، از آنجایی که قراردادها میتوانند هم اتر خرج کرده و هم پرداخت کنند، موجودی اتر کاربران تحتتاثیر نتیجه تراکنشهای قبلی قرار میگیرد. در واقع بدون اجرای تمام برنامهها برای تمام پیامهای اخیر، یک نود اتریوم راهی برای اطلاع از موجودی بهروز کاربر نخواهد داشت. در نتیجه، نمیتواند ارزیابی کند که آیا تراکنش باید به نودهای دیگر رله شود یا خیر. و بدون آن، شبکه باز کارایی خود را از دست میدهد.
اثباتهای فشرده داده
در یک بلاک چین، بلاکها عمدتاً از تراکنشهایی تشکیل شدهاند که تایید میشوند. با این حال، هر بلاک دارای یک «هدر» (Header) فشرده است که اطلاعات مهمی مانند یک برچسب زمانی و یک لینک به بلاک قبلی در بردارد. برای بلاک چینهای عمومی که بر اساس هشینگ اثبات کار هستند، ورودی الگوریتم هشینگ تنها همین هدر بلاک است. این یعنی دستورات یک زنجیره را میتوان بدون دانلود بیشتر محتوای آن، به وسیله یک کلاینت سبکوزن ارزیابی کرد. برای مثال تا نوامبر ۲۰۱۵، حجم مجموعه کامل هدرهای بیت کوین ۳۰ مگابایت است، در حالی که حجم کل زنجیره ۴۵ گیگ است. این یعنی نسبت ۱ به ۱۵۰۰ که برای موبایلهایی با پهنای باند و حافظه محدود، تفاوت بسیار زیادی ایجاد میکند.
هدر هر بلاک اتریوم شامل یک «ریشه حالت – State root» است که پس از پردازش تراکنش در بلاک، وضعیت زنجیره را انگشت نگاری میکند. این وضعیت، محتوای دیتابیس تمام قراردادها را شامل می شود و انگشت نگاری با استفاده از یک درخت توابع هش یکطرفه به طور موثر انجام میشود. هرگونه تغییر جزئی در دیتابیس قرارداد منجر به حالت ریشه کاملا متفاوت میشود و ریشه محتویات دیتابیس را پیوند میدهد. (مفهومی معادل «تعهدات UTXO» برای بیت کوین در نظر گرفته شده اما هنوز اجرا نشده است)
این روش درختمانند محاسبه ریشههای حالت، یک مزیت مهم دارد: در مورد یک ریشه حالت شناختهشده، ارزش یک ورودی مشخص در دیتابیس یک قرارداد را میتوان بهصورت موثر اثبات کرد. اندازه این اثبات به عمق درخت دودویی یا باینری (Binary tree) بستگی دارد که برگهای آن ورودیهای دیتابیس، یعنی log2 حجم کل دیتابیس است. این یعنی برای هر ورودی زمانی که اندازه دیتابیس ۴ برابر میشود، طول اثبات فقط ۲ برابر میشود. این همان مقیاس مدنظر دانشمندان کامپیوتر است. حال توجه کنید که ریشه حالت هر بلاک در هدر آن است که میتواند توسط یک کلاینت سبکوزن تایید شود. در نتیجه، کلاینتهای سبکوزن میتوانند به طور امن و کارآمد هر نود کامل شبکه را از نظر ورودیهای دیتابیس بررسی کنند و نود کامل نمیتواند اطلاعات اشتباه بدهد.
اما اگر هدر بلاک چین شامل یک ریشه حالت باشد و ریشه حالت به محتوای دیتابیس وابسته باشد، هر نود باید دیتابیس بلاک چین را بهروز نگ هدارد. و این یعنی اجرای هر قرارداد برای هر پیغامی که تا کنون دریافت کرده است. بدون این عمل، یک نود ماینینگ نمیتواند ریشه حالت را در یک هدر بلاک قرار دهد و نودهای دیگر نیز نمیتوانند بلاکهایی را که دریافت کردهاند، تایید کنند. نکته مهم این است که، اگر بخواهیم کلاینتهای سبکوزن اثباتهای داده فشرده را به راحتی ازشبکه بازیابی کنند، نودهای کامل باید تمام رایانش تعریفشده توسط داده زنجیره را اجرا کنند.
بلاک چینهای خصوصی
بیایید این دو مبحث را در محتوای بلاک چینهای خصوصی نیز بررسی کنیم. اولین نکته در رابطه با بلاک چینهای خصوصی این است که آنها یک توکن یا ارز بومی ندارند. این موضوع دلایل مختلفی دارد:
- نهادهایی که بلاک چینهای خصوصی علاقهمند هستند نمیخواهند با یک نوع دارایی جدید سروکله بزنند.
- مدل اجماع بلاک چینهای خصوصی به جای اثبات کار، بیشتر بر اساس یک توافقنامه بین ماینرها است. در نتیجه هزینه استخراج کم است و ماینرها نیاز چندانی به پاداش ندارند.
- از آنجایی که تمام اعضای یک زنجیره خصوصی به دقت بررسی شده و انتخاب شدهاند، نگرانی چندانی درباره سوءاستفاده و اسپم وجود ندارد.
به یاد بیاورید که اولین مبحث اجرای سراسری این بود که هر نود بتواند تصمیم بگیرد که با توجه به کارمزد، یک تراکنش دریافتشده را تقویت کند یا خیر. نبود یک توکن بومی این دلیل را کمی بیربط میکند. زیرا اگر یک بلاک چین توکن بومی نداشته باشد، تراکنشها نمیتوانند کارمزدها را پرداخت کنند. اگر به هردلیلی مشکل اسپم رفع نشود باید از طریق روشهای دیگر مانند لغو اجازههای فرستنده، کنترل شود.
اکنون بیایید مبحث دوم، یعنی اثباتهای داده فشرده را بررسی کنیم. کاربران یک بلاک چین عمومی بیشتر کاربران موبایل و یا کیف پولهای سبک هستند. اما این برای بلاک چینهای خصوصی چندان ممکن نیست زیرا کاربرد اصلی این بلاک چینها اشتراکگذاری دیتابیس بین شرکتهای بزرگتر است. و اگر از طریق موبایل بتوان به بلاک چین دسترسی داشت، به احتمال زیاد کاربران موبایل از مشتریان این شرکتها هستند و میتوانند به گفته آنها اعتماد کنند.
در بلاک چینهای خصوصی مشکلات اجرای سراسری بسیار حادتر هستند. اگر یک بلاک چین خصوصی توکن بومی نداشته باشد، هیچ مکانیسم بازار مبتنی بر گس و کارمزد برای جلوگیری از کدهای آسیبزا وجود ندارد. در عوض باید یک حد ثابت برای مراحل رایانش در هر تراکنش معرفی شود. اما برای اینکه تراکنشها بتوانند با اختیار پردازشهای زیادی را انجام بدهند، این حد باید زیاد باشد. در نتیجه، شبکه ممکن است قبل از پایان دادن به لوپهای ناخواسته، انرژی زیادی را روی آنها صرف کند.
در مورد همزمانی، بلاک چینهای خصوصی بیشتر شاهد حجم تراکنشهایی هستند که همزمانی برای آنها ضروری است. ظرفیت بلاک چینهای عمومی محدود است زیرا بلاک چینهای عمومی برای متمرکزشدن به معنای واقعی کلمه، به هزاران نود نیاز دارند که توسط افراد علاقهمند با بودجه محدود اداره میشوند. بر خلاف بلاک چینهای عمومی، بلاک چینهای خصوصی فقط چندین سازمان را به یکدیگر مرتبط میکنند که ظرفیت و سرعت برای آنها مهم است.
بلاک چینهای دولایه
اگر مبانی قراردادهای هوشمند در زنجیرههای خصوصی معنا پیدا میکنند، جدا از اجرای سراسری، به چه نتیجهای میتوان رسید؟ چه نوع بلاک چینی عملکرد و انعطافپذیری مدنظر را به ما خواهد داد؟ یکی از پاسخها بلاک چینی است که دو سطح یا لایه دارد.
سطح پایینتر در سبک بیت کوین ساخته میشود که تراکنشها به سرعت و همزمان پردازش میشوند و نیازی به انتظار برای تایید بلاک نیست. این تراکنشها میتوانند بدون مراجعه به قراردادهای هوشمند، جابجاییهای ساده ارزها از جمله مبادلههای بدون واسطه یا اتمیک را انجام دهند. همچنین این سطح برای برنامهها و پیامهایی که حاوی فرایندهای تجاری پیچیده هستند و به شکل فراداده تراکنش درآمدهاند، به عنوان یک لایه حافظه کور عمل میکند.
برای سطح بالاتر این نوع بلاک چین، هر کاربر شبکه برنامهای را که قصد اجرای آن را دارد انتخاب میکند. بعضی از کاربران شاید هیچ برنامهای را اجرا نکنند و تنها قصد انجام جابجاییهای ساده دارایی را داشته باشند. برخی از کاربران نیز ممکن است گروه کوچکی از برنامهها را که با فرایندهای داخلی آنها مرتبط است، اجرا کنند (با آگاهی از اینکه این گروه، پیغامی با برنامههای خارجی رد و بدل نمیکند). برخی نیز ممکن است از اجرای سراسری استفاده کرده و همانند اتریوم هر پیام برای هر برنامه را پردازش کنند. اما نکته مهم این است که هر نود تنها کد موردنیاز خود را راهاندازی میکند. در علم کامپیوتر این تکنیک «ارزیابی تنبل – Lazy Evaluation» نام دارد زیرا با حداقل میزان کار و بدون حذف موارد مهم انجام میشود. با تکنیک ارزیابی تنبل، اگر رایانش و محاسبات یک بلاک چین اشتباه پیش برود، تنها نودهایی که حقیقتاً آن برنامه را اجرا میکنند متوجه این مشکل خواهند شد. خود شبکه هیچ مشکلی را حس نخواهد کرد.
قراردادهای هوشمند در بلاک چینهای عمومی
همانطور که قبلتر اشاره شد، در بلاک چینهای عمومی تورینگ کامل مانند اتریوم، دلایل خوبی برای اجرای سراسری وجود دارد. اما سوال دیگری پیش میآید: کاربرد سازمانی این زنجیرهها چیست؟ تصور کنید که در آینده سازمانها به بلاک چینهای عمومی اعتماد کافی داشته باشند و از آنها برای اهداف تجاری حقیقی استفاده کنند. اگر گروهی از شرکتها بخواهند تعدادی برهان رایانش را در یک بلاک چین عمومی قرار دهند، دو انتخاب دارند: ۱. استفاده از یک بلاک چین مشابه اتریوم با اجرای سراسری ۲. استفاده از هر نوع بلاک چینی به عنوان یک لایه حافظه ساده و اجرای کدها به صورت دستی.
چرا باید از بین این دو گزینه، گزینه اول را انتخاب کنند؟
انتخاب منطقی، انتخاب یک بلاک چین عمومی با این ۲ ویژگیهای خواهد بود: ۱. ارزانترین هزینه در ازای هر بایت از حافظه ۲. بالاترین سطح امنیت بر اساس توان کلی استخراج. از آنجایی که رایانش قطعی است، شرکتها تنها برای ذخیرهسازی مخاطبها و پیامهای خود به شبکه هزینه پرداخت میکنند، نه برای پردازش آنها. علاوه بر این، با استفاده از یک بلاک چین تنها به عنوان فضای ذخیرهسازی، میتوانند از هر زبان برنامهنویسی که مایل هستند استفاده کنند. میتوانند از بایتکد اتریوم، جاوااسکریپ یا EMCA اسکریپ و یا برای عملکرد بهتر از کد ماشین استفاده کنند. در واقع، قراردادهای اتریوم را میتوان با استفاده از فراداده در بلاک چین بیت کوین ذخیره کرد. این همان روش دولایهای است که پیشنهاد دادیم.
این بحث مربوط به نظریه لایههای انتزاعی است که از طریق مدل اتصال متقابل سامانههای باز (OSI) معروف شده است. برای اطمینان و انعطافپذیری بهتر، هر لایه از یک سیستم حد در امکان باید از لایههای دیگر مستقل باشد. برای مثال ما نمیخواهیم کنترولرهای هارد دیسک ما شامل کدهای رندرینگ تصاویر JPEG باشد. پس چرا بخواهیم یک بلاک چین برنامههایی را که ذخیره میکند، اجرا کند؟ در اکثر موارد، این مار هیچ سودی برای ما نداشته و در عوض هزینه بالایی دارد.
سخن پایانی
اگر اجرای سراسری در بلاک چینهای خصوصی مفهومی ندارد، چرا همه بر روی این موضوع کار می کنند؟ این موضوع را تا حدی میتوان با اشاره به یک سوءتفاهم درباره کاربرد بلاک چین در دنیای واقعی، توضیح داد. بلاک چینهای عمومی مانند بیت کوین میتوانند مستقیماً یک دارایی (مثلا توکن بومی خودشان) را جابجا کنند. زیرا مالکیت آن ارز را، همین بلاک چین تعیین میکند. در این صورت دو ویژگی داراییها که معمولا متمایز هستند، با هم ترکیب میشوند: ۱. لجر یا دفتر کلی که مالکیت دارایی را ثبت میکند ۲. محل فیزیکی واقعی آن. و این ارزهای دیجیتال را به ابزارهای حامل نهایی تبدیل میکند و بسته به اهداف افراد، یک دنیای جدید بهتر و یا بهشتی برای پولشویان خلق میکند.
اما برای سایر داراییهایی که مستقل از بلاک چین هستند، تنها کاری که یک زنجیره میتواند انجام دهد این است که ثبت کند این داراییها متعلق به چه کسانی است. تا زمانی که شاهد صدور اولیه داراییها بر روی بلاک چین نباشیم و مالکیت قانونی داراییها در دیتابیس زنجیره تعریف نشده باشد، وضعیت همینگونه خواهد بود. حوزه نهادی نیز دستکم به دلیل تغییرات نظارتی موردنیاز، فاصله زیادی با این هدف دارد. و تا آن زمان همیشه بین آنچه بلاک چین میگوید و آنچه در دنیای واقعی اتفاق میافتد، یک مرحله اضافی قراردادی و رویهای وجود خواهد داشت. این مرحله شاید شامل تعدادی کد تورینگ کامل باشد که در لحظات آخر با تنبلی اجرا میشوند.
این مشکل در حوزه «اوراق قرضه هوشمند» که احتمالا زیاد دربارهاش شنیدهاید، تشدید میشود. اوراق قرضه هوشمند مستقیماً به بلاک چین عرضه میشوند و بلاک چین تضمین میکند که پرداخت کوپنها به دارندگان اوراق قرضه در زمان مناسب انجام میشود. اما اگر یک عرضهکننده اوراق قرضه در اکانت بلاک چین خود موجودی کافی برای پرداختهای مقرر نداشته باشد چه میشود؟ بلاک چین میتواند هشدار دهد که مشکلی وجود دارد اما کاری از دستش برنمیآید. هنوز به کلی وکیل و حسابدار نیازمندیم تا این آشفتگی را رفع کنند. به طور خلاصه:
اگر قراردادهای هوشمند نمیتوانند وعده های خود را محقق کنند، چرا برای آنها هزینه میکنیم؟