بررسی حساب ها، تراکنش ها و سوخت (Gas) در اتریوم

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

انواع حساب در اتریوم

حساب های اتریوم به دو دسته تقسیم می شوند:

  • حساب های با مالکیت خارجی (بیرونی) یا Externally Owned Accounts (EOA)
  • حساب های مبتنی بر قرارداد یا Contracts Accounts

به طور خلاصه، حساب های با مالکیت بیرونی در واقع همان حساب های کیف پول شما هستند که با کلید خصوصی شما مدیریت می شوند؛ از این حساب ها با نام EOA که مخفف Externally Owned Accounts است یاد می شود؛ اما کنترل حساب های مبتنی بر قرارداد، از طریق کد آن قرارداد انجام می گیرد.

در ادامه به بررسی این دو مورد می پردازیم.

حساب های با مالکیت خارجی (EOA)

حساب های با مالکیت خارجی شامل چهار ویژگی زیر می باشند:

  • موجودی آن ها اتر است.
  • می توانند تراکنش ارسال کنند (اتر جابجا کنند و یا کد یک قرارداد را فعال کنند).
  • کنترل و مدیریت آن ها از طریق کلیدهای خصوصی است.
  • هیچ کدی مختص به خود ندارند.
1
1

حساب های مبتنی بر قرارداد

حساب های مبتنی بر قرارداد شامل چهار ویژگی زیر می باشند:

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

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

کد قرارداد توسط ماشین مجازی اتریوم (Ethereum Virtual Machine) که روی همه نودها وجود دارد اجرا می شود؛ این کار (اجرای کد) به عنوان بخشی از وظیفه آن ها برای تایید بلاک های جدید محسوب می شود.

تراکنش ها و پیام ها چه چیزهایی هستند؟

در ادامه به بررسی چیستی تراکنش ها و پیام ها، تفاوت این دو و جزئیات مربوط به آن ها در شبکه اتریوم می پردازیم.

تراکنش ها (Transactions)

2
2

اصطلاح “تراکنش” اتر، به “بسته ای امضا شده از داده ها” اطلاق می شود؛ این بسته ی امضا شده از داده ها، پیامی را در خود ذخیره می کند که باید از یک حساب با مالکیت خارجی، به یک حساب دیگر بر روی بلاکچین ارسال شود.

تراکنش اتر شامل موارد زیر می شود:

  • دریافت کننده پیام
  • امضایی که ارسال کننده را تایید هویت می کند و قصد آن ها از ارسال پیام از طریق بلاکچین برای گیرنده را مشخص می کند.
  • گزینه VALUE (ارزش)؛ میزان wei مورد نظر برای ارسال از طرف فرستنده به گیرنده. (wei در اتریوم، مانند سنت در دلار و یا ساتوشی در بیتکوین است)
  • یک گزینه اختیاری برای اطلاعات؛ می تواند شامل پیامی شود که به قرارداد ارسال می شود.
  • گزینه GAS LIMIT (حد سوخت)؛ مشخص کننده حداکثر تعداد مراحل محاسباتی است که اجرای تراکنش مجاز به عبور از آن ها است.
  • گزینه GAS PRICE (قیمت سوخت)؛ مشخص کننده کارمزدی است که ارسال کننده به منظور پرداخت برای هر واحد از سوخت در نظر دارد.
3
3

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

پیام ها (Messages)

قراردادها قابلیت ارسال “پیام” به قراردادهای دیگر را دارند. پیام ها چیزهایی مجازی هستند که تنها در محیط اجرایی اتریوم وجود دارند. می توان آن ها را مثل فراخوانی توابع در نظر گرفت.

پیام ها شامل موارد زیر می شوند:

  • ارسال کننده پیام (ضمنی)
  • دریافت کننده پیام
  • گزینه VALUE؛ میزان wei مورد نظر که می خواهیم در کنار پیام، به آدرس یک قرارداد بفرستیم.
  • یک گزینه اختیاری برای داده، که ورودی اصلی به قرارداد است.

گزینه GASLIMIT (حد سوخت)؛ این گزینه حداکثر میزان سوختی که اجرای کد می تواند متحمل شود را محدود می کند. (اجرایی شدن کد از طریق همان پیام فعال می شود)

