اتریوم چگونه کار می کند؟- قسمت دوم

قسمت اول را می توانید در این لینک بخوانید
سوخت و پرداخت
یکی از مهمترین مفاهیم اتریوم مفهوم کارمزدهاست. هر محاسبهای که برای اجرای یک تراکنش در شبکه اتریوم انجام میشود هزینهای دارد. اینجا هیچ چیز رایگان نیست! این هزینه با سوخت یا گَس (Gas) پرداخت میشود.
- سوخت واحدی است که برای اندازهگیری هزینهها و کارمزدهای موردنیاز برای محاسبات خاص استفاده میشود.
- قیمت سوخت (gas price) مقدار اتری است که برای هر واحد سوخت پرداخت میکنید و به صورت جیوی (GWei) اندازهگیری میشود. وی کوچکترین واحد اتر است. هر اتر ۱۰۱۸ وی است. یک جیوی برابر با یک میلیارد وی است.
کسی که تراکنش را ارسال میکند، باید حد سوخت (gas limit) و قیمت سوخت را برای آن تعیین کند. حاصلضرب این دو مقدار، نشاندهنده بیشترین مقدار وی است که فرستنده میخواهد برای اجرای این تراکنش بپردازد.
برای مثال، فرض کنیم فرستنده حد سوخت را ۵۰,۰۰۰ و قیمت سوخت را ۲۰ جیوی تعیین میکند. این بدان معناست که بیشترین مقدار کارمزدی که فرستنده میخواهد برای اجرای این تراکنش بپردازد ۰٫۰۰۱ اتر است.
۵۰,۰۰۰ ۲۰ × gwei = ۱,۰۰۰,۰۰۰,۰۰۰,۰۰۰,۰۰۰ Wei = ۰٫۰۰۱ Ether

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

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

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

