رمز ۱۱۳مرحلهٔ پایه، درس ۱۳ از ۲۲ بلاکچین و فناوری
قرارداد هوشمند (Smart Contract) چیست و چه ریسکی دارد
قرارداد هوشمند چیست، چطور روی اتریوم اجرا میشود و چرا یک باگ در کد میتواند دارایی کاربران را از بین ببرد؛ توضیح ساده همراه با نکتههای پیش از تعامل.
قرارداد هوشمند برنامهای است که روی یک بلاکچین مانند اتریوم ذخیره میشود و وقتی شرطهای ازپیشنوشتهشده برقرار شود، کار تعیینشده را بدون واسطه انجام میدهد. گزارش مؤسسهٔ ملی استاندارد و فناوری آمریکا (NIST) آن را مجموعهای از کد و داده توصیف میکند که روی بلاکچین مستقر میشود و تراکنشهای بعدی میتوانند به توابع عمومی آن داده بفرستند [۱]. همان ویژگیای که این کد را خودکار و تغییرناپذیر میکند، هر اشتباه در آن را هم پرهزینه میسازد.
قرارداد هوشمند به زبان ساده
قرارداد هوشمند را میتوان مجموعهای از قاعدههای «اگر… آنگاه…» دانست که بهجای روی کاغذ، به زبان برنامهنویسی نوشته شده و روی شبکهای عمومی قرار گرفته است. کسی لازم نیست اجرای این قاعدهها را بر عهده بگیرد؛ خود شبکه آنها را اجرا میکند.
وبسایت رسمی اتریوم سادهترین استعاره را دستگاه فروش خودکار میداند: اگر ورودی درست را بدهید، خروجی ازپیشتعیینشده را دریافت میکنید و تا همهٔ شرطها برقرار نشود، کالایی تحویل داده نمیشود [۲]. در این دستگاه فروشندهای وجود ندارد که تصمیم بگیرد به شما خوراکی بدهد یا نه؛ سازوکار دستگاه این تصمیم را از پیش گرفته است.
دو سوءتفاهم رایج دربارهٔ این نام وجود دارد:
- «هوشمند» به معنای هوش مصنوعی نیست. قرارداد هوشمند فکر نمیکند و چیزی یاد نمیگیرد؛ فقط دقیقاً همان کاری را انجام میدهد که در کدش نوشته شده است، حتی اگر نتیجهٔ آن کار برای کاربر ناخوشایند باشد.
- «قرارداد» لزوماً قرارداد حقوقی نیست. این کد میتواند منطق یک توافق را اجرا کند، اما خودبهخود جای سند حقوقی، دادگاه یا داور را نمیگیرد.
تفاوت اصلی قرارداد هوشمند با یک برنامهٔ معمولی روی سرور یک شرکت، در این است که هیچ مدیر واحدی نمیتواند بهتنهایی آن را خاموش یا دستکاری کند. کد روی بلاکچین عمومی است و هر کسی میتواند ببیند چه قاعدههایی در آن نوشته شده است. البته برخی قراردادها از ابتدا طوری طراحی میشوند که سازندگانشان بتوانند بخشی از آنها را بهروزرسانی یا متوقف کنند؛ در این حالت شما در عمل به همان سازندگان هم اعتماد میکنید.
از ایدهٔ اولیه تا اتریوم
ایدهٔ قرارداد هوشمند از خود رمزارزها قدیمیتر است. طبق توضیح ethereum.org، اصطلاح «قرارداد هوشمند» را نیک سابو (Nick Szabo) ابداع کرد و در سال ۱۹۹۴ مقدمهای بر این مفهوم نوشت [۲]. پرسش او ساده بود: آیا میشود بخشی از بندهای یک توافق را در نرمافزار و سختافزار جا داد تا نیاز به واسطهٔ مورد اعتماد کمتر شود؟
در آن زمان زیرساختی وجود نداشت که چنین کدی را بدون یک مالک مرکزی اجرا کند. بلاکچین این زیرساخت را فراهم کرد: دفتری مشترک که میان هزاران رایانه تکرار میشود و هیچکدام از آنها بهتنهایی اختیار تغییرش را ندارد. بیتکوین برای انتقال ارزش طراحی شده بود و زبان اسکریپت آن عمداً محدود نگه داشته شد.
اتریوم با هدف دیگری ساخته شد: بلاکچینی که بتواند برنامههای عمومی و همهمنظوره را اجرا کند. به همین دلیل وقتی امروز از قرارداد هوشمند صحبت میشود، بیشتر مثالها از اتریوم و شبکههای سازگار با آن است. شبکههای دیگری هم قرارداد هوشمند را پشتیبانی میکنند، اما مفهوم پایه در همهٔ آنها یکی است.
قرارداد هوشمند چطور اجرا میشود
چرخهٔ عمر یک قرارداد هوشمند را میتوان در چند گام خلاصه کرد:
- نوشتن کد: برنامهنویس قاعدهها را به یک زبان برنامهنویسی مینویسد و آن را به کدی تبدیل میکند که شبکه میفهمد.
- استقرار (Deploy): این کد با یک تراکنش ویژه روی بلاکچین قرار میگیرد و از آن پس نشانی مخصوص خودش را دارد؛ درست مانند نشانی یک کیف پول.
- فراخوانی: کاربر از کیف پول ارز دیجیتال خود تراکنشی به نشانی قرارداد میفرستد و یکی از توابع عمومی آن را صدا میزند؛ مثلاً «این مقدار را به فلان نشانی منتقل کن».
- اجرا و ثبت: نودهای شبکه کد را اجرا میکنند و اگر همهچیز طبق قاعده بود، تغییر وضعیت قرارداد در بلوک بعدی ثبت میشود.
در اتریوم، گام چهارم بر عهدهٔ ماشین مجازی اتریوم (EVM) است. به توضیح ethereum.org، این ماشین محیط اجرایی غیرمتمرکزی است که کد را روی همهٔ نودهای اتریوم بهطور یکسان و امن اجرا میکند؛ نودها قراردادهای هوشمند را با EVM اجرا میکنند و مقدار محاسبه با «گس» سنجیده میشود [۳]. از نظر فنی، EVM یک ماشین پشتهای با عمق ۱۰۲۴ آیتم است و هر آیتم یک واژهٔ ۲۵۶ بیتی است [۳]. لازم نیست این جزئیات را حفظ کنید؛ نکتهٔ مهم این است که همهٔ نودها به یک نتیجهٔ واحد میرسند و به همین دلیل کسی نمیتواند نتیجهٔ اجرای قرارداد را به نفع خود تغییر دهد.
گس دلیل آن است که هر تعامل با قرارداد، کارمزد دارد: هر محاسبه برای شبکه هزینه دارد و فرستندهٔ تراکنش آن را میپردازد. توضیح کاملتر را در راهنمای کارمزد شبکه (گس) آوردهایم. تراکنشی که به قرارداد میفرستید هم مانند هر تراکنش دیگری باید در بلوک ثبت و تأیید شود؛ مسیر آن در مطلب تأیید تراکنش بلاکچینی توضیح داده شده است.
یک مثال فرضی سازوکار را روشنتر میکند. فرض کنید دو نفر که یکدیگر را نمیشناسند، میخواهند کالایی را معامله کنند. میشود قراردادی نوشت که پول خریدار را نگه دارد و فقط وقتی هر دو طرف دریافت کالا را تأیید کردند، آن را به فروشنده منتقل کند. در این طرح، هیچکدام از دو طرف به دیگری یا به یک واسطهٔ انسانی تکیه نمیکنند؛ فقط به درستی کد اعتماد میکنند. اما همینجا یک محدودیت هم دیده میشود: قرارداد خودش نمیداند در دنیای بیرون چه گذشته است. اگر اطلاعاتی از بیرون بلاکچین لازم باشد، مثل قیمت یک دارایی یا تحویل یک بسته، باید منبع جداگانهای آن را به قرارداد برساند و این منبع خودش نقطهٔ اعتماد و ریسک تازهای است.
کاربردهای رایج
بخش بزرگی از آنچه در دنیای کریپتو میبینید، روی قرارداد هوشمند ساخته شده است. چند دستهٔ رایج:
- توکنها: بیشتر توکنهای روی اتریوم در واقع یک قرارداد هوشمندند که فهرست موجودی نشانیها را نگه میدارد و قاعدهٔ انتقال را اجرا میکند. استیبلکوینهای رایج روی این شبکه هم از همین نوعاند.
- امور مالی غیرمتمرکز: در دیفای (DeFi)، وامدادن، مبادلهٔ دارایی و استخرهای نقدینگی با قراردادهایی اداره میشوند که جای بخشی از کار واسطههای مالی را گرفتهاند.
- دارایی دیجیتال یکتا: انافتیها قراردادهایی هستند که مالکیت یک مورد یکتا را ثبت میکنند.
- کیف پول چندامضایی و سازمانهای غیرمتمرکز: قرارداد میتواند شرط بگذارد که انتقال فقط با تأیید چند نفر یا با رأی اعضا انجام شود.
نکته
آوردن این دستهها به معنای معرفی یا توصیهٔ هیچ پروژه یا پروتکل خاصی نیست. هر کاربرد، ریسکهای خودش را دارد و در بخش بعد به رایجترین آنها میپردازیم.
وقتی کد اشتباه کند؛ ریسک باگ و هک
قرارداد هوشمند همان کاری را میکند که کدش میگوید، نه آنچه سازندهاش در نظر داشته است. اگر میان این دو فاصلهای باشد، هر کسی که آن فاصله را پیدا کند میتواند از آن استفاده کند و چون کد عمومی است، مهاجمان هم آن را میخوانند.
مشهورترین نمونه، ماجرای The DAO است. به گزارش The Block، این صندوق سرمایهگذاری جمعی حدود ۱۵۰ میلیون دلار اتر جمع کرده بود و چند هفته بعد هک شد: در ۱۷ ژوئن ۲۰۱۶ مهاجم با سوءاستفاده از باگی به نام «ریانترنسی» (Reentrancy) در کد قرارداد، نزدیک ۳٫۶ میلیون اتر، یعنی حدود یکسوم صندوق، را خارج کرد [۴].
ریانترنسی را میشود اینطور تصور کرد: قرارداد پیش از آنکه موجودی شما را در دفترش کم کند، پول را برایتان میفرستد. اگر گیرنده خودش یک قرارداد مخرب باشد، میتواند در همان لحظهٔ دریافت، دوباره درخواست برداشت بدهد؛ و چون دفتر هنوز بهروز نشده، قرارداد باز هم پرداخت میکند. یک ترتیب نادرست در چند خط کد، کافی بود تا بخش بزرگی از صندوق خارج شود.
این ماجرا به تصمیمی جنجالی در جامعهٔ اتریوم انجامید که از آن زمان تا امروز بحثبرانگیز مانده است. The Block همچنین گزارش میدهد که ده سال بعد، بیش از ۷۵٬۰۰۰ اتر بازیابیشده و مطالبهنشده به صندوقی برای امنیت اتریوم اختصاص یافت [۴]. درس این نمونه برای کاربر عادی ساده است: حتی پروژهای بزرگ و پرسروصدا هم میتواند باگی داشته باشد که پیش از فاجعه کسی آن را ندیده است.
این مشکل به گذشته محدود نمانده است. به گزارش Chainalysis، سال ۲۰۲۲ پرسرقتترین سال تاریخ کریپتو بود و ۳٫۸ میلیارد دلار از کسبوکارهای کریپتویی دزدیده شد؛ پروتکلهای دیفای قربانی ۸۲٫۱٪ کل این سرقتها، یعنی ۳٫۱ میلیارد دلار، بودند، در حالی که این سهم در سال ۲۰۲۱، ۷۳٫۳٪ بود [۵]. همهٔ این سرقتها از باگ کد نبودهاند، اما سهم بزرگ دیفای نشان میدهد جایی که پول زیادی در قرارداد قفل شده، هدف جذابی برای مهاجمان است.
ریسکهای قرارداد هوشمند فقط به باگ محدود نمیشود:
- کلید مدیریتی: اگر سازنده اختیار تغییر یا توقف قرارداد را داشته باشد، دزدیده شدن کلید او یا سوءاستفادهٔ خودش هم یک ریسک است.
- دادهٔ بیرونی نادرست: قراردادی که به منبع قیمت بیرونی وابسته است، با دستکاری آن منبع میتواند تصمیم اشتباه بگیرد.
- قرارداد جعلی: هر کسی میتواند قراردادی با نام و نماد یک پروژهٔ شناختهشده بسازد. نشانههای آن را در راهنمای تشخیص توکنهای جعلی آوردهایم.
هشدار
تراکنشی که با یک قرارداد هوشمند انجام میدهید، پس از تأیید برگشتپذیر نیست. بازرسی امنیتی (Audit) یک قرارداد احتمال باگ را کم میکند، اما آن را از بین نمیبرد. فقط با مبلغی با قراردادها تعامل کنید که از دست دادنش زندگی شما را مختل نکند.
پیش از تعامل با یک قرارداد چه چیزی را بدانیم
بیشتر کاربران هرگز کد یک قرارداد را نمیخوانند و لازم هم نیست بخوانند. اما چند عادت ساده، بخش زیادی از ریسک را کم میکند. این فهرست چارچوب آموزشی خود ماست، نه یافتهٔ یک منبع خاص:
پیش از امضای درخواست یک قرارداد
- نشانی سایت و نشانی قرارداد را از منبع رسمی همان پروژه بررسی کنید، نه از لینکی که در پیام خصوصی یا تبلیغ به دستتان رسیده است.
- پیش از امضا، متنی را که کیف پول نشان میدهد بخوانید: کدام تابع صدا زده میشود، کدام توکن و چه مقداری درگیر است.
- اگر درخواست از نوع Approve است، بدانید که به قرارداد اجازهٔ جابهجایی توکنتان را میدهید و در صورت امکان مقدار آن را محدود کنید.
- مجوزهای قدیمی و بیاستفاده را از طریق کیف پول خود بازبینی و لغو کنید.
- برای آزمودن قراردادهای ناآشنا، از کیف پولی جداگانه با موجودی کم استفاده کنید تا دارایی اصلی در معرض خطر نباشد.
- عبارت بازیابی یا کلید خصوصی را هرگز در هیچ سایت یا فرمی وارد نکنید؛ هیچ قرارداد هوشمندی برای کار کردن به آن نیاز ندارد.
بسیاری از سرقتها از هک پیچیدهٔ کد نیست؛ از امضای یک درخواست مشکوک است که کاربر معنایش را نمیدانسته است. سایتی جعلی شما را به «دریافت هدیه» یا «تأیید کیف پول» دعوت میکند و در واقع یک مجوز خرج نامحدود از شما میگیرد. برای شناختن این الگوها، راهنمای تشخیص ولت و درخواست فیشینگ را بخوانید.
قرارداد هوشمند یکی از مهمترین ایدههای فناوری بلاکچین است: قاعدههایی که بدون واسطه و بهطور شفاف اجرا میشوند. اما همین شفافیت و خودکاری، مسئولیت را به دوش کاربر میگذارد. اگر میخواهید مفاهیم پایهای پیش از این درس، یعنی بلوک، هش و اجماع، را مرور کنید، به صفحهٔ اصلی بخش بلاکچین و فناوری سر بزنید.
خودتان را بسنجید
قرارداد هوشمند از نظر حقوقی هم قرارداد است؟
نه لزوماً. قرارداد هوشمند در اصل یک برنامهٔ رایانهای است که قاعدههایی را اجرا میکند و نام «قرارداد» بیشتر به منطق «اگر این شد، آن انجام شود» اشاره دارد. اینکه چنین کدی در یک نظام حقوقی چه جایگاهی دارد، به قانون همان کشور و شرایط هر مورد بستگی دارد و برای پرسش حقوقی باید با متخصص حقوق مشورت کرد.
اگر در قرارداد هوشمند باگ باشد، پول برمیگردد؟
معمولاً نه. تراکنش ثبتشده روی بلاکچین را نمیشود مثل تراکنش بانکی برگرداند و قرارداد هم همان کاری را میکند که کدش میگوید، حتی اگر آن کار اشتباه باشد. در برخی موارد تیم سازنده یا جامعهٔ یک شبکه راهی برای جبران پیدا کردهاند، اما روی چنین اتفاقی نمیتوان حساب کرد.
برای استفاده از قرارداد هوشمند باید برنامهنویسی بلد باشم؟
برای استفاده نه؛ کیف پول و وبسایتها رابطی میسازند که با چند کلیک به قرارداد درخواست میفرستد. اما برای فهم اینکه دقیقاً چه چیزی را امضا میکنید، دانستن مفهوم تابع، نشانی قرارداد و مجوز خرج (Approve) لازم است. بیشتر خطاهای کاربران از امضای درخواستی است که معنایش را نمیدانستند، نه از نداشتن مهارت برنامهنویسی.
تأیید (Approve) یک قرارداد یعنی چه؟
وقتی یک قرارداد را Approve میکنید، به آن اجازه میدهید مقدار مشخصی از یک توکن را از کیف پول شما جابهجا کند. اگر این مجوز نامحدود باشد و قرارداد مخرب یا هکشده باشد، همان مجوز میتواند برای خالی کردن آن توکن از کیف پول به کار برود. بهتر است مقدار مجوز را محدود نگه دارید و مجوزهای قدیمی بیاستفاده را از طریق کیف پول خود لغو کنید.
منابع
- NISTIR 8202 Blockchain Technology Overview Dylan Yaga Peter Mell Nik Roby مشاهدهٔ منبع NISTIR 8202 Blockchain Technology Overview Dylan Yaga Peter Mell Nik Roby
- Smart contracts: What are they and their benefits | ethereum.org مشاهدهٔ منبع Smart contracts: What are they and their benefits | ethereum.org
- Ethereum Virtual Machine (EVM) | ethereum.org مشاهدهٔ منبع Ethereum Virtual Machine (EVM) | ethereum.org
- The DAO hack at 10: From $50 million exploit to a $130 million Ethereum security fund | The Block مشاهدهٔ منبع The DAO hack at 10: From $50 million exploit to a $130 million Ethereum security fund | The Block
- 2022 Biggest Year Ever For Crypto Hacking - Chainalysis مشاهدهٔ منبع 2022 Biggest Year Ever For Crypto Hacking - Chainalysis