قراردادهای هوشمند به منزله انجام خودکار انواع فعالیتها در بلاکچین ساخته شدهاند. به عبارت سادهتر وظیفه قراردادهای هوشمند، تنظیم و انجام انواع قراردادها با اقدامات پیشبینی شده در آنها به صورت خودکار است. قراردادهای هوشمند به افراد اجازه میدهند بدون نیاز به شخص ثالث با یکدیگر تبادلات مالی داشته و از انجام صحیح این تبادلات اطمینان داشته باشند؛ اما آیا تمامی قراردادهای هوشمند ایمن هستند و برنامهنویسان آنها نمیتوانند آنها را تغییر دهند؟ در این مقاله با میهن بلاکچین همراه باشید تا قابلیت تغییر دادن قراردادهای هوشمند را بررسی کنیم، انواع قراردادهای هوشمند تغییرناپذیر و قابل تغییر را بشناسیم، با مزایا و معایب هر کدام از آنها آشنا شویم و بتوانیم آنها را تشخیص دهیم.
قرارداد هوشمند چیست؟
قراردادهای هوشمند به منظور تسهیل مراودات مالی و غیرمالی بین افراد و در فضای بلاک چین برای مشاهده تمامی کدها و شفافیت تراکنشها طراحی شده است. در واقع قراردادهای هوشمند امکان انجام معاملات قابل اعتماد بدون نیاز به ناظر یا شخص ثالث را فراهم میکنند. به همین دلیل با استفاده از این قراردادها نیازی به واسطههایی همچون بانکها، شرکتهای مختلف، افراد ناظر و غیره نیست و انجام تراکنشها در قراردادهای هوشمند به طور کاملا غیرمتمرکز انجام میشود.
قراردادهای هوشمند کدهای برنامهنویسی هستند که به واسطه آنها، قوانینی که در این کدها از قبل تعریف شده است، به صورت خودکار اجرا میشوند. استفاده از قراردادهای هوشمند به کاربران و برنامههای غیرمتمرکز (DAPP) مختلف اجازه میدهد تا بدون نیاز به اعتماد به یکدیگر و فقط با اتکا به کدهایی که از پیش طرز استفاده از DAPPها در آنها تعیین شده است، با یکدیگر تعامل داشته باشند.
استفاده از قراردادهای هوشمند باعث میشود تا افراد بتوانند با اعتماد به کدهای برنامهنویسی که قابلیت تغییر ندارند، با یکدیگر و با برنامههای مختلف ارتباط برقرار کنند؛ اما هر از چندگاهی در قراردادهای هوشمند مشکلاتی پدیدار میشود که ممکن است کدهای آن شامل باگ یا خطا باشند.
این موضوع باعث میشود کلاهبرداران بتوانند به راحتی از مشکلات ناشی از کدها استفاده کرده و اموال کاربران را به سرقت ببرند. برای جلوگیری از چنین شرایطی نوعی از قراردادهای هوشمند به نام قراردادهای هوشمند قابل تغییر ایجاد شدهاند. قراردادهای هوشمند قابل تغییر به توسعهدهندگان اجازه میدهند تا مشکلات قراردادهای هوشمند را برطرف کرده و آنها را بهروزرسانی کنند. در ادامه قراردادهای هوشمند قابل تغییر و انواع آنها را بررسی کرده و مزایا و معایب آنها را تشریح میکنیم.
قابلیت تغییر دادن قراردادهای هوشمند
همانطور که میدانید قراردادهای هوشمند پس از استقرار در بلاک چین تغییرناپذیر هستند؛ اما ممکن است شرایطی مثل برطرف کردن یک باگ نرمافزاری، نیاز به عوض کردن طرز عملکرد قرارداد و یا نیاز به اضافه کردن یک ویژگی جدید به برنامه خود داشته باشید. در این صورت اگر بخواهید هر کدام از تغییرات بیان شده را در اسمارت کانترکت خود پیاده سازی کنید، باید آن را به طور کامل عوض کرده و یک قرارداد هوشمند جدید تعریف کنید.
در این صورت نیاز است تا تمام کاربران داراییهای خود را به کانترکت جدید انتقال دهند که عملی وقتگیر است و نیاز به حمایت و انجام این کار توسط تمامی کاربران دارد؛ این موضوع هر از چند گاهی برای برخی از توکنها رخ میدهد که با تغییر قرارداد هوشمند خود به نسخه جدیدی انتقال یا اصطلاحا (Migrate) پیدا میکنند؛ به طور مثال نسخه جدید بیت تورنت (Bittorrent) که چندی پیش معرفی شد، نمونهای از تغییر قراردادهای هوشمند بهمنظور بهروزرسانی و افزودن ویژگیهای جدید است.
برای انجام این کار لازم است تا تیم توسعهدهنده شبکهای که قصد Migrate به قرارداد هوشمند جدید را دارد، با صرافیهای مختلف همکاری کرده تا توکن جدید خود را عرضه کند. همچنین کاربران آن نیز باید توکنهای ورژن قبلی خود را به ورژن جدید تبدیل کنند تا بتوانند از خدمات آن استفاده کنند. این موضوع بسیار زمانبر و هزینهبر است و نیاز به یک برنامهریزی درست و دقیق برای اجرا دارد.
قابلیت تغییرپذیری در قراردادهای هوشمند با هدف حل این مشکل ایجاد شدهاند. توسعهدهندگان میتوانند تغییرات خود را بدون نیاز به عوض کردن قرارداد هوشمند انجام داده و آن را بهروزرسانی کنند. در ادامه روشهایی که به توسعهدهندگان اجازه میدهد قراردادهای هوشمند با زبان برنامهنویسی سالیدیتی (Solidity) را روی شبکههای اتریوم، بایننس اسمارت چین، پالیگان یا هر بلاک چین سازگار با ماشین مجازی اتریوم (EVM) تغییر دهند، بیان میکنیم. برای انجام این کار میتوان از چند روش مختلف استفاده کرد، که به شرح زیر هستند:
Master-Slave contracts
تکنیک Master-Slave یکی از اساسیترین و آسانترین تکنیک ها برای ارتقای قراردادهای هوشمند است. در این تکنیک یک قرارداد اصلی (Main Contract) به همراه تمام قراردادهای دیگر که به آنها قراردادهای فرعی گفته میشود، ایجاد و در قرارداد هوشمند مستقر میشوند.
قرارداد اصلی آدرس تمام قراردادهای دیگر را در خود ذخیره میکند و هر زمان که نیاز باشد، از آنها استفاده میکند. قراردادهای فرعی در این تکنیک به عنوان قراردادهای قابل تغییر عمل میکنند و هر زمان که نیاز به برقراری ارتباط با سایر قراردادها داشته باشند، آخرین آدرس سایر قراردادها را از قرارداد اصلی دریافت می کنند. برای ارتقای قرارداد هوشمند در تکنیک Master-Slave ویژگیهای مورد نظر به قراردادهای فرعی اضافه میشوند و آدرس قرارداد جدید، در قرارداد اصلی اضافه میشود.
به عبارت سادهتر در روش Master-Slave یک قرارداد هوشمند اصلی با یک سری از قراردادهای هوشمند فرعی در ارتباط است. در این روش قرارداد اصلی قابل تغییر نیست و فقط میتوان قراردادهای فرعی که با آن در ارتباطند را تغییر داد و ویژگیها و بهروزرسانیهای مختلف را از تغییر آنها در قرارداد اصلی اعمال کرد. اگرچه این تکنیک بهترین راه برای توسعه قراردادهای قابل ارتقا نیست، اما ساده ترین راه است. یکی از محدودیتهای این روش این است که نمیتوان دادهها یا داراییهای قرارداد را به راحتی به یک قرارداد جدید منتقل کرد.
Eternal Storage contracts
در این تکنیک قراردادهای اصلی (Logic Contract) و قراردادهایی که دادهها در آنها ذخیره میشوند (Data Contract) را از یکدیگر جدا میکنیم. Data Contract قراردادی دائمی، غیر قابل ارتقا و تغییر است؛ اما Logic Contract را می توان به تعداد دفعات مورد نیاز ارتقا داد و این تغییرات در Data Contract نیز قابل مشاهده است. به همین دلیل هنگامی که تغییراتی در Logic Contract اعمال میشود، کاربران نیز از این تغییرات مطلع میشوند.
تکنیک Eternal Storage contracts یک تکنیک نسبتا اساسی است، اما یک نقص آشکار دارد. از آنجایی که Data Contract غیر قابل ارتقا است، هر تغییری که در ساختار این قرارداد مورد نیاز باشد یا یک اشکال یا باگ در آن وجود داشته باشد، غیر قابل تغییر است و به همین دلیل وجود یک اشکال در این نوع قراردادها میتواند کل قرارداد هوشمند را به خطر انداخته و باعث از بین رفتن آن شود؛ به طور مثال با پیدا شدن یک ایراد در این نوع قراردادها هکر میتواند موجودی کل آنها را به سرقت ببرد و هیچ راهی برای جلوگیری یا مسدودسازی داراییهای به سرقت رفته وجود نخواهد داشت. مشکل دیگر این تکنیک این است که برای آپدیت Logic Contract نیاز به برقراری ارتباط با بلاک چین اصلی و پرداخت کارمزد است. این تکنیک معمولا با تکنیک Master-Slave ترکیب می شود تا ارتباطات بین قراردادی را تسهیل کند.
Upgradable Storage Proxy Contracts
یکی دیگر از روشهای تغییر دادن قراردادهای هوشمند Upgradable Storage Proxy Contracts نام دارد، که یکی از رایجترین روشهای پیاده سازی پراکسی کانترکتها است. در این نوع از اسمارت کانترکتها میتوان با قرار دادن قراردادهای ذخیرهسازی (storage contracts) همیشگی به عنوان پروکسی برای قرارداد اصلی (Logic Contract)، از پرداخت هزینه کارمزد اضافی جلوگیری کرد.
در این نوع از قراردادهای هوشمند، پراکسی کانترکت و قرارداد اصلی هر دو از یک storage contracts استفاده میکنند. قرارداد پروکسی یک تابع بازگشتی دارد که آن را از قرارداد اصلی فراخوانی میکند، تا قرارداد اصلی بتواند تغییراتی در ذخیرهسازی پروکسی ایجاد کند. به عبارت سادهتر در Upgradable Storage Proxy Contracts کاربران با پراکسی کانترکتها در ارتباط هستند.
پراکسی کانترکتها قابل تغییر و بهروزرسانی نبوده و تغییرات و آپدیتها همگی در قرارداد اصلی اعمال میشوند و تغییرات حاصله در storage contracts ذخیره میشوند. این نوع از قراردادها دارای مزایا و معایبی هستند که میتواند منجر به ایجاد قابلیتهای فراوان و یا سو استفاده توسط توسعهدهندگان قراردادهای هوشمند شود.
یکی از بزرگترین مزایای پراکسی کانترکتها امکان بهروزرسانی و اعمال تغییرات بدون نیاز به پرداخت کارمزد اضافه و از بین بردن مشکلات و باگهای قرارداد هوشمند اصلی در مواقع ضروری است. همچنین یکی از اصلیترین معایب آن امکان ایجاد تغییرات مخرب توسط توسعهدهندگان در این قراردادها بدون اعلام به کاربران آن است. این موضوع میتواند باعث شود در صورتی که تیم توسعهدهنده قرارداد هوشمند افرادی سودجو باشند، بدون اعلام قبلی به کاربران خود دارایی آنها را در اختیار گرفته و یا به سرقت ببرند.
نحوه تشخیص Proxy Contracts از قراردادهای هوشمند
برای تشخیص پراکسی کانترکتها دو راه پیش روی کاربران قرار دارد. در روش اول کاربران میتوانند از سایت اتراسکن (EtherScan) استفاده کنند و در روش دوم میتوانند اطلاعات مورد نیاز خود را از کدهای قرارداد هوشمند، بیابند. در ادامه به طور اجمالی نحوه انجام این روشها را در شبکه اتریوم توضیح میدهیم:
استفاده از سایت اتر اسکن
کاربران میتوانند آدرس قرارداد هوشمند مورد نظر خود را از سایتهایی مثل CoinMarketcap کپی کرده و به سایت اتر اسکن مراجعه کنند. ابتدا از سایت کوین مارکت کپ آدرس قرارداد هوشمندی که قصد بررسی آن را دارید کپی کنید. در اینجا ما قرارداد هوشمند پلتفرم وامدهی آوه (Aave) را که از پراکسی کانترکت استفاده میکند، مورد بررسی قرار میدهیم.
سپس به سایت اتراسکن مراجعه کرده و آدرس قرارداد هوشمند مورد نظرشان را جستجو کنید. پس از جستجو قرارداد هوشمند بر روی Contract کلیک کنید.
پس از کلیک روی Contract، در صورتی که با عبارت Read as Proxy روبرو شوید، یعنی قرارداد هوشمند مورد نظر شما از نوع پراکسی کانترکتها بوده و قابلیت تغییر و بهروزرسانی توسط توسعهدهندگان آن وجود دارد.
استفاده از کدهای قرارداد هوشمند
سادهترین راه برای دریافتن نوع قرارداد هوشمند، مطالعه و بررسی کدهای استفاده شده در ساختار اسمارت کانترکت است. کاربران میتوانند با مراجعه به سایتهای مثل اتراسکن و یافتن قرارداد هوشمند پروژه مدنظرشان، با بررسی کدهای آن متوجه شوند که کدهای استفاده شده در اسمارت کانترکت پروژه از نوع پراکسی است یا خیر. همانطور که پیشتر بیان شد در پراکسی کانترکتها کاربران با کدهای اصلی در ارتباط نیستند و در واقع کدهای Proxy Contract کد پروژه نبوده و توسعهدهندگان میتوانند کد اصلی پروژه را تغییر دهند. کد زیر مربوط به پلتفرم Aave است که در ساختار این کد نوع قرارداد هوشمند این پلتفرم که از نوع پراکسی کانترکتها است، قابل مشاهده است.
شایان ذکر است که فقط تیم توسعهدهنده یک پلتفرم یا یک توکن به کدهای آن دسترسی داشته و فقط این افراد هستند که میتوانند تغییرات و بهروزرسانیها را در قراردادهای هوشمند قابل تغییر، اعمال کنند.
سوالات متداول (FAQ)
قراردادهای هوشمند پس از دیپلوی قابل تغییر نیستند؛ اما در صورت وقوع شرایطی مثل ایجاد باگ، توسعهدهندگان ناچار به تغییر آن هستند.
گام نخست مربوط به استقرار قرارداد جدید است و گام دوم به انتقال داراییهای قرارداد قبلی به قرارداد جدید مربوط است.
جمع بندی
قابلیت تغییر دادن قراردادهای هوشمند