به طور معمول، هر چه فرستنده قیمت سوخت بالاتری پرداخت کند ارزشی که ماینر از تراکنش بهدست میآورد بیشتر میشود. به همین دلیل احتمال بیشتری دارد که ماینرها این تراکنش را انتخاب کنند. ماینرها میتوانند به انتخاب خودشان تعدادی از تراکنشها را اعتبارسنجی کنند یا آنها را نادیده بگیرند. همچنین میتوانند با تبلیغِ کمترین قیمت سوخت برای اجرای تراکنش، افرادی را که نمیدانند چه قیمتی را برای سوخت در نظر بگیرند راهنمایی کنند.
برای فضای ذخیرهسازی هم هزینههایی وجود دارد
سوخت پرداختی فقط مختص مراحل محاسباتی نیست و برای میزان مصرفِ فضای ذخیرهسازی هم باید مبلغی در نظر گرفته شود. کل هزینه برای فضای ذخیرهسازی، متناسب با حداقل فضای مورد استفاده بوده که مضربی از ۳۲ بایت است.
هزینههای پرداختی برای فضای ذخیرهسازی، گاهی اختلافات جزئی با هم دارند. برای مثال، از آنجا که افزایش فضای ذخیرهسازی سبب میشود اندازه پایگاه داده حالت اتریوم در همه نودها افزایش یابد، مشوقهایی هم برای آزادکردن فضای ذخیرهسازی با کوچک نگهداشتن دادهها در نظر گرفته شده است. مثلا اگر یک تراکنش مرحلهای داشته باشد که سبب شود یک ورودی در فضای ذخیرهسازی پاک شود، بابت آزادسازی فضای ذخیرهسازی مبلغی به ارسالکننده آن تراکنش تعلق میگیرد.
هدف از این هزینهها و کارمزدها چیست؟
در روشی که اتریوم با آن کار میکند، هر عملیات تکی که توسط شبکه اجرا میشود همزمان توسط هر نود کامل انجام میشود. اما مراحل محاسباتی در ماشین مجازی اتریوم بسیار گران تمام میشوند، بنابراین قراردادهای هوشمند اتریوم برای انجام کارهای سادهای مانند اجرای کسبوکارهای ساده، تایید امضاها و نظایر آن بسیار سودمندتر هستند تا برای کاربردهای پیچیدهتری مانند ذخیرهسازی فایل، ایمیل یا یادگیری ماشین که به شبکه فشار وارد میکنند. همین هزینههای اِعمالشده هستند که اجازه نمیدهند کاربران بیشازحد از شبکه کار بکشند.
اتریوم یک زبان تورینگ کامل است. (بهطور خلاصه، یک ماشین تورینگ ماشینی است که میتواند هر الگوریتم کامپیوتری را شبیهسازی کند.) اگر با ماشین تورینگ آشنا نیستید، میتوانید آن را مطالعه کنید. این زبان امکان استفاده از حلقهها را فراهم میکند و بههمیندلیل ممکن است اتریوم با مشکل هالتینگ (ایجاد وقفهها) مواجه شود. هنگامی که این مشکل رخ میدهد، شما نمیتوانید تعیین کنید که آیا یک برنامه بهشکل نامحدود اجرا خواهد شد یا نه. بنابراین اگر هیچ هزینهای در کار نبود، یک فرد متخلف میتوانست با اجرای یک حلقه پایانناپذیر درون یک تراکنش به آسانی شبکه را تخریب کند و واقعا هیچچیز نمیتوانست جلوی آن را بگیرد. این هزینهها هستند که از شبکه در برابر حملات خرابکارانه محافظت میکنند.
شاید بگویید اگر این هزینهها برای انجام محاسبات ضروری است، چرا باید برای فضای ذخیرهسازی هم هزینه پرداخت کنیم؟ زیرا ذخیرهسازی روی شبکه اتریوم هم درست مانند محاسباتش هزینههایی دارد و کل شبکه باید بار نگهداری اطلاعات را بکشد.
تراکنشها و پیامها
گفتیم که اتریوم یک ماشین حالت مبتنی بر تراکنش است. بهعبارت دیگر، تراکنشهایی که بین حسابهای مختلف رخ میدهند حالت جهانی اتریوم را از یک حالت به حالت دیگر منتقل میکنند. یک تراکنش در اصل قطعه دستورالعملی است که امضای رمزنگاری دارد و یک حساب با مالکیت خارجی آن را ایجاد، مرتب و به بلاک چین ارسال میکند.
در بلاک چین اتریوم دو نوع تراکنش وجود دارد: تراکنش برای فراخوانی پیام (message calls) و تراکنش برای ایجاد قرارداد (یعنی تراکنشهایی که قراردادهای جدید اتریوم را ایجاد میکنند).
همه تراکنشها صرفنظر از نوعشان، دربردارنده اجزای زیر هستند:
- نانس: شمار تراکنشهای ارسالشده توسط فرستنده؛
- قیمت سوخت: تعداد وِی (Wei) که فرستنده میخواهد برای هر واحد سوخت که برای اجرای تراکنش نیاز است بپردازد؛
- حد سوخت: بیشترین مقدار سوخت که فرستنده میخواهد برای اجرای این تراکنش بپردازد. این مقدار قبل از اینکه محاسبات انجام شود، تنظیم و پرداخت میشود.
- به (to): این بخش شامل آدرسِ گیرنده است. در تراکنشی که برای ایجاد قرارداد انجام میشود، آدرس حساب مبتنی بر قرارداد هنوز وجود ندارد و بنابراین مقدار آن خالی است.
- ارزش یا مقدار (value): مقدار وی که قرار است از فرستنده به گیرنده انتقال یابد. در تراکنشهای ایجادکننده قرارداد، این مقدار بهعنوان موجودی اولیه در حساب مبتنی بر قرارداد تازه ایجادشده به کار میرود.
- v, r, s: برای ایجاد امضایی که هویت فرستنده تراکنش را شناسایی میکند به کار میرود.
- اینیت (فقط برای تراکنشهای ایجادکننده قرارداد وجود دارد): قطعه کد ماشین مجازی اتریوم که برای مقداردهی اولیه حساب مبتنی بر قرارداد جدید به کار میرود. کد اینیت (init) فقط یک بار اجرا میشود و سپس دور انداخته میشود. هنگامیکه اینیت برای اولین بار اجرا میشود، کد حساب را ایجاد میکند که قطعه کدی است که بهشکل دائمی با حساب مبتنی بر قرارداد در ارتباط است.
- داده (فیلد اختیاری که فقط برای تراکنشهای فراخوانی پیام وجود دارد): دادههای ورودی (یعنی پارامترهایی) که برای فراخوانی پیام به کار میروند. برای مثال، اگر یک قرارداد هوشمند بهعنوان یک سرویس ثبتنام دامنه عمل میکند، یک فراخوانی برای آن قرارداد ممکن است شامل فیلدهای ورودی برای وارد کردن دامنه و آدرس IP (آیپی) باشد.

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

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