4
4

در واقع یک پیام، مانند یک تراکنش است؛ با این تفاوت که توسط یک قرارداد ساخته می شود و نه یک بازیگر بیرونی. یک پیام زمانی ساخته می شود که کدِ در حال اجرای یک قرارداد، آپکدهای CALL یا DELEGATE CALL را اجرا کند؛ این ها به ساخت و اجرای یک پیام می پردازند. گاهی اوقات به این پیام ها “تراکنش های داخلی” یا “internal transaction” نیز گفته می شود (عکس شماره 3).

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

سوخت یا gas چیست؟

اتریوم یک محیط اجرایی بر روی بلاکچین دارد که به آن ماشین مجازی اتریوم یا Ethereum Virtual Machine می گویند. هر نود مشارکت کننده در شبکه، به عنوان بخشی از پروتکل تایید بلاک، این EVM را اجرا می کند؛ (EVM مخفف ماشین مجازی اتریوم است). آن ها تراکنش های لیست شده در بلاکی که در حال تایید آن هستند را مرور می کنند و کد را اجرا می کنند؛ چرا که فعال سازی یا به عبارتی دکمه فعال کردن آن کد، از طریق تراکنش درون EVM زده شده است.

بیشتر بخوانید: ماشین مجازی اتریوم Ethereum Virtual Machine (EVM) چیست؟

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

در اتریوم، سوخت یا همان gas یک مقیاس اندازه گیری برای نیاز محاسباتی است. برای هر عملیات، یک مقدار ثابتی از سوخت مشخص شده است. برای مثال جمع کردن دو عدد، به اندازه 3 سوخت هزینه دارد؛ عدد سوخت مورد نیاز برای محاسبه یک هش، 30 می باشد؛ و یا ارسال یک تراکنش، 21000 سوخت هزینه دارد.

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

سوخت و هزینه تراکنش های اتر

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

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

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

تخمین هزینه تراکنش

هزینه اتری یک تراکنش به دو فاکتور بستگی دارد:

یک، gasUsed (سوخت استفاده شده)؛ همانطور که از نام آن پیداست، این مورد به میزان سوخت مصرف شده توسط تراکنش بر می گردد

دو، gasPrice (قیمت سوخت)؛ قیمت یا هزینه هر واحد از سوخت مشخص شده برای تراکنش (این قیمت به اتر است)

در نتیجه: هزینه کلی = تعداد واحد سوخت مصرف شده * هزینه هر واحد سوخت


سوخت مصرف شده یا gasUsed

برای هر عملیاتی در EVM، مقدار سوخت مصرفی مشخصی در نظر گرفته شده است. “سوخت مصرف شده” مجموع تمام سوخت های مصرف شده برای تمام عملیات های اجرا شده است.

برای محاسبه هزینه سوخت، می توان از برخی API های تخمین استفاده کرد که البته باید در استفاده از آن ها احتیاط کرد.

قیمت سوخت یا gasPrice

یک کاربر، تراکنشی را می سازد و امضا می کند؛ هر کاربر می تواند مشخص کند که gasPrice مورد نظرش چقدر است؛ این عدد می تواند صفر هم باشد. اکثر تراکنش ها قیمت سوختی معادل 0.05e12 wei دارند. در نتیجه متقاعد کردن یک استخراج کننده برای انتخاب تراکنشی با قیمت سوخت کمتر یا صفر، کمی دشوار است.

مثالی از هزینه تراکنش

