ایجاد یک قرارداد هوشمند معمولاً بین 10 تا 2000 دلار هزینه دارد، به شرطی که قیمت اتریوم بین 1500 تا 2000 دلار باشد. سه عامل اصلی این هزینه را تعیین میکنند:
-
قیمت اتریوم،
-
اندازه قرارداد کامپایل شده بر حسب بایت،
-
قیمت فعلی گس (Gas) در شبکه اتریوم.
در مجموع، شش مؤلفه مختلف وجود دارد که تعیین میکنند چه مقدار گس برای استقرار قرارداد مورد نیاز است. شرایط بازار و وضعیت فعلی شبکه، قیمت دلاری گس را مشخص میکنند. در این مقاله، تمام این مقادیر را بهطور کامل بررسی میکنیم.
هزینه استقرار قرارداد هوشمند
برای استقرار یک قرارداد هوشمند در شبکه اتریوم، هزینه گس از چند بخش اصلی تشکیل میشود:
-
همه تراکنش های اتریوم باید مبلغ ثابتی معادل 21,000 گس پرداخت کنند.
-
ایجاد یک قرارداد جدید، بهصورت ثابت 32,000 گس هزینه دارد.
-
برای هر متغیر ذخیره سازی (storage variable) که مقداردهی میکنید، باید 22,100 گس پرداخت شود.
-
در داده های تراکنش (transaction data)، هر بایت صفر 4 گس مصرف میکند، و هر بایت غیرصفر 16 گس.
-
اجرای هر دستور (bytecode) در مرحله ابتدایی سازی (initialization) نیز هزینه ای دارد که به نوع دستور بستگی دارد.
-
در نهایت، برای هر بایت کد نهایی که در بلاکچین ذخیره میشود، باید 200 گس به ازای هر بایت پرداخت کنید.
در ادامه، برای شفاف سازی بهتر، یک مثال از استقرار یک قرارداد ساده با زبان Solidity در محیط Remix بررسی میکنیم.
1 2 3 4 5 6 7 |
pragma solidity 0.8.7; contract Minimal { constructor() payable { } } |

