گس – gas در سالیدیتی(solidity)
گس – gas در سالیدیتی(solidity) کارمزدی است که برای انجام تراکنش در بلاک چین اتریوم لازم است. قیمت گس بر حسب gwei مشخص شده است. Gwei نامی از ارز دیجیتال اتر است. به جای اینکه بگویید قیمت گس شما 0.000000001 اتر است، می توانید بگویید قیمت گس شما 1 gwei است. از گس برای تخصیص منابع ماشین مجازی اتریوم (EVM) استفاده میشود تا تراکنشهای کیف پول و تراکنشهای قرارداد هوشمند بتوانند خود به خود اجرا شوند.
“عرضه و تقاضا در بلاکچین تعیین کننده قیمت گس در Solidity است. اگر قیمت گس شما خیلی پایین باشد، تراکنش شما اجرا نخواهد شد. اگر قیمت گس شما بیش از حد بالا باشد، پس شما بیش از حد گس پرداخت کردید.”
به عبارت ساده گس یک واحد محاسبه است که برای محدود کردن اجرای محاسبات در شبکه استفاده می شود.
هدف از گس = محدود کردن میزان تراکنش هایی که سیستم انجام خواهد داد.
گس- Gas در سالیدیتی(solidity) چگونه محاسبه می شود؟
کارمزد تراکنش با استفاده از این فرمول ( گس مصرفی * قیمت گس) محاسبه می شود.
دو جزء برای گاز در Solidity وجود دارد که درک آنها مهم است.
(1) قیمت گس (Gas Price) = برای 1 گس چقدر حاضرید بپردازید. قیمت گسرا به عنوان مبلغی که برای 1 گالن یا لیتر بنزین در پمپ بنزین می پردازید در نظر بگیرید.
- Lower= زمان انتظار کندتر برای پردازش در بلوک
- Higher = زمان سریعتر برای پردازش در بلوک
(2) حد گس (Gas Limit) = حداکثر گسی که می خواهید برای این معامله استفاده کنید. محدودیت گس را به عنوان حداکثر مقدار بنزینی که باک بنزین خودروی شما می تواند نگه دارد و می خواهید برای یک سفر با ماشین (بدون توقف) استفاده کنید، در نظر بگیرید.
- حد پایین= محاسبات کمتری که تراکنش شما می تواند پردازش کند
- محدودیت بالاتر= محاسبات بیشتری را تراکنش شما می تواند پردازش کند
اگر قیمت گس پایین باشد و قرارداد شما به محاسبات زیادی برای اجرای یک تابع نیاز نداشته باشد، هزینه تراکنش شما پایین خواهد بود. اگر قیمت گس بالا باشد و تراکنش پیچیده ای برای انجام آن داشته باشید، هزینه تراکنش شما بالا خواهد بود. این یک سیستم متغیر است که به عرضه و تقاضای سیستم و پیچیدگی عملکرد(ها) برای اجرا بستگی دارد.
همه عملکردها برای اجرا نیاز به هزینه گس ندارند. فقط تراکنشهایی که برای نوشتن در بلاکچین هستند نیاز به گس دارند. اگر برای مشاهده دادهها (مانند موجودی، متغیرهای قرارداد، درخواست دادههای بازار از یک صرافی غیرمتمرکز) با یک قرارداد تماس میگیرید، نیازی به پرداخت هزینه گاز ندارید.
چگونه هزینه های گاز قرارداد هوشمند خود را کاهش دهید
داده های بلاک چین بر روی هزاران دیسک کامپیوتری در سراسر جهان تکرار می شود. این راحتی در دسترسی به داده ها، ذخیره سازی را گران می کند.
برای کاهش هزینه های گاز قرارداد هوشمند خود، فضای ذخیره سازی خود را کاهش دهید. EVM دو کد عملیاتی گران قیمت دارد:
SSTORE- داده ها را در یک شکاف ذخیره سازی ذخیره می کند
SLOAD- داده ها را از یک اسلات ذخیره سازی می خواند
در زیر چندین نکته مفید برای کاهش هزینه های گاز قرارداد هوشمند آورده شده است. برای تعیین ارزان ترین مسیر گاز باید آزمون و خطا انجام دهید.
- اگر مجبور نیستید، داده ها را روی بلاک چین ذخیره نکنید
تغییر در متغیرهای حالت هزینه گس زیادی دارد. اگر قرار نیست دوباره از داده ها استفاده کنید، آن ها را در بلاک چین ذخیره نکنید. از خود بپرسید که آیا باید به جای استفاده از ذخیره سازی بلاک چین، رویدادی را منتشر کنید؟ هنگامی که ذخیره سازی یا تغییر حالت در قرارداد شما اتفاق می افتد، عمل خوبی است که رویدادها (event) را منتشر کنید.
- اگر می توانید ازمتغیرهای Const و immutable استفاده کنید
برای متغیرهای ذخیره سازی که تغییر نمی کنند از کلمات کلیدی Const و immutable استفاده کنید. استفاده از کلمات کلیدی Const و immutable باعث کاهش هزینه گس شما در هنگام فراخوانی SLOAD می شود. Immutable به این معنی است که می توانیم متغیر را در سازنده تنظیم کنیم اما هرگز نمی توانیم دوباره تغییر دهیم. Const مشابه immutable است اما در اعلان مشخص شده است و هرگز نمی تواند دوباره تغییر کند
مثلا:
// use immutable in your variable if it is not going to change
// this will reduce gas costs
address public immutable WETH;
constructor (address wethToken) {
WETH = wethToken;
}
// or use a constant specified in the declaration
address public constant WETH = 0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
- خواندن و نوشتن را کاهش دهید
تعداد دفعاتی که عملکردهای قرارداد هوشمند شما به فضای ذخیرهسازی دسترسی دارند را کاهش دهید. در تابع خود ذخیره سازی را در متغیر حافظه در ابتدای تابع بخوانید و ذخیره سازی را در انتهای تابع تنظیم کنید.استفاده از ذخیره سازی سرد و گرم کردن آن (با استفاده از حافظه محلی) و سپس ذخیره داده ها و سرد کردن مجدد آن هزینه گس کمتری دارد.
// accessing storage multiple times costs more gas
function foo () public returns (uint) {
require read storage
require read storage
if statement read storage
else if read storage
set storage
// accessing storage less cost less gas
// read storage once and save it into local memory in your function
// then set storage at the end of your function
function foo () public returns (uint) {
memory = read storage
require memory
require memory
if statement memory
else if memory
set storage
- اندازه نوع داده را کاهش دهید و از struct استفاده کنید
ساختارها (Struct) رکوردهایی با بیش از یک نوع داده هستند. EVM هر نوع داده را می گیرد و آنها را در اسلات ها قرار می دهد (به ترتیب اعلام / از بالا به پایین). اسلات های ذخیره سازی هر کدام 32 بایت بوده و همچنین بسیار گران هستند. بنابراین اندازه انواع داده های خود را تغییر دهید. برای مثال اگر به یک نوع uint256 که 32 بایت است نیاز ندارید آن را کوچکتر کنید.
به عنوان مثال:
- uint128 – 16 bytes
- uint96 – 12 bytes
- uint64 – 8 bytes
سپس به ترتیبی که نقاط داده را در ساختارهای خود اعلام می کنید فکر کنید. اگر هر اسلات حافظه 32 بایت باشد، داده خود را در struct تعریف کنید تا هر اسلات را متناسب با آن پر کنند. نکته این است که از فضایی که برای داده ها در قرارداد هوشمند Solidity خود اختصاص می دهید و استفاده می کنید آگاه باشید. اگر انواع و اندازه های خود را بهینه کنید، می توانید در مصرف گاز صرفه جویی کنید.
در صورتی که تجربه خاصی در خصوص برنامهنویسی ندارید میتوانید از دورههای رایگان سایت ما “فرازمان“، استفاده کنید. همچنین اگر به دورههای پیشرفتهتری در این خصوص نیاز داشته باشید، ما با آموزش های حرفه ای که در سایتمان قرار دادیم می توانید به سطح دلخواهتان با تلاش و پشتکار برسید.
نقشه راه
راهنما آکادمی فرازمان
برای یادگیری برنامه نویسی بلاکچین…
در این باره بیشتر بخوانید
دیدگاهتان را بنویسید