می توانید حد سوخت (gas limit) را مانند واحدهای سوخت ماشین (مقادیری همچون لیتر یا گالن( در نظر بگیرید. قیمت سوخت (gas price) را نیز می توانید مانند قیمت هر واحد از این سوخت ماشین در نظر بگیرید.

برای ماشین، به ازای هر گالن (هر واحد از سوخت ماشین) باید 2.5 دلار هزینه کنید. برای اتریوم، به ازای هر “سوخت” یا همان “gas” (هر واحد از سوخت شبکه اتریوم) باید 20 GWEI هزینه کنید. (از این لینک می توانید هر اتر را به زیر مجموعه های آن تبدیل کنید: https://www.myetherwallet.com/helpers.html)

برای اینکه باک ماشین را پر کنید، باید 25 دلار هزینه کنید؛ چرا که پر کردن باک، 10 گالن سوخت نیاز دارد و هزینه هر گالن 2.5 دلار بود. پس برای اینکه باک تراکنش خود را در دنیای اتریوم پر کنید، باید 21000 واحد “سوخت” در آن بریزید ( یعنی ظرفیت باک تراکنش را 21000 در نظر بگیرید). این یعنی باید 0.00042 اتر هزینه کنید. چرا که هزینه هر سوخت معادل 20 GWEI بود.

در نتیجه کامزد کلی TX شما معادل است با 0.00042 اتر.

ارسال توکن ها معمولا به 50000 الی 100000 سوخت نیاز دارد؛ این یعنی کارمزد شما به 0.001 الی 0.002 اتر افزایش پیدا می کند.

حد سوخت بلاک یا block gas limit چیست؟

یک حد سوخت برای عملیات ها داشتیم و یک حد سوخت برای بلاک داریم. این عدد مشخص کننده حداکثر مقدار سوخت مجاز در یک بلاک است تا مشخص کند چه تعداد تراکنش می تواند در آن جای بگیرد. برای مثال فرض کنید 5 تراکنش داریم؛ هر تراکنش دارای حد سوخت (gas limit) معادل 10، 20، 30، 40 و 50 است. اگر حد سوخت بلاک 100 باشد، 4 تراکنش اول می توانند در بلاک جای بگیرند.

همانطور که قبلا هم گفتیم، استخراج کنندگان انتخاب می کنند که کدام تراکنش ها را در بلاک جای دهند. پس ممکن است یک استخراج کننده دیگر تصمیم بگیرد دو تراکنش آخر (با حد سوخت 50 و 40) را در بلاک جای دهد؛ در اینصورت می تواند تراکنش اول را (که حد سوخت آن 10 است) نیز در بلاک جای دهد.

فرض کنید (به عنوان یک استخراج کننده) می خواهید تراکنشی که سوخت بیشتری نسبت به حد سوخت فعلی بلاک مصرف می کند را انتخاب کنید؛ در این صورت، کلاینت اتریوم شما پیامی به شما می دهد؛ مضمون چنین است: “تراکنش از حد سوخت بلاک تجاوز می کند”.

حد سوخت بلاک را می توانید از این لینک مشاهده کنید: https://ethstats.net/

چه کسی درباره میزان حد سوخت بلاک تصمیم گیری می کند؟

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

حد سوخت بلاک چگونه تغییر می کند؟

استخراج کنندگان اتریوم از یک برنامه استخراج استفاده می کنند؛ برنامه هایی مثل ethminer که آن را به یک geth یا نود کلاینت اتریومParity  وصل می کند. geth و Parity دارای ویژگی ها و تنظیمماتی هستند که استخراج کنندگان امکان ایجاد تغییرات در آن ها را دارند.

گزینه های خط فرمانی geth برای استخراج را می توانید از این لینک مشاهده کنید: https://github.com/ethereum/go-ethereum/wiki/Command-Line-Options

گزینه های Parity را نیز می توانید از لینک روبرو مشاهده کنید: https://github.com/paritytech/parity/wiki/Configuring-Parity#cli-options

عبارت DoS در شبکه اتریوم چیست؟

عبارت DoS مخفف Denial of Service یا همان منع سرویس است. قبلا صحبت ها و نظراتی درباره کاهش سرعت شبکه اتریوم، مسدود شدن و غیر قابل استفاده شدن آن وجود داشت.  از این کاهش سرعت، به عنوان یک “DoS” در شبکه اتریوم یاد می شود.
یک منع سرویس یا DoS ، زمانی در شبکه اتریوم رخ می دهد که مداوما بلاک ها پر شوند و تعداد زیادی تراکنش هم در حال انتظار باشند.

در نظر داشته باشید که استخراج کنندگان می توانند بر اساس کارمزدها، هر تراکنشی را که می خواهند انتخاب کنند. اگر صدها هزار تراکنش در صف انتظار باشند، می تواند باعث تاخیرهای چند ساعتی غیر معمول شود. حادثه DDoS می تواند از عمد و به صورت یک حمله باشد و هم می تواند یک اتفاق باشد.

DoS های عمدی و مخرب

در پاییز 2016، اتریوم توسط فرد یا گروهی مورد حمله قرار گرفت؛ این حمله با نام حمله تراکنش های اسپم شناخته می شد.

فرد یا افراد مهاجم یک حمله DoS انجام دادند؛ این کار را از طریق صدا زدن مداوم برخی کدهای عملیاتی (آپکد) انجام دادند که پردازش این کدها از لحاظ محاسباتی، برای کلاینت ها سخت بود؛ این کدهای عملیاتی در قراردادهای هوشمند این مهاجمان قرار داشت، اما از نوعی بودند که اضافه کردن آن به شبکه هزینه زیادی برایشان نداشت.

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

DoS های غیر عمدی و غیر مخرب

این نوع از DoS یا منع سرویس زمانی رخ می دهد که شبکه دارای تعداد زیادی تراکنش در حال انتظار باشد. همین موضوع باعث می شود تا تراکنش ها برای مدت زمانی غیر معمول و طولانی در انتظار بمانند. آی سی او ها (ICO) یا همان حراج اولیه کوین ها، باعث شده بود که شبکه دچار چنین مشکلی شود.

چرا حد سوخت بلاک حتی وقتی که بلاک ها پر هستند تغییر نمی کند؟

پروتکل اتریوم یک مکانیزم درونی دارد که استخراج کنندگان می توانند بر روی حد سوخت رای دهی کنند؛ در نتیجه حجم بلاک ها می تواند بدون آنکه نیازی به یک هاردفورک (انشعاب سخت) باشد، افزایش بیابد. این مکانیزم در واقع با یک استراتژی پیشفرض ادغام شده که در آن استخراج کنندگان می توانند روی حد گاز که حداقل مقدار آن 4.7 میلیون است رای بدهند؛
اما هدفش می تواند 150% از میانگین سوخت مصرف شده اخیر باشد؛ این امر باعث می شود تا حجم بلاک ها بصورت طبیعی و با افزایش درخواست ها (تعداد تراکنش ها) افزایش یابد؛ این در حالی است که سقفی برای مقاصد ضد اسپمی هم در نظر گرفته می شود.

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

استخراج کنندگان باید چه کاری انجام دهند؟

استخراج کنندگان می توانند تنظیمات خود را در geth یا parity به حالت قابل تطبیق برگردانند.

توجه داشته باشید که موارد زیر از پستی در Reddit برداشته شده و مقادیر آن می تواند با عددهای بالاتر نیز تنظیم شوند.

Geth
تنظیمات پیشنهاد شده:

–targetgaslimit  حداقل میزان سوخت برای بلاک ها را مشخص می کند (مقدار پیشفرض: 4712388) (این مقدار بصورت دستی تنظیم می شود)

–gasprice نمایانگر حداقل قیمت سوخت قابل پذیرش برای استخراج یک تراکنش است (مقدار پیشفرض: 20000000000) (اگر قیمت سوخت یک تراکنش از این عدد کمتر باشد، این استخراج کننده آن را نمی پذیرد)

Parity
تنظیمات پیشنهاد شده

–gas-floor-target  مشخص کننده میزان سوخت به ازای هر بلاک است که در زمان ساخت یک بلاک جدید باید به آن عدد برسیم. (پیشفرض: 4700000)

–gas-cap  نشان دهنده آن است که توجه به حجم تراکنش، حد سوخت را به ازای هر بلاک چقدر افزایش می دهیم. (پیشفرض: 6283184)

–gasprice حداقل میزان Wei به ازای هر سوخت (GAS) که باید برای هر تراکنش به منظور پذیرفته شدن در یک بلاک پرداخت شود.

سایر گزینه های پیش رو

لطفا برای اطلاع از سایر گزینه ها و امکانات پیش روی استخراج کنندگان به صفحه CLI برای geth و Parity به آدرس زیر مراجعه کنید. طی این گزینه ها، استخراج کنندگان می توانند تنظیمات مورد نظر خود را برای بهینه سازی انجام دهند.

Geth: https://github.com/ethereum/go-ethereum/wiki/Command-Line-Options

Parity:https://github.com/paritytech/parity/wiki/Configuring-Parity#cli-options

منبع : hudsonjameson