Ethereum Gas یا سوخت اتریوم چیست: راهنمای گام به گام

Ethereum Gas (سوخت اتریوم) نیروی زندگی‌بخش اکوسیستم اتریوم‌ است و جز این به نحو دیگری نمی‌توان آن را تعریف کرد. Gas واحد اندازه‌گیری تلاش محاسباتی مورد نیاز برای اجرای عملیات‌ها است. هر عملیاتی که در اتریوم‌ انجام می‌گیرد، از یک تراکنش ساده گرفته تا یک قرارداد هوشمند و حتی یک ICO (عرضه اولیه سکه) نیازمند مصرف مقداری Gas است. Gas برای محاسبه‌ مقدار کارمزدی به کار می‌رود که باید برای انجام یک عملیات مشخص به شبکه پرداخت شود. در این راهنما با نحوه‌ کار Gas آشنا می‌شویم. اما پیش از آن، چند مفهوم وجود دارد که باید آن‌ها را درک کنیم.

0 271

What is Ethereum Gas: Step-By-Step Guide

بیت کوین، اتریوم‌ و پیدایش قراردادهای هوشمند

بیت کوین به این خاطر به وجود آمد که بسیاری از خود می‌پرسیدند:

  • آیا امکان دارد نوعی پول به وجود آید که دو نفر بتوانند بدون نیاز به واسطه آن را بین خود جابجا کنند؟
  • آیا امکان ایجاد یک پول غیر متمرکز وجود دارد که بر مبنای چیزی شبیه به بلاک چین کار کند؟

ساتوشی ناکاموتو (Satoshi Nakamoto) از راه رسید و با به وجود آوردن بیت کوین (Bitcoin) به این پرسش‌ها پاسخ داد. بالاخره یک سیستم پولی غیر متمرکز به وجود آمد که می‌توانست پول را از فردی به فرد دیگر انتقال دهد. اما بیت کوین یک مشکل داشت؛ مشکلی که در تمامی بلاک چین‌های نسل نخست وجود دارد. این بلاک چین‌ها تنها امکان تراکنش‌های پولی را فراهم می‌کنند و امکان ندارد بتوان برای این تراکنش‌ها شرایط معین کرد. آلیس (Alice) می‌تواند 5 BTC برای باب (Bob) بفرستد ولی نمی‌توان برای این تراکنش شروطی تعریف کند. برای نمونه نمی‌تواند به باب بگوید که پس از انجام کار مشخصی مبلغ را دریافت خواهد کرد. وارد کردن این شرایط نیازمند نگارش کدهای به شدت پیچیده و دشواری است. چیزی نیاز بود تا کار را قدری ساده‌تر کند و آن چیزی نبود جز قرارداد هوشمند.

قرارداد هوشمند

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

اتریوم‌ ساخته شده به دست ویتالیک بوترین (Vitalik Buterin) نمونه‌ برجسته‌ این نسل است. سازندگان اتریوم‌ به دنیا نشان دادند بلاک چین چگونه می‌تواند تکامل پیدا کند و از یک مکانیزم پرداخت ساده به چیزی معنادار و نیرومند بدل شود. اما قرارداد هوشمند و چیست و چرا اهمیت دارد؟

اتریوم

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

ethereum gas

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

قراردادهای هوشمند شامل مجموعه دستوراتی هستند که با استفاده از زبان برنامه‌نویسی «سالیدیتی» (solidity) نوشته می‌شوند. کدهای سالیدیتی برمبنای منطق IFTTT کار می‌کنند که مخفف منطق «اگر این در نتیجه آن» (IF-THIS-THEN-THAT) است. روند کار به این صورت است که اگر نخستین سری از دستورات به انجام برسند آنگاه تابع بعدی اجرا می‌شود و پس از آن تابع بعدی و همینطور ادامه پیدا می‌کند تا به پایان قرارداد برسد.

بهترین راه برای درک این روند، تصور کردن یک دستگاه فروش خوراکی (Vending Machine) است. هر گامی که برمی‌دارید و هر کاری که انجام می‌دهید باعث می‌شود گام بعدی خود به خود به جریان بیفتد و کار بعدی خود را فعال کند. چیزی شبیه به حرکت دومینو. پس بیایید مراحل کار با دستگاه فروش خوراکی را بررسی کنیم:

  • مرحله 1: شما مقداری پول به دستگاه فروش خوراکی می‌دهید.
  • مرحله 2: دکمه‌ی مربوط به آیتمی را که می‌خواهید بخرید فشار می‌دهید.
  • مرحله 3: آیتم بیرون می‌آید و شما آن را برمی‌دارید.