طبق اطلاعات ارائهشده در محیط Remix، هزینه استقرار این قرارداد برابر با 66,862 گس بوده است. در این مقاله، این مقدار را بهصورت دقیق تجزیه و تحلیل میکنیم.
در تنظیمات، کانستراکتور (constructor) را بهصورت payable تعریف کردیم و همچنین بهینه سازی (optimizer) را روی 200 بار اجرا تنظیم کردیم. این دو اقدام باعث شدند حجم نهایی قرارداد کاهش پیدا کند.
حالا بیایید مجموع هزینهها را بررسی کنیم:
-
21,000 گس برای اجرای تراکنش استقرار
-
32,000 گس برای فرآیند ایجاد قرارداد
-
جمع کل تا اینجا: 53,000 گس
بنابراین هنوز باید 13,862 گس دیگر را بررسی کنیم تا بتوانیم هزینه نهایی 66,862 گس را بهطور کامل توضیح دهیم.
هزینه گس مربوط به بایت کد تراکنش (tx.data)
بایت کد تراکنش برای استقرار قرارداد به صورت زیر بود:
1 |
0x6080604052603f8060116000396000f3fe6080604052600080fdfea2646970667358221220c5cad0aa1e64e2ca6a6cdf28a25255a8ebbf3cdd5ea0b8e4129a3c83c4fbb72a64736f6c63430008070033 |
1 2 3 4 5 6 7 |
import itertools # توجه کنید که "0x" ابتدای رشته را به صورت دستی حذف کردهایم s = "6080604052603f8060116000396000f3fe6080604052600080fdfea2646970667358221220c5cad0aa1e64e2ca6a6cdf28a25255a8ebbf3cdd5ea0b8e4129a3c83c4fbb72a64736f6c63430008070033" s = " ".join(["".join(group) for group in itertools.zip_longest(s[::2], s[1::2])]) print(s) |
1 |
60 80 60 40 52 60 3f 80 60 11 60 00 39 60 00 f3 fe 60 80 60 40 52 60 00 80 fd fe a2 64 69 70 66 73 58 22 12 20 c5 ca d0 aa 1e 64 e2 ca 6a 6c df 28 a2 52 55 a8 eb bf 3c dd 5e a0 b8 e4 12 9a 3c 83 c4 fb b7 2a 64 73 6f 6c 63 43 00 08 07 00 33 |
00
) معادل 4 گس و هر بایت غیرصفر معادل 16 گس مصرف میکند. برای محاسبه تعداد آنها میتوانیم از این اسکریپت پایتون استفاده کنیم:
1 2 3 4 5 6 7 |
s = "60 80 60 40 52 60 3f 80 60 11 60 00 39 60 00 f3 fe 60 80 60 40 52 60 00 80 fd fe a2 64 69 70 66 73 58 22 12 20 c5 ca d0 aa 1e 64 e2 ca 6a 6c df 28 a2 52 55 a8 eb bf 3c dd 5e a0 b8 e4 12 9a 3c 83 c4 fb b7 2a 64 73 6f 6c 63 43 00 08 07 00 33" # بایتهای غیر صفر print(len(list(filter(lambda x: x != '00', s.split(' '))))) # بایتهای صفر print(len(list(filter(lambda x: x == '00', s.split(' '))))) |
نتیجه اجرای این کد:
-
75 بایت غیر صفر → 75 × 16 = 1,200 گس
-
5 بایت صفر → 5 × 4 = 20 گس
جمع این دو مقدار میشود 1,220 گس بابت بایتکد تراکنش.
حال بیایید هزینه کلی تا این مرحله را محاسبه کنیم:
-
21,000 گس برای اجرای تراکنش
-
32,000 گس برای ایجاد قرارداد
-
1,220 گس برای داده های تراکنش
جمع کل: 54,220 گس
ما هنوز باید 12,642 گس دیگر را تحلیل کنیم تا به مجموع هزینه اعلامشده 66,862 گس برسیم.
کد استقرار (Deployment Code)
حالا دوباره به بایت کد نگاه میکنیم:
1 2 |
60 80 60 40 52 60 3f 80 60 11 60 00 39 60 00 f3 fe **60 80 60 40 52 60 00 80 fd fe a2 64 69 70 66 73 58 22 12 20 c5 ca d0 aa 1e 64 e2 ca 6a 6c df 28 a2 52 55 a8 eb bf 3c dd 5e a0 b8 e4 12 9a 3c 83 c4 fb b7 2a 64 73 6f 6c 63 43 00 08 07 00 33** |
قسمت بولد شده، همان کد نهایی قرارداد است که در بلاکچین ثبت میشود (deployed bytecode). بایتکدی که قبل از آن قرار دارد، به عنوان کد اولیه استقرار (initialization code) شناخته میشود.
برای محاسبه هزینه این بخش، باید تعداد بایتهای کد مستقرشده را در 200 گس ضرب کنیم؛ زیرا این کد بهصورت دائمی در وضعیت شبکه اتریوم ذخیره میشود و نسبت به دادههای تراکنش، هزینه بالاتری دارد. درک این مفاهیم برای افرادی که در مسیر آموزش برنامه نویسی بلاکچین هستند، اهمیت زیادی دارد، چون نشان میدهد چگونه جزئیات فنی بر هزینه نهایی قرارداد اثر میگذارد.
در ادامه با پایتون این تعداد را محاسبه میکنیم:
1 2 |
deployment_code = '60 80 60 40 52 60 00 80 fd fe a2 64 69 70 66 73 58 22 12 20 c5 ca d0 aa 1e 64 e2 ca 6a 6c df 28 a2 52 55 a8 eb bf 3c dd 5e a0 b8 e4 12 9a 3c 83 c4 fb b7 2a 64 73 6f 6c 63 43 00 08 07 00 33' print(len(deployment_code.split(' ''))) |
خروجی این کد:
63 بایت
در نتیجه:
-
63 × 200 = 12,600 گس بابت کد مستقرشده
اکنون تمام هزینه ها را با هم جمعبندی میکنیم:
بخش | هزینه گس |
---|---|
اجرای تراکنش | 21,000 |
ایجاد قرارداد | 32,000 |
داده های تراکنش (bytecode tx.data) | 1,220 |
کد نهایی مستقرشده | 12,600 |
جمع کل | 66,820 |
ما تا اینجا فقط 42 گس کمتر از عدد نهایی یعنی 66,862 هستیم. این تفاوت اندک ممکن است به خاطر عملیات داخلی ریز یا اختلافهای جزئی در ارزیابی برخی دستورات ماشین مجازی اتریوم (EVM) باشد که در تخمین کلی محاسبه نشدهاند.
هزینه اجرای بایت کد در زمان استقرار قرارداد
علاوه بر تمام هزینههایی که تا اینجا محاسبه کردیم، اجرای بایتکد ابتدایی قرارداد (Initialization Bytecode) نیز باید بهطور جداگانه در نظر گرفته شود:
1 |
60 80 60 40 52 60 3f 80 60 11 60 00 39 60 00 f3 fe |
برای درک بهتر این کد، میتوانیم از ابزار EVM Playground استفاده کنیم تا معادل دستورهای ماشین مجازی اتریوم (EVM) را ببینیم:
دستور | شرح | هزینه گس |
---|---|---|
PUSH1 0x80 |
قراردادن مقدار 0x80 در استک | 3 گس |
PUSH1 0x40 |
قراردادن مقدار 0x40 در استک | 3 گس |
MSTORE |
ذخیره مقدار در حافظه | 12 گس |
PUSH1 0x3f |
مقداردهی به طول کد | 3 گس |
DUP1 |
تکرار مقدار بالای استک | 3 گس |
PUSH1 0x11 |
آدرس شروع کپی کد | 3 گس |
PUSH1 0x00 |
آدرس مقصد حافظه | 3 گس |
CODECOPY |
کپی کردن کد به حافظه | 9 گس |
PUSH1 0x00 |
آماده سازی برای خروج | 3 گس |
RETURN |
بازگرداندن کد به بلاکچین | 0 گس |
INVALID |
اجرا نمیشود (بیاثر) | — |
مجموع هزینه اجرای این بایتکد برابر است با 42 گس. Debugger در محیط Remix مقدار دقیق این عدد را هنگام اجرای بایت کد به ما نشان داد.
و در اینجا به پایان رسیدیم؛ حالا تمام اجزای مربوط به هزینه استقرار یک قرارداد هوشمند را بررسی و محاسبه کردیم.
در ادامه، جمعبندی نهایی را مشاهده میکنید:
بخش | هزینه گس |
---|---|
اجرای تراکنش | 21,000 |
فرآیند ایجاد قرارداد | 32,000 |
هزینه داده های بایت کد (tx.data) | 1,220 |
ذخیره سازی کد نهایی در بلاکچین | 12,600 |
اجرای بایت کد اولیه استقرار | 42 |
جمع کل | 66,862 گس |
نکتهای که باید در نظر داشته باشید این است که اگر در کانستراکتور (constructor) متغیرهایی از نوع ذخیره سازی (storage) مقداردهی کنیم، این هزینه بهمراتب بیشتر خواهد شد. برای هر متغیر باید 22,100 گس بهصورت جداگانه پرداخت شود. با این حال، برای حفظ سادگی و تمرکز این راهنما، از بررسی آن صرفنظر کردیم.
برای اطلاع از روشهای کاهش هزینه استقرار، میتوانید مقاله ما با عنوان بهینه سازی گس در سالیدیتی را مطالعه کنید. تمام ارقام مربوط به هزینه گس در این مقاله، بر اساس مستندات رسمی اتریوم یعنی Ethereum Yellow Paper استخراج شدهاند.
تبدیل گس به دلار
برای محاسبه هزینه دلاری از روی واحد گس (gas)، میتوانیم از فرمول زیر استفاده کنیم:
هزینه (دلار) = (تعداد گس × قیمت گس بر حسب gwei × قیمت اتریوم بر حسب دلار) ÷ 1,000,000,000
قیمت گس بر حسب gwei را میتوانید از وبسایتهایی مثل EthGasStation یا Etherscan دریافت کنید.
در این مثال، اگر فرض کنیم:
-
قیمت اتریوم: 1000 دلار
-
قیمت گس: 20 gwei
-
تعداد گس مصرفشده: 66,862
محاسبه به شکل زیر خواهد بود:
1 |
66,862 × 20 × 1000 ÷ 1,000,000,000 = 1.33724 دلار |
راستی! برای دریافت مطالب جدید در کانال تلگرام یا پیج اینستاگرام سورس باران عضو شوید.
- انتشار: ۵ مرداد ۱۴۰۴
دسته بندی موضوعات
- آموزش ارز دیجیتال
- آموزش برنامه نویسی
- آموزش متنی برنامه نویسی
- اطلاعیه و سایر مطالب
- پروژه برنامه نویسی
- دوره های تخصصی برنامه نویسی
- رپورتاژ
- فیلم های آموزشی
- ++C
- ADO.NET
- Adobe Flash
- Ajax
- AngularJS
- apache
- ARM
- Asp.Net
- ASP.NET MVC
- AVR
- Bootstrap
- CCNA
- CCNP
- CMD
- CSS
- Dreameaver
- EntityFramework
- HTML
- IOS
- jquery
- Linq
- Mysql
- Oracle
- PHP
- PHPMyAdmin
- Rational Rose
- silver light
- SQL Server
- Stimulsoft Reports
- Telerik
- UML
- VB.NET&VB6
- WPF
- Xml
- آموزش های پروژه محور
- اتوکد
- الگوریتم تقریبی
- امنیت
- اندروید
- اندروید استودیو
- بک ترک
- بیسیک فور اندروید
- پایتون
- جاوا
- جاوا اسکریپت
- جوملا
- دلفی
- دوره آموزش Go
- دوره های رایگان پیشنهادی
- زامارین
- سئو
- ساخت CMS
- سی شارپ
- شبکه و مجازی سازی
- طراحی الگوریتم
- طراحی بازی
- طراحی وب
- فتوشاپ
- فریم ورک codeigniter
- فلاتر
- کانستراکت
- کریستال ریپورت
- لاراول
- معماری کامپیوتر
- مهندسی اینترنت
- هوش مصنوعی
- یونیتی
- کتاب های آموزشی
- Android
- ASP.NET
- AVR
- LINQ
- php
- Workflow
- اچ تی ام ال
- بانک اطلاعاتی
- برنامه نویسی سوکت
- برنامه نویسی موبایل
- پاسکال
- پایان نامه
- پایتون
- جاوا
- جاوا اسکریپت
- جی کوئری
- داده کاوی
- دلفی
- رباتیک
- سئو
- سایر کتاب ها
- سخت افزار
- سی اس اس
- سی پلاس پلاس
- سی شارپ
- طراحی الگوریتم
- فتوشاپ
- مقاله
- مهندسی نرم افزار
- هک و امنیت
- هوش مصنوعی
- ویژوال بیسیک
- نرم افزار و ابزار برنامه نویسی
- وردپرس