در اینجا نکته مهمی وجود دارد: تراکنشها یا پیامهای داخلی حاوی حد سوخت نیستند. اگر یادتان باشد گفته بودیم که حد سوخت را حساب با مالکیت خارجی تعیین میکند. بنابراین حساب با مالکیت خارجی که آغازگر ارسال تراکنش است، از همان ابتدا باید حد سوخت را به اندازه کافی تعیین کرده باشد تا اگر قرار است علاوه بر اجرای تراکنش در بین کار عملیات فرعی مانند تراکنشهای داخلی و پیامهای «قرارداد به قرارداد» اجرا شوند، سوخت کافی موجود باشد. اگر در زنجیره تراکنشها و پیامها اجرای یک پیامِ بخصوص با اتمام سوخت مواجه شود، اجرای آن پیام و نیز هر پیام بعدی که در نتیجه آن ایجاد شده است برگشت میخورد. اما اجرای تراکنشهای اصلی (خارجی) لغو نمیشود.
بلاکها
همه تراکنشها با هم در بلاکها گروهبندی میشوند. یک بلاک چین شامل یک سری از بلاکهای حاوی تراکنشهاست که زنجیروار به هم متصلاند.
در اتریوم، یک بلاک از مؤلفههای زیر تشکیل شده است:
- سربرگ بلاک؛
- اطلاعاتی درباره مجموعه تراکنشهایی که در آن بلاک قرار دارند؛
- مجموعهای از سربرگهای بلاکهای دیگر برای اومِرهای بلاک فعلی.
اومر (Ommer) چیست؟
اومر بلاکی است که پدر آن همان پدرِ پدرِ بلاک فعلی است. بیایید نگاهی سریع به کاربرد اومرها بیندازیم و ببینیم اصلا چرا یک بلاک باید حاوی سربرگ بلاکهای اومرها باشد.
در روشی که اتریوم از آن استفاده میکند، زمان استخراج بلاک خیلی کوتاهتر (در حدود ۱۵ ثانیه) از بلاک چینهای دیگر مانند بلاک چین بیت کوین (در حدود ۱۰ دقیقه) است. این امر سبب میشود بررسی تراکنشها خیلی سریعتر انجام شود. بااینحال، زمان استخراج بلاک کوتاهتر معایبی هم دارد و یکی از آنها این است که ماینرهای بیشتری همزمان راهحل بلاکها را پیدا میکنند. در این هنگام باید بین دو بلاک به نحوی تصمیم گرفته شود که کدام یک وارد زنجیره اصلی شود. پس از این کار، یکی از بلاکها که رد شده است خارج از زنجیره باقی میماند و این بلاک همان بلاک اورفان (orphan) یا بلاک یتیم است.
هدف از اومرها پاداشدهی به ماینرهایی است که این بلاکهای یتیم را وارد کردهاند. اومرهایی که ماینرها وارد میکنند باید معتبر باشند، یعنی باید از نسل ششم (6 بلاک قبلتر) یا نسلهای تازهتر از آن باشند. دلیلش این است که پس از شش فرزند، بلاکهای یتیم قدیمی میشوند و دیگر نمیتوان به آنها مراجعه کرد (زیرا وارد کردن تراکنشهای قدیمیتر ممکن است همه چیز را کمی پیچیدهتر کند).
بلاکهای اومر نسبت به بلاکهای کامل پاداش کمتری دریافت میکنند. بااینحال، همین مقدار پاداش هم مشوقی است که میتواند ماینرها را ترغیب کند برای رسیدن به آن، این بلاکهای یتیم را وارد کنند.
سربرگ بلاک
بیایید یک لحظه به بلاکها برگردیم. قبلا گفتیم که هر بلاک یک سربرگ بلاک دارد، اما این سربرگ بلاک دقیقا چیست؟
سربرگ بلاک، بخشی از بلاک است که دارای اجزای زیر است:
- هش پدر (parentHash): هش سربرگ بلاک پدر (همان چیزی که مجموعه بلاکها را به یک زنجیره تبدیل میکند)؛
- هش اومر (ommersHash): هش فهرست اومرهای بلاک فعلی؛
- ذینفع (beneficiary): آدرس حسابی که کارمزدهای استخراج این بلاک را دریافت میکند؛
- ریشه حالت (stateRoot): هشِ نودِ ریشه از درخت مرکلِ حالت (گفتیم که درخت حالت در سربرگ ذخیره میشود و تأیید این حالت را برای لایت کلاینتها آسان میکند)؛
- ریشه تراکنشها (transactionsRoot): هشِ نود ریشه درخت که حاوی تمام تراکنشهای فهرستشده در این بلاک است؛
- ریشه رسیدها (receiptsRoot): هشِ نود ریشه درخت که حاوی رسیدهای تمام تراکنشهای فهرستشده در این بلاک است؛
- بلوم لاگها (logsBloom): یک فیلتر بلوم (ساختار داده) که حاوی گزارش اطلاعات است (کاربرد فیلتر بلوم در کامپیوتر، کاهش بار سرور و در عین حال استفاده اندک از حافظه است)؛
- سختی (difficulty): سطح دشواری استخراج یک بلاک؛
- شماره (number): شماره بلاک فعلی (بهعنوانمثال شماره بلاک جنسیس صفر است؛ برای رسیدن به شماره بلاک بعدی باید شماره هر بلاک را یک واحد اضافه کنیم)؛
- حد سوخت (gasLimit): حد سوخت فعلی به ازای هر بلاک؛
- سوخت مورداستفاده (gasUsed): مجموع کل مقدار سوخت استفادهشده توسط تراکنشهایی که در این بلاک هستند؛
- برچسب زمانی (timestamp): واحد زمانی این بلاک از آغاز؛
- داده اضافی (extraData): هر اطلاعات اضافی که به این بلاک مربوط است؛
- میکسهش (mixHash): نوعی هش که همراه با عدد تصادفی نانس ثابت میکنند که روی این بلاک محاسبات کافی انجام شده است؛
- نانس (nonce): نوعی هش که وقتی با میکسهش ترکیب میشود، اثبات میکند که روی این بلاک محاسبات کافی انجام شده است.

توجه کنید که هر سربرگ بلاک حاوی سه ساختار درختی به شکل زیر است:
- درخت حالت (ریشه حالت)؛
- درخت تراکنشها (ریشه تراکنشها)؛
- درخت رسیدها (ریشه رسیدها).
این ساختارهای درختی در واقع همان درختان پاتریسیا مرکل هستند که قبلا دربارهاش بحث کردیم.
چند اصطلاح مهم دیگر هم وجود دارند که بهتر است همینجا با توضیح آنها آشنا شوید.
لاگها
اتریوم این امکان را فراهم میکند که از طریق لاگها بتوان تراکنشها و پیامهای مختلف را پیگیری کرد. یک قرارداد میتواند با تعریف «رویدادهایی» که باید ثبت شوند یک لاگ ایجاد کند. لاگ شامل موارد زیر است:
- آدرس حساب ایجادکننده لاگ؛
- یک سری موضوعات که هر یک نشاندهنده رویدادهای متفاوتی هستند که توسط این تراکنش انجام شدهاند؛
- هر داده مرتبط با این رویدادها.
لاگها در یک فیلتر بلوم ذخیره میشوند که به روشی کارآمد میتواند حجم بیپایانی از دادههای لاگ را ذخیره کند.
رسید تراکنش
لاگهای ذخیرهشده در سربرگ، از اطلاعات لاگ که در رسید تراکنش موجود است ایجاد میشوند. همانطور که پس از خرید در یک فروشگاه رسید دریافت میکنید، اتریوم هم برای هر تراکنش یک رسید صادر میکند. هر رسید حاوی اطلاعات معینی درباره تراکنش است و موارد زیر را دربرمیگیرد:
- شماره بلاک؛
- هش بلاک؛
- هش تراکنش؛
- سوخت بهکاررفته در تراکنش فعلی؛
- کل سوخت استفادهشده در بلاک فعلی پس از انجام تراکنش؛
- لاگهای ایجادشده در طی تراکنش فعلی؛
- و موارد دیگر.
سختی بلاک
سختی یک بلاک بهمنظور ایجاد هماهنگی در زمان موردنیاز برای اعتبارسنجی بلاکها به کار میرود. سختی بلاک جنسیس ۱۳۱,۰۷۲ است. برای تعیین سختی بلاکهای بعدی فرمول خاصی استفاده میشود. اگر یک بلاک معین خیلی سریعتر از بلاک قبلی اعتبارسنجی شود، پروتکل اتریوم سختی بلاک را افزایش میدهد.
سختی بلاک روی عدد تصادفی نانس تأثیر میگذارد. نانس نوعی هش است که با استفاده از الگوریتم اثبات کار، در هنگام استخراج یک بلاک باید محاسبه شود.
رابطه بین سختی بلاک و نانس از طریق فرمول ریاضی زیر به دست میآید:

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