نگاهی به این سه مرحله (Step) بیندازید و ارتباط آن‌ها بیندیشید. آیا هر مرحله می‌تواند بدون اتفاق افتادن مرحله‌ پیشین صورت گیرد؟ هر یک از این مرحله‌ها به طور مستقیم در گرو مرحله‌ پیش از خود است. یک مساله‌ دیگر هم وجود دارد که بخشی از قراردادهای هوشمند نیز می‌باشد. در تمام مدت کار با دستگاه فروش خوراکی، شما (درخواست کننده) تنها کسی هستید که با دستگاه (ارائه کننده) کار می‌کنید و چیزی به نام واسطه وجود ندارد.

اکنون تصور کنید چنین تراکنشی در شبکه‌ی اتریوم‌ چگونه اتفاق می‌افتد؟ فرض کنید می‌خواهید در شبکه‌ اتریوم‌ چیزی از دستگاه فروش خوراکی بخرید. در این صورت مراحل چه هستند؟

  • مرحله 1: شما مقداری پول به دستگاه فروش خوراکی می‌دهید و این کار شما به وسیله‌ همه‌ گره‌های شبکه‌ اتریوم‌ ثبت و تراکنش در دفتر ثبت آپدیت می‌شود.
  • مرحله 2: شما دکمه‌ مربوط به آیتم مورد نظر خود را فشار می‌دهید و این مساله نیز در شبکه و دفتر ثبت اتریوم‌ آپدیت می‌شود.
  • مرحله 3: دستگاه آیتمی را که می‌خواهید بیرون می‌دهد و شما آن را برمی‌دارید. این کار از سوی تمامی گره‌ها ثبت و به دفتر ثبت وارد می‌شود.

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

ماشین مجازی اتریوم‌ چیست؟

پیش از پرداختن به ماشین مجازی اتریوم‌ (EVM) ابتدا باید ببینیم اصلا ماشین مجازی (Virtual Machine) به چه معناست. پس بیایید به قراردادهای هوشمند بازگردیم. در قراردادهای هوشمند چه ویژگی‌هایی دلخواه ما هستند؟

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

  • قطعی باشد
  • پایان‌پذیر باشد
  • ایزوله باشد

ویژگی شماره 1: قطعی بودن

یک برنامه به شرطی قطعی (Deterministic) است که هر چند بار یک ورودی به آن بدهیم، خروجی یکسانی دریافت کنیم. برای نمونه اگر باشد، آنگاه همواره مساوی 4 خواهد بود (با فرض مبنای یکسان). پس هنگامی که برنامه‌ای در کامپیوترهای مختلف با گرفتن یک مجموعه ورودی مشخص، خروجی‌ یکسانی تولید کند آن برنامه قطعی است.

هر برنامه در چند لحظه‌ی گوناگون به صورت قطعی عمل نمی‌کند. این لحظات عبارت اند از:

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

ویژگی شماره 2: پایان‌پذیر

در منطق ریاضی، خطایی به نام «مساله توقف» (halting problem) وجود دارد. تعریف این مفهوم به زبان ساده این است که نمی‌توان گفت آیا یک برنامه می‌تواند کارکرد خود را در یک بازه زمانی انجام دهد یا خیر. در سال 1936 آلن تورینگ (Alan Turing) با به کارگیری «استدلال قطری کانتور» نتیجه‌ گرفت که هیچ راهی برای پی بردن به این مساله وجود ندارد که یک برنامه در یک بازه زمانی به پایان می‌رسد یا خیر.

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

  • ناتمامی تورینگ (Turing Incompleteness): یک بلاک چین ناتمام تورینگ، کارکرد محدود شده‌ای دارد و فاقد توانایی پرش و دور زدن (حلقه) است. بنابراین، بلاک چین‌های ناتمام تورینگ به حلقه‌های نامتناهی وارد نمی‌شوند.
  • کنتور مرحله و کارمزد: یک برنامه به راحتی می‌تواند شمار مرحله‌‌هایی که طی کرده را به دست آورد. به این ترتیب، برنامه می‌تواند شمار دستوراتی که اجرا کرده را داشته باشد، آن را به عنوان مرحله در نظر بگیرد و هنگامی که به مرحله‌‌ای با شماره‌ی خاص رسید به کار خود پایان دهد. روش دیگر، اندازه‌گیری کارمزد است که به آن «کارمزد سنج» (Fee meter) نیز گفته می‌شود. در این حالت، قراردادها با یک کارمزد از پیش پرداخت شده به اجرا درمی‌آیند. اجرا شدن هر دستور نیازمند وجود مقدار مشخص از کارمزد است. اگر کارمزد پرداخت شده از مقدار کارمزد پیش‌ پرداخت بیشتر باشد، آنگاه قرارداد پایان می‌پذیرد.
  • تایمر: در برخی موارد یک تایمر از پیش تعریف شده به کار می‌رود. اگر زمان اجرای قرارداد از بازه‌ زمانی تعریف شده تجاوز کند، از بیرون لغو خواهد شد.

ویژگی شماره 3: ایزوله

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

اکنون که با ویژگی‌های قرارداد هوشمند آشنا شده‌ایم، مهم است بدانیم این قراردادها چگونه اجرا می‌شوند. قراردادهای هوشمند معمولا مبتنی بر یکی از دو سیستم زیر اجرا می‌شوند:

  • ماشین مجازی: اتریوم‌ از این سیستم استفاده می‌کند.
  • داکر: فابریک از این سیستم استفاده می‌کند.

در ادامه این دو سیستم را با هم مقایسه می‌کنیم تا ببینیم کدام یک اکوسیستم بهتری ایجاد می‌کند. برای سادگی کار اتریوم‌ (ماشین مجازی) را با فابریک (داکر) مقایسه می‌کنیم.

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

همان طور که مشاهده می‌کنید، ماشین‌های مجازی به لحاظ قطعی بودن، پایان‌پذیر بودن و ایزوله بودن محیط بهتری برای قراردادهای هوشمند ایجاد می‌کنند. با این وجود، داکرها هیچ مزیت منحصربه فردی ندارند. ویژگی داکر وجود انعطاف‌پذیری در زبان کدنویسی است در حالی که ماشین‌های مجازی (VM) همچون اتریوم‌ شما را برای ایجاد قرارداد هوشمند به یادگیری یک زبان کاملا جدید وادار می‌کنند.

EVM یک ماشین مجازی است که تمامی قراردادهای هوشمند آن در اتریوم‌ کار می‌کنند. EVM یک ماشین مجازی 256-bit کامل تورینگ (Turing Complete) ساده اما قدرتمند است. کامل تورینگ به این معناست که هر برنامه‌ی اجرا شده در EVM، با در نظر گرفتن مقدار منابع و حافظه‌ی موجود، می‌تواند هر مساله‌ای را حل کند.

Gas اتریوم‌ چیست؟

همان طور که در ابتدا گفتیم، Gas واحدی برای سنجش میزان تلاش محاسباتی است که برای اجرای عملیات‌ها صورت می‌گیرد.

توجه: پیش از ادامه‌ی بحث، تشکر ویژه‌ داریم از جوزف چو (Joseph Chow) به خاطر این مطلب عالی درباره Gas اتریوم‌.

بیشتر قراردادهای هوشمندی که روی EVM اجرا می‌شوند با زبان سالیدیتی نوشته شده‌اند (اتریوم‌ قصد دارد در آینده به جای سالیدیتی از زبان وایپر استفاده کند). در کدنویسی به زبان سالیدیتی، هر خط برای اجرا شدن نیاز به مقدار مشخصی Gas دارد.

تصویر زیر از کتاب زرد اتریوم‌ (Ethereum Yellowpaper) گرفته شده و با بررسی آن می‌توان به طور کلی فهمید که دستورات مختلف چه مقدار Gas نیاز دارند. بر اساس این جدول، هر تراکنش دسته‌کم 21,000 Gas لازم دارد.

پیوست G. جدول کارمزد

جدول کارمزد G حاوی 31 مقدار اسکالر است. این مقادیر نشان دهنده‌ی هزینه‌ی (برحسب Gas) عملیات‌هایی می‌باشند که یک تراکنش می‌تواند به دنبال داشته باشد.

توضیح مقدار نام

  • عملیات‌های مجموعه «صفر» هیچ هزینه‌ای ندارند 0
  • مقدار Gas پرداختی برای عملیات‌های مجموعه‌ی پایه 2
  • مقدار Gas پرداختی برای عملیات‌های مجموعه‌ی بسیار کم 3
  • مقدار Gas پرداختی برای عملیات‌های مجموعه‌ی کم 5
  • مقدار Gas پرداختی برای عملیات‌های مجموعه‌ی میانی 8
  • مقدار Gas پرداختی برای عملیات‌های مجموعه‌ی بالا 10
  • مقدار Gas پرداختی برای عملیات‌های مجموعه‌ی extcode 700
  • مقدار Gas پرداختی برای عملیات بالانس BALANCE 400
  • Gas هر عملیات SLOAD 200
  • Gas هر عملیات JUMPDEST 1
  • Gas هر عملیات SSTORE وقتی مقدار ذخیره بین 20000
  • غیرصفر تا صفر قرار گرفته است
  • Gas هر عملیات SSTORE وقتی مقدار ذخیره صفر 5000
  • دست نخورده می‌ماند یا صفر می‌گردد
  • مقدار استرداد (افزوده شده به شمارشگر استرداد) هنگامی 15000
  • که مقدار ذخیره از مقدار ناصفر به صفر تغییر داده شده
  • مقدار استرداد (افزوده شده به شمارشگر استرداد) 24000
  • برای خود نابودسازی یک اکانت
  • مقدار Gas برای هر عملیات خودنابودسازی SUICIDE 5000
  • مقدار پرداختی برای عملیات ایجاد CREATE 32000
  • پرداختی برای هر بایت در عملیات CREATE 200
  • برای موفقیت در گذاشتن کد در وضعیت
  • مقدار Gas هر عملیات فراخوانی CALL 700
  • مقدار پرداختی برای هر انتقال غیرصفر 9000
  • به عنوان بخشی از عملیات CALL
  • هزینه‌ی کاستن قرارداد فراخوانی شده 2300
  • از مقدار CallValue برای جابجایی‌های غیرصفر
  • هزینه یک عملیات CALL یا SUICIDE که 25000
  • باعث ایجاد یک اکانت می‌شود
  • هزینه جزیی هر عملیات EXP 10
  • هزینه جزیی در صورت ضرب شدن در 10
  • برای هر عملیات EXP
  • هزینه‌ی هر واژه‌ی افزوده هنگام گسترش حافظه 3
  • پرداختی تمام تراکنش‌های قرارداد – ساز 32000
  • پس از گذار هومستِد (Homestead)
  • هزینه هر بایت صفر از دیتا یا کد 4
  • برای یک تراکنش
  • هزینه هر بایت غیرصفر از دیتا یا کد 68
  • برای یک تراکنش
  • هزینه هر تراکنش 21000
  • هزینه جزیی هر عملیات LOG 375
  • هزینه هر بایت در هر عملیات LOG دیتا 8
  • هزینه‌ هر تاپیک در یک عملیات LOG 375
  • هزینه هر عملیات SHA3 30
  • هزینه هر واژه (گرد شده) از 6
  • دیتای ورودی در یک عملیات SHA3
  • هزینه جزیی عملیات‌های COPY ضرب در 3
  • واژه‌های کپی شده. گرد شده است.
  • هزینه عملیات بلوک هش BLOCKHASH 20

برای داشتن درک بهتر از نحوه‌ کار Gas در اتریوم‌، از یک شرایط مقایسه‌ای استفاده می‌کنیم. فرض کنید که می‌خواهید به مسافرت جاده‌ای بروید. پیش از انجام این کار مراحل زیر را طی خواهید کرد:

  • به پمپ Gas می‌روید و تصمیم می‌گیرد چقدر Gas در ماشین خود بریزید.
  • باک ماشین را پر می‌کنید.
  • هزینه‌ Gas را که برداشته‌اید به پایگاه Gas می‌دهید.

حال هم ارز این روند را در اتریوم‌ بررسی می‌کنیم.

راندن خودرو عملیاتی است که می‌خواهید اجرا کنید؛ درست مانند اجرای یکی از توابع یک قرارداد هوشمند. Gas هم همان Gas است. پمپ Gas همان ماینر یا استخراج کننده‌ است. پولی که به پمپ Gas می‌دهید هم کارمزد ماینر (دستمزد پمپ Gas) است.

تمامی عملیات‌هایی که کاربران در اتریوم‌ اجرا می‌کنند، باید برای موارد زیر Gas داشته باشند:

  • برای دیتای عملیات. آن را Gas ذاتی یا اصلی می‌نامند.
  • برای تمام محاسبات.

اکنون با مبانی کار آشنا شده‌اید. ممکن است پرسش‌های زیر برایتان ایجاد شده باشد.

اصلا چرا سیستم Gas وجود دارد؟

پاسخ ساده است: ایجاد انگیزه.

اتریوم‌ همانند هر سیستم همتا به همتای اثبات کار به شدت وابسته به نرخ هش ماینرهای خود است. هر چه شمار ماینرها بیشتر باشد، نرخ هش بالاتر می‌رود و در نتیجه سیستم تندتر و امن‌تر کار می‌کند. برای جذب کردن ماینر به سیستم باید کاری کنید که سیستم تا جای ممکن برای آن‌ها سودآور و جذاب باشد. ماینر‌ها در اتریوم‌ از دو راه می‌توانند درآمد داشته باشند:

  • استخراج بلوک‌ها و گرفتن پاداش بلوک
  • تبدیل شدن به حاکم مطلق اما موقتی در بلوک‌های مورد نظر ماینر

بیایید مورد دوم را بررسی کنیم.

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

اکنون پرسش این است که چقدر کارمزد می‌توان گرفت؟ پیش از محاسبه‌ آن ابتدا بیایید شیوه‌ اندازه‌گیری Gas را مرور کنیم.

Gas به روشی ساده و با واحد Gas اندازه‌گیری می‌شود. هر تراکنشی که برای شبکه‌ اتریوم‌ فرستاده می‌شود، بسته به شمار دستورات EVM (که باید اجرا شوند) هزینه‌ی مشخصی بر حسب Gas دارد (برای نمونه 100 Gas).

Gas را چگونه به اتر (Ether) تبدیل می‌کنیم؟

هیچ قیمت ثابتی وجود ندارد که با آن Gas را به اتر تبدیل کنیم. بستگی به فرستنده‌ی تراکنش دارد که چه قیمتی را برای Gas تعیین می‌کند. از سوی دیگر، به ماینر بستگی دارد که تراکنش مورد نظر خود را تایید کند (ماینرها مسلما به دنبال تراکنش‌هایی هستند که قیمت Gas آن‌ها بیشتر است). میانگین قیمت Gas معمولا نزدیک به 20 Gwei (برابر با 0.00000002 ETH) است، اما ممکن است در زمان‌هایی به دلیل بالا بودن ترافیک شبکه افزایش یابد. هرچه تعداد تراکنش بیشتری برای کامل کردن بلوک بعدی رقابت کنند، این قیمت هم بالاتر می‌رود.

در زیر چارت میانگین قیمت Gas اتریوم‌ را مشاهده می‌کنید.

What is Ethereum Gas: Step-By-Step Guide

پیش از ادامه‌ بحث، مهم است که با مفهوم محدودیت Gas آشنا شوید.

محدودیت Gas چیست؟

به منظور انجام عملیات‌ها در اتریوم‌، فرستنده‌ی تراکنش می‌بایست پیش از ارائه درخواست خود به شبکه، یک محدودیت Gas (Gas Limit) تعریف کند. محدودیت Gas حداکثر مقداری از Gas است که فرستنده‌ حاضر است برای تراکنش خود بپردازد.

در هنگام مشخص کردن محدودیت Gas باید نکات زیر را در نظر گرفت:

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

حال بیایید در یک سناریوی فرضی، روند عملیات را بررسی کنیم.

فرض کنید می‌خواهیم دو عدد را با هم جمع کنیم. برای این قرارداد باید کارهای زیر را انجام دهیم:

10 را در یک متغیر ذخیره کنیم. فرض کنیم این عملیات 45 Gas هزینه دارد.

دو متغیر را با هم جمع کنیم. فرض کنیم این کار 10 Gas هزینه دارد.

نتیجه را ذخیره کنیم. این کار هم 45 Gas نیاز دارد.

فرض کنیم فرستنده محدودیت Gas را 120 تعیین می‌کند.

مجموع Gas به کار رفته توسط ماینر برای محاسبه عبارت است از:

\[ (45+10+45) = 100 gas \]

کارمزدی که از آن ماینر شده با فرض هر 1 Gas 20 Gwei عبارت است از:

\[ (100 * 20 Gwei) = 0.000002 ETH \]

پس چقدر Gas باقی می‌ماند؟

\[ 120 – 100 = 20 gas \]

20 Gas استفاده نشده باقی مانده و به فرستنده استرداد می‌شود که ارزش آن برابر است با:

\[ (20 * 20 Gwei) = 0.0000004 ETH \]

با توجه به آنچه گفته شده، دو سناریو وجود دارد که بهتر است آن‌ها را بررسی کنیم:

  • محدودیت Gas تعریف شده ممکن است بسیار کم باشد
  • محدودیت Gas تعریف شده ممکن است بسیار زیاد باشد

سناریو 1: محدودیت Gas بسیار کم

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

به مثال سفر جاده‌ای بازمی‌گردیم. اگر به اندازه‌ی کافی به ماشین خود Gas نزده باشید، نمی‌توانید به مقصد برسید اما در این حالت هم پول Gas را به پمپ Gas پرداخت می‌کنید.

حال بیایید این شرایط را در قرارداد هوشمند فرضی‌مان بررسی کنیم. مراحل قرارداد عبارت اند از:

  • 10 در یک متغیر ذخیره می‌شود. فرض کنیم هزینه این عملیات 45 Gas است.
  • دو متغیر با هم جمع می‌شوند. هزینه این عملیات 10 Gas است.
  • نتیجه ذخیره می‌گردد. این کار 45 Gas می‌خواهد.

اما این بار فرستنده میزان محدودیت Gas را 90 قرار داده است.

حال که می‌دانیم Gas مورد نیاز برای انجام این تراکنش 100 است، پس با وجود محدودیت 90 Gas، مقداری کم داریم. در این حالت، ماینر محاسباتی به ارزش 90 Gas انجام می‌دهد و سپس از فرستنده کارمزدی به اندازه‌ی 90 Gas می‌گیرد که مقدار آن می‌شود:

\[ (90 * 20 Gwei) = 0.0000018 ETH \]

همچنین، قرارداد به حالت اولیه‌ی خود باز می‌گردد و تراکنش در بلاک چین لحاظ می‌شود.

سناریو 2: محدودیت Gas بسیار زیاد

اگر محدودیت Gas بسیار بالا باشد چه اتفاقی می‌افتد؟ مسلم است که هرچه باقی مانده به ارسال کننده استرداد می‌شود.

ethereum gas

فرض کنید تراکنش آ (یک جابجایی ساده‌ اتریوم‌) دارای محدودیت Gas 42,000 است و دو تراکنش ب و پ (که آن‌ها هم جابجایی ساده‌ اتریوم‌ هستند) دارای محدودیت Gas 21,000 می‌باشند.

برای یک ماینر منطقی‌تر است کدام تراکنش را در بلوک بگذارد؟

  • آیا ماینر تراکنش آ را می‌گذارد و مقدار زیادی Gas استفاده نشده را مسترد می‌کند؟
  • یا تراکنش‌های ب و پ را می‌گذارد و مقدار کمی Gas مسترد می‌کند یا اصلا Gas مسترد نمی‌کند؟

از لحاظ اقتصادی، حالت دوم برای ماینرها منطقی‌تر است نه؟

درست به همین خاطر است که تعریف محدودیت Gas زیاد روش چندان خوبی نیست. کار منطقی تعریف محدودیت Gas است که تنها اندکی بیشتر از مقدار Gas مورد نیاز برای انجام تراکنش است.

در زیر چارت میانگین محدودیت Gas را مشاهده می‌کنید.

What is Ethereum Gas: Step-By-Step Guide

Gas کم و زیاد در مقایسه با کارمزد کم و زیاد

تا به اینجا باید برای شما روشن شده باشد که Gas و اتر یک چیز نیستند. Gas مقدار نیروی محاسباتی مورد نیاز و اتر ارز مورد استفاده برای پرداخت Gas می‌باشد.

اکنون با تمام آگاهی‌هایی که تا به اینجا کسب کردهایم، بیایید چند سناریوی Gas و کارمزد را مرور کنیم.

اگر یک عملیات مقدار Gas کمی داشته باشد، ماینرها آن را برنمی‌گزینند، زیرا به اندازه‌ی کافی Gas ندارد تا نیروی محاسباتی آن را تامین کنند.

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

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

اگر یک عملیات کارمزد زیادی داشته باشد، آنگاه ماینرها می‌دانند که پول زیادی از آن به دست خواهند آورد. در نتیجه بی‌درنگ آن را برمی‌گزینند.

قیمت‌های کنونی Gas برای سطوح مختلف سرعت تراکنش به نقل از ethgasstation  عبارت‌اند از:

در سناریوهای استرداد Gas چه اتفاقی می‌افتد؟

در زبان سالیدیتی دو دستور وجود دارد که تضمین می‌کند مقادیر اضافی Gas بازگشت داده شوند. این دو دستور عبارت اند از:

  • SUICIDE – این دستور قرارداد هوشمند را خاتمه می‌دهد. انجام این کار با استرداد 24000 Gas همراه است.
  • SSTORE – دستور حذف ذخیره باعث بازگرداندن 15000 Gas می‌شود.

اگر قرارداد شما از 14,000 Gas استفاده کند و ذخیره حذف شود آنگاه 1000 Gas (15000-1400) به شما مسترد می‌گردد نه؟

به این سادگی نیست.

در چنین وضعیتی ماینرها همه‌ی انگیزه‌ی خود را از دست می‌دهند. وظیفه‌ی ماینرها نیست که هزینه‌ی محاسبات کار شما را پرداخت کنند.

برای پیشگیری از سناریوهایی مانند این، شرایطی وضع شده است.

مجموع Gas مسترد نباید از نصب Gas به کار رفته برای محاسبات بیشتر باشد.

بیایید با یک مثال مساله را روشن کنیم.

فرض کنید قرارداد هوشمندی داریم که از 14,000 Gas استفاده می‌کند.

محدودیت Gas تعیین شده برای این قرارداد 20,000 Gas است.

این قرارداد هوشمند دارای یک دستور SSTORAGE است.

سازنده‌ قرارداد پس از انجام محاسبات چقدر Gas پس می‌گیرد؟

نخست، 6000 Gas استفاده نشده به او باز می‌گردد:

\[ (20,000-14,000) = 6,000 \]

همچنین دستور SSTORAGE استفاده شده است، بنابراین به لحاظ نظری باید 15,000 Gas دیگر هم باز گردد.

مقدار Gas که در قرارداد به کار رفته 14,000 است و چون 15,000 > 14,000/2 (15000 از نصف Gas استفاده شده بیشتر است)، مقدار 7000 Gas بازگردانده می‌شود:

\[ 14,000/2= 7000 \]

به این ترتیب مجموع Gas که در پایان کار به سازنده بازگردانده می‌شود عبارت است از:

\[ 6000+7000 = 13,000 \]

بیایید یک نمونه‌ دیگر را بررسی کنیم.

فرض کنیم این بار قرارداد 70,000 Gas مصرف می‌کند که شامل یک تابع SUICIDE است.

یک تابع SUICIDE باید 24,000 Gas را بازگرداند که < 70,000/2 (از نصف Gas مصرفی کمتر است). در این شرایط، Gas بازگردانده شده عبارت است از 24,000 + Gas استفاده نشده.

نقد Gas اتریوم‌: آیا منصفانه است؟

سیستم Gas اتریوم‌ به خاطر ارائه‌ی یک ساز و کار مناسب اجرایی که باعث ایجاد انگیزه در ماینرها می‌شود بسیار مورد ستایش قرار گرفته است. با این وجود اخیرا برخی انتقاد‌ها در مورد آن مطرح شده که می‌گوید این سیستم برای توسعه‌دهندگان و سازندگان قراردادهای هوشمند بیش از اندازه گران است.

دنی رایان (Danny Ryan) در مقاله‌ی هکرنون (Hackernoon) خود پژوهش‌های جالب توجی در مورد این مساله انجام داده است.

سناریوی زیر را در نظر بگیرید:

هنگامی که دو عدد یک میلیون بار در اتریوم‌ جمع شود، هزینه‌ی کارمزدی برابر با $26.55 خواهد داشت.

دنی رایان این روند را با یک سیستم AWS استاندارد مقایسه کرده است. او می‌گوید می‌تواند دو عدد را با استفاده از پایتون ظرف 0.04 ثانیه یک میلیون بار با هم جمع کند و هزینه‌ی آن با توجه به نرخ ساعتی $0.0059 آمازون EC2 می‌شود $0.000000066.

این یعنی محاسبات در اتریوم‌ 400 میلیون بار گران‌تر است!

با توجه به این تحقیقات، نتیجه‌ زیر گرفته شده است:

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

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

شاید از این مطالب هم خوشتان بیاید.

ارسال پاسخ

آدرس ایمیل شما منتشر نخواهد شد.