پرش به محتوا
تصویر مفهومی Smart Contract و اجرای کد روی بلاکچین

Smart Contract چیست؟ 4 جزء، کاربردها و ریسک‌ها

Smart Contract یا قرارداد هوشمند در ساده‌ترین تعریف، برنامه‌ای متشکل از کد و داده است که روی بلاکچین مستقر می‌شود و پس از دریافت یک فراخوانی معتبر، قواعد نوشته‌شده را اجرا می‌کند. واژه «هوشمند» در اینجا به هوش مصنوعی اشاره ندارد و «قرارداد» هم لزوماً به معنای یک توافق حقوقی نیست. مسئله اصلی این فناوری آن است که بخشی از یک فرایند را از تصمیم لحظه‌ای افراد به منطق ازپیش‌تعیین‌شده کد منتقل می‌کند؛ اما همان‌قدر که نتیجه را قابل‌پیش‌بینی‌تر می‌سازد، خطاهای کد و انتخاب‌های معماری را نیز جدی‌تر می‌کند.

در اتریوم باید میان حسابی که کاربر با کلید خصوصی کنترل می‌کند و حساب قراردادی تفاوت گذاشت. حساب قراردادی کلید خصوصی ندارد و رفتار آن را کدی تعیین می‌کند که در آدرسش مستقر شده است. به همین دلیل Smart Contract خودش تراکنش را امضا و آغاز نمی‌کند؛ یک حساب کاربری یا قرارداد دیگر باید آن را فراخوانی کند. این تمایز برای فهم مسئول آغاز عملیات و پرداخت هزینه شبکه ضروری است.

Smart Contract چگونه کار می‌کند؟

Smart Contract از کد و داده تشکیل می‌شود و نودهای شبکه باید با اجرای آن به نتیجه‌ای یکسان برسند. این برنامه همراه با «وضعیت» خود در یک آدرس مشخص روی بلاکچین قرار می‌گیرد. وضعیت همان اطلاعات فعلی برنامه است؛ برای مثال، موجودی هر آدرس یا تعداد رأی‌های یک پیشنهاد. برای مرور تعریف و ساختار پایه، راهنمای Smart Contract در وب‌سایت اتریوم نیز یک منبع فنی مستقیم و مفید است.

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

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

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

برای درک شهودی می‌توان دستگاه فروش خودکار را در نظر گرفت: اگر ورودی معتبر باشد و کالا انتخاب شود، دستگاه خروجی ازپیش‌تعیین‌شده را تحویل می‌دهد. برنامه روی بلاکچین نیز پس از برقرارشدن شرط‌ها می‌تواند وجهی را آزاد کند، مالکیت یک توکن را انتقال دهد یا نتیجه یک رأی‌گیری چندامضایی را اعمال کند. تفاوت مهم این است که اجرای آن میان نودهای شبکه تکرار و نتیجه در دفترکل ثبت می‌شود.

«خوداجرا» دقیقاً به چه معناست؟

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

این اجرا همچنین قطعی است: اگر وضعیت اولیه و ورودی یکسان باشد، نودهای شبکه باید به نتیجه یکسان برسند. به همین علت قرارداد نمی‌تواند مانند یک برنامه معمولی مستقیماً به ساعت محلی یک رایانه، عدد تصادفی کنترل‌نشده یا پاسخ متغیر یک وب‌سایت وابسته شود. هر داده‌ای که در نتیجه اثر می‌گذارد باید به شکلی وارد محیط اجماع شود که نودها بتوانند همان نتیجه را بازتولید کنند.

گس؛ بهای محاسبه روی اتریوم

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

در سازوکار کارمزد اتریوم، «کارمزد پایه» متناسب با تقاضای فضای بلاک تنظیم و سوزانده می‌شود و فرستنده می‌تواند «کارمزد اولویت» را نیز برای اعتبارسنج در نظر بگیرد. هر تراکنش یک سقف گس دارد؛ اگر اجرای کد پیش از تکمیل به این سقف برسد، تغییرات وضعیت آن بازگردانده می‌شود، اما هزینه محاسباتی که تا آن لحظه مصرف شده به فرستنده برنمی‌گردد. پس برآورد گس فقط مسئله قیمت نیست و می‌تواند بر موفق یا ناموفق بودن عملیات اثر بگذارد.

کاربردهای Smart Contract چیست؟

کاربرد اصلی، تبدیل قواعد روشن به عملیاتی است که چند بازیگر بتوانند نتیجه اجرای آن را روی یک دفترکل مشترک ببینند. انتقال دارایی، آزادسازی وجه پس از برقرارشدن شرط و رأی‌گیری چندامضایی نمونه‌هایی از این الگو هستند. ارزش فناوری در همه این موارد از «هوشمندی» مستقل برنامه نمی‌آید؛ از اجرای هماهنگ یک منطق مشترک می‌آید.

استانداردهای توکن نمونه خوبی از اثر این هماهنگی‌اند. استانداردهایی مانند ERC-20 برای توکن‌های قابل‌تعویض و ERC-721 برای توکن‌های غیرمثلی، مجموعه‌ای از قواعد مشترک تعریف می‌کنند. به همین دلیل کیف پول، صرافی یا یک برنامه غیرمتمرکز می‌تواند با مجموعه بزرگی از توکن‌ها از راه الگوهای شناخته‌شده تعامل کند. استاندارد در اینجا تضمین‌کننده ارزش یا امنیت یک توکن نیست؛ فقط زبان مشترک فنی را فراهم می‌کند.

استاندارد ERC-1155 این ایده را گسترش می‌دهد و اجازه می‌دهد چند نوع دارایی مثلی و غیرمثلی در یک قرارداد مدیریت و به‌صورت دسته‌ای منتقل شوند. در کاربردهای مالی نیز قراردادها پایه استخرهای وام‌دهی، خزانه‌های چندامضایی و بازارسازهای خودکار هستند. برای دیدن جای این اجزا در یک سامانه بزرگ‌تر می‌توان سازوکار مالی غیرمتمرکز یا دیفای و نمونه عملی صرافی غیرمتمرکز یونی‌سواپ را جداگانه بررسی کرد. این نمونه‌ها کاربرد زیرساخت را نشان می‌دهند، نه اینکه هر پیاده‌سازی را کم‌ریسک یا قابل‌اعتماد ثابت کنند.

مزیت واقعی: حذف اعتماد یا جابه‌جایی آن؟

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

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

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

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

اوراکل؛ پلی که خودش بخشی از ریسک است

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

یک منبع متمرکز ساده‌تر است، اما می‌تواند نقطه شکست یا سانسور واحد بسازد. شبکه اوراکل نامتمرکز داده چند منبع را تجمیع می‌کند تا وابستگی به یک ارائه‌دهنده کاهش یابد، ولی قواعد انتخاب منبع، روش تجمیع و زمان به‌روزرسانی همچنان مهم‌اند. قیمت لحظه‌ای یک استخر کم‌عمق نیز ممکن است دست‌کاری شود؛ بنابراین پرسش درست فقط «اوراکل داریم؟» نیست، بلکه باید پرسید داده از کجا می‌آید و در برابر تغییر ناگهانی چگونه مقاوم شده است.

ریسک‌های Smart Contract

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

شفافیت بلاکچین عمومی نیز جای محرمانگی را نمی‌گیرد. متغیری که در Solidity با عنوان private تعریف شده، فقط از دسترسی مستقیم برنامه‌های دیگر محدود می‌شود؛ داده ذخیره‌شده آن همچنان آنچین قابل مشاهده است. اطلاعات حساس نباید صرفاً با اتکا به این برچسب در شبکه عمومی قرار گیرند.

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

تغییرناپذیری مطلق نیست

کدی که در یک آدرس اتریوم مستقر شده، به‌طور پیش‌فرض ویرایش نمی‌شود. بااین‌حال، ساختارهای قابل‌ارتقا می‌توانند داده را از منطق برنامه جدا کنند، درخواست‌ها را از طریق یک پروکسی به نسخه تازه بفرستند یا کاربران را به نسخه جدید منتقل کنند. این امکان برای رفع باگ مفید است، اما پرسش تازه‌ای ایجاد می‌کند: چه کسی اختیار ارتقا دارد و این اختیار چگونه کنترل می‌شود؟ ادعای «تغییرناپذیری» بدون بررسی پروکسی، کلیدهای مدیریتی و سازوکار حاکمیت ناقص است.

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

آیا Smart Contract از نظر حقوقی قرارداد است؟

نام‌گذاری فنی نباید جای تحلیل حقوقی را بگیرد. هر برنامه خودکاری که روی بلاکچین اجرا می‌شود، لزوماً تعهد حقوقی ایجاد نمی‌کند. کمیسیون حقوق انگلستان و ولز میان یک برنامه خودکار و «قرارداد حقوقی هوشمند» تفاوت می‌گذارد؛ قرارداد حقوقی هوشمند تعهدات الزام‌آور را تعریف یا اجرا می‌کند. این نهاد در نوامبر ۲۰۲۱ امکان پشتیبانی حقوق انگلستان و ولز از چنین قراردادهایی را بررسی کرد، اما نتیجه آن را نمی‌توان به ایران یا همه کشورها تعمیم داد. شکل‌گیری توافق، تفسیر شروط، راه جبران خسارت و صلاحیت قضایی همچنان به قانون حاکم و جزئیات رابطه طرفین بستگی دارد.

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

پیش از استفاده از Smart Contract چه چیزهایی را بررسی کنیم؟

به‌جای تکیه بر برچسب‌هایی مانند «بدون واسطه» یا «غیرقابل‌تغییر»، می‌توان سامانه را با چند پرسش عملی سنجید:

  • کدام تراکنش یا سرویس اجرای تابع را آغاز می‌کند و اگر آن سرویس از کار بیفتد چه می‌شود؟
  • برنامه به چه داده بیرونی و کدام اوراکل وابسته است؟
  • کد منبع تأییدشده، بازبینی امنیتی و سابقه تغییرات در دسترس است؟
  • چه فرد یا نهادی کلید توقف، مدیریت یا ارتقا را در اختیار دارد؟
  • هزینه گس در شرایط شلوغی شبکه چه اثری بر امکان استفاده دارد؟
  • اگر خروجی کد با توافق طرفین یا قانون تعارض پیدا کند، مسیر حل اختلاف چیست؟

جمع‌بندی

Smart Contract را بهتر است نه یک واسطه جادویی، بلکه یک موتور اجرای قواعد دید. نقطه قوت آن، نتیجه قابل‌پیش‌بینی پس از فراخوانی، ثبت تغییرات و امکان ترکیب با برنامه‌های دیگر است. نقطه ضعفش نیز در همان دقت نهفته است: باگ، داده نادرست اوراکل، اختیار پنهان مدیر، هزینه شبکه یا ابهام حقوقی می‌تواند خروجی‌ای دقیق اما نامطلوب بسازد. پرسش تعیین‌کننده این نیست که کد «هوشمند» است یا نه؛ این است که چه قواعدی را، با اتکا به چه داده و تحت کنترل چه کسانی اجرا می‌کند.

در ارزیابی نهایی باید سه لایه را کنار هم دید: منطق فنی و وضعیت آنچین، ورودی‌های بیرونی و اداره انسانی، و چارچوب حقوقی توافق. دقت در یک لایه کاستی دو لایه دیگر را جبران نمی‌کند. Smart Contract زمانی ابزار مناسبی است که قواعد قابل‌کدنویسی، هزینه اجرا، اختیارهای مدیریتی و راه مواجهه با خطا پیش از سپردن دارایی یا تعهد روشن شده باشند.

سلب مسئولیت:
مطالب منتشرشده صرفاً با هدف اطلاع‌رسانی تهیه شده و فاقد هرگونه وابستگی، جانبداری یا جهت‌گیری سیاسی و حزبی است و به‌هیچ‌وجه توصیه‌ای برای خرید، فروش یا نگهداری دارایی‌های مالی، سهام، ارزهای دیجیتال یا سایر ابزارهای سرمایه‌گذاری محسوب نمی‌شود. تصمیم‌گیری برای سرمایه‌گذاری بر عهده‌ی مخاطب است و توصیه می‌شود پیش از هر اقدامی، تحقیقات کافی انجام داده و در صورت نیاز با مشاور مالی متخصص مشورت کنید.

۰ دیدگاه