احتمال دارد اسم بلاک چین اتریوم به گوشتان خورده باشد حتی اگر ندانید چیست. نام اتریوم به تازگی در اخبار بسیار شنیده شده و بر روی جلد برخی مجلات نیز آمده است، اما اگر با ماهیت اتریوم آشنا نیستند، مطالعه مقالاتی که درباره آن در مجلات منتشر شدهاند شاید برایتان نامفهوم و بیمعنا باشد.
ارزجو : راستی اتریوم چیست؟ اتریوم اصولاً یک دیتابیس عمومی است که تراکنشهای دیجیتال را به طور دائمی ثبت میکند. نکته مهم اینکه، برای نگهداری و تأمین امنیت این دیتابیس نیازی به هیچگونه ارگان مرکزی نیست. این دیتابیس در عوض به مثابه یک سیستم معاملهای «عاری از اعتماد» فعالیت میکند ــ چارچوبی که در آن افراد میتوانند معاملات همنوع با همنوع را انجام دهند بدون آنکه لازم باشد به یک شخص ثالث یا به یکدیگر اعتماد کنند.
هنوز هم برایتان نامفهوم است؟ این گزارش برای همین نوشته شده است. هدف من تشریح این موضوع است که اتریوم از لحاظ فنی چگونه عمل میکند بدون آنکه نیازی باشد به معادلات یا فرمولهای پیچیده ریاضی رجوع کنم. حتی اگر برنامهنویس نیستید، امیدوارم مطالعه این گزارش بتواند شما را کمی بیشتر با این فناوری آشنا سازد. اگر بعضی از قسمتها جنبه فنی دارند و درک آنها آسان نیست به هیچ وجه دلسرد نشوید. نیازی نیست تک تک جزئیات را متوجه شوید. توصیه میکنیم صرفاً بر روی درک و شناخت کلی موضوعات متمرکز شوید. پس گذارید کار خود را شروع کنیم.
در قسمت اول این مقاله به تعریف اتریوم و پارادیمهای آن پرداخته شد. در این قسمت به بررسی حسابها و حالتهای گوناگون آن و مباحثی نظیر تراکنشها و بلوکها خواهیم پرداخت. لازم به ذکر است قسمت سوم و پایانی این مقاله طی روزهای آینده منتشر خواهد شد.
حالت حساب
حالت حساب متشکل از چهار مؤلفه است که صرفنظر از نوع حساب موجود هستند:
- نانس (nonce): اگر حساب از نوع دارای مالکیت بیرونی باشد، این رقم نمایانگر تعداد تراکنشهایی است که از آدرس حساب ارسال شدهاند. اگر حساب از نوع قراردادی است، این رقم نمایانگر تعداد قراردادهایی است که توسط حساب ایجاد شدهاند.
- بالانس: تعداد «وی» (Wei) متعلق به این حساب. در ازای هر اتر ۱۰ به توان ۱۸ «وی» وجود دارد.
- ریشه ذخیره: هش گره ریشه یک درخت مرکل پاتریشیا (Merkle Patricia) (درباره درخت مرکل بعداً بیشتر خواهیم گفت). این درخت در واقع هش محتوای ذخیرهای حساب را رمزگذاری میکند و در حالت عادی خالی است.
- هش کد: هش کد ئیویام (ماشین مجازی اتریوم ــ بعداً در این باره خواهیم گفت) حساب. در رابطه با حسابهای قراردادی، این همان کدی است که به هش تبدیل شده و به عنوان هش کد ذخیرهسازی میشود. در رابطه با حسابهای دارای مالکیت بیرونی، دامنه هش کد در واقع هش رشته خالی است.
حالت جهانی
میدانیم که حالت جهانی اتریوم متشکل از یک نقشه ترسیمی میان آدرسهای حساب و حالات حساب است. این نقشه در یک ساختار داده موسوم به درخت مرکل پاتریشیا ذخیره میشود.
درخت مرکل نوعی درخت دوتایی است که مجموعههایی از گرههای دارای موارد زیر را در بر میگیرد:
- تعداد زیادی گره لبف در انتهای درخت که حاوی دادههای زیرمجموعه هستند
- مجموعهای از گرههای واسطهای که در آن هر گره در واقع هش دو گروه زیرمجموعه خود است
- یک گره ریشه تکی که از هش دو گره زیرمجموعه خود تشکیل شده و نمایانگر رأس درخت است
دادههای موجود در انتهای درخت از طریق تقسیم دادههایی که میخواهیم در قطعات (chunks) ذخیرهسازی کنیم ایجاد میشوند. قطعات سپس به باکت (bucket) تقسیم میشوند و هش هر باکت گرفته میشود و این فرآیند آنقدر تکرار میشود تا تنها یک هش باقی بماند: هش ریشه.
این درخت باید برای هر ارزش ذخیره شده در درون آن یک رمز داشته باشد. رمز مربوطه باید از همان گره ریشه درخت به شما بگوید که کدام گره را باید دنبال کنید تا به ارزش مربوطه برسید. این ارزش در گره لیف ذخیره شده است. در اتریوم، نقشه رمز/ارزش درخت حالات در واقع میان آدرسها و حسابهای مرتبط با آنها ترسیم شده و بالانس، نانس، هش کد، و ریشه ذخیره هر حساب را در بر میگیرد (در اینجا هر ریشه ذخیره به نوبه خود یک درخت است).
این ساختار درختی جهت ذخیرهسازی تراکنشها و رسیدها نیز استفاده میشود. به طور مشخص، هر بلوک دارای یک «سربرگ» (header) است که هش گره ریشه سه درخت مرکل مختلف را در خود ذخیره میکند. این سه درخت عبارتند از:
- درخت حالت
- درخت تراکنشها
- درخت رسیدها
توانایی ذخیرهسازی کارآمد همه این اطلاعات بر روی درختهای مرکل در اتریوم در ارتباط با آنچه که ما «کلاینتهای سبک» یا «گرههای سبک» مینامیم بسیار مفید و سودمند است. یادتان باشد که بلاک چین توسط مجموعهای از گرهها اداره میشود. به عبارت کلیتر، دو نوع گره وجود دارند: گرههای کامل و گرههای سبک.
یک گروه آرشیو کامل در راستای همگامسازی بلاک چین، زنجیره کامل را دانلود کرده و همه تراکنشهای موجود در درون آن را به اجرا میگذارد. زنجیره کامل از بلوک جنسیس گرفته تا بلوک رأس کنونی را شامل میشود. استخراجگران معمولاً بلوک آرشیو کامل را ذخیرهسازی میکنند، زیرا این امر در فرآیند استخراج الزامی است. همچنین میتوان یک گره کامل را دانلود کرد اما تراکنشهای آن را به اجرا نگذاشت. صرفنظر از این امر، هر گره کامل حاوی کل زنجیره است.
اما واقعاً نیازی به ذخیرهسازی کل زنجیره نیست، مگر آنکه لازم باشد که تک تک تراکنشها توسط گره اجرا شوند یا دادههای تاریخی آنها مورد جستجو قرار گیرد. اینجاست که مفهوم گره سبک مطرح میشود. به جای دانلود و ذخیرهسازی زنجیره کامل و اجرای همه تراکنشها، گره سبک تنها زنجیره سربرگها، از بلوک جنسیس گرفته تا رأس کنونی، را دانلود میکند بدون آنکه تراکنشها را به اجرا بگذارد یا حالات مربوطه را بازیابی کند. از آنجا که گرههای سبک به سربرگهای بلوک که حاوی هش سه درخت هستند دسترسی دارند، در نتیجه این گرهها به آسانی میتوانند پاسخهای قابل راستی آزمایی درباره تراکنشها، رویدادها، بالانسها، و غیره ایجاد و دریافت کنند.
دلیل امکانپذیر بودن چنین چیزی آن است که هشهای موجود در درخت مرکل به سمت بالا تکثیر مییابند ــ اگر یک کاربر بدخواه تلاش کند یک تراکنش جعلی را انتهای درخت مرکل قرار دهد، این امر موجب تغییر گره بالایی میشود و به واسطه این امر گرههای بالاتر نیز به همین منوال تغییر میکنند و در نهایت ریشه درخت تغییر میکند.
هر گره که بخواهد یک داده مشخص را راستی آزمایی کند میتواند برای این کار از چیزی به نام «اثبات مرکل» (Merkle proof) استفاده کند. اثبات مرکل متشکل از موارد زیر است:
- یک مجموعه از دادهها که قرار است راستی آزمایی شود به همراه هش آن
- هش ریشه درخت
- «شاخه» (همه هشهای شریک که در امتداد مسیر از کنده تا ریشه قرار دارند)
هر کسی با خواندن اثبات میتواند تائید کند که هش آن شاخه با همه هشهای موجود تا بالای درخت همخوانی دارد و اینکه مجموعه داده تحت بررسی جایش واقعاً در همان قسمت درخت است.
مخلص کلام اینکه، مزیت استفاده از درخت مرکل پاتریشیا در آن است که گره ریشه این ساختار از لحاظ رمزنگاری به دادههای ذخیره شده در درخت وابسته است و بنابراین هش گره ریشه را میتوان به عنوان هویت امن و ایمن این دادهها مورد استفاده قرار داد. از آنجا که سربرگ بلوک شامل هش ریشه درختهای حالت، تراکنشها، و رسیدها میشود، در نتیجه هر گره میتواند اعتبار بخش کوچکی از حالت اتریوم را تائید کند بدون آنکه نیازی به ذخیرهسازی کل حالت باشد. حالت به طور بالقوه میتواند از اندازه نامحدود برخوردار باشد.
سوخت و پرداخت
یکی از مفاهیم بسیار مهم در اتریوم در واقع مفهوم حقالعمل است. هر محاسبهای که در نتیجه انجام تراکنش بر روی شبکه اتریوم اتفاق میافتد با یک حقالعمل همراه است ــ هیچ چیز رایگان نیست! این حقالعمل در قالب «سوخت» پرداخت میشود.
سوخت در حقیقت واحد سنجش حقالعمل مورد نیاز برای یک تراکنش است. قیمت سوخت همان میزان اتر است که مایلید در ازای هر واحد سوخت هزینه کنید. قیمت سوخت بر مبنای مقیاس «جیوی» (gwei) اندازهگیری میشود. «وی» (Wei) نیز کوچکترین واحد اتر است و هر اتر برابر با ۱۰ «وی» به توان ۱۸ است. هر «جیوی» نیز برابر با ۱۰۰۰۰۰۰۰۰۰ «وی» است.
در هر تراکنش، فرستنده یک محدوده سوخت و یک قیمت سوخت مشخص میسازد. محصول محدوده سوخت و قیمت سوخت در واقع حداکثر میزان «وی» است که فرستنده مایل است در ازای اجرای هر تراکنش بپردازد.
برای مثال، فرض کنید فرستنده محدوده سوخت ۵۰۰۰۰ و قیمت سوخت ۲۰ «جیوی» را تعیین میکند. این بدان معناست که فرستنده مایل است حداکثر ۵۰۰۰۰ × ۲۰ «جیوی» = ۱۰۰۰۰۰۰۰۰۰۰۰۰ «وی» = ۰۰۱/۰ اتر برای اجرای تراکنش هزینه کند.
یادتان نرود که محدوده سوخت نمایانگر حداکثر میزان سوختی است که فرستنده حاضر است برای آن هزینه کند. اگر فرستنده در حساب خود از اتر کافی برخورد است و از پس هزینه این حداکثر سوخت بر میآید، در آن صورت میتواند به کار خود ادامه دهد. در پایان هر تراکنش، هزینه سوخت مصرف نشده بر مبنای همان نرخ تبدیل اولیه به حساب فرستنده بازگردانده میشود.
در صورتی که فرستنده سوخت مورد نیاز جهت انجام تراکنش را تأمین نکند، تراکنش «سوخت کم میآورد» و اعتبار آن تائید نمیشود. در این حالت، پردازش تراکنش متوقف میشود و هرگونه تغییر اعمال شده به حالت اول باز میگردد. در نتیجه به همان حالت اتریوم باز میگردیم که قبل از تراکنش در آن قرار داشتیم. بعلاوه، تراکنش ناموفق ثبت میشود و نشان داده میشود که جهت انجام کدام تراکنش تلاش شده و تراکنش کجای کار ناموفق بوده است. از آنجا که دستگاه تا قبل از آنکه سوخت تمام شود تلاش خود را جهت انجام محاسبات بکار گرفته، در نتیجه هیچ سوختی به فرستنده بازگردانده نمیشود.
پول سوخت دقیقاً کجا میرود؟ همه پولی که فرستنده صرف سوخت کرده به آدرس ذینفع فرستاده میشود که معمولاً آدرس استخراجگر است. از آنجا که استخراجگران تلاش میکنند محاسبات را به اجرا بگذارند و اعتبار تراکنشها را تائید کنند، در نتیجه هزینه سوخت به عنوان پاداش به آنها پرداخت میشود.
معمولاً هرچه که فرستنده مایل به پرداخت قیمت سوخت بالاتری باشد، ارزشی که استخراجگر از تراکنش دریافت میکند نیز بیشتر است. بنابراین، احتمال بیشتری وجود دارد که استخراجگران تراکنش مربوطه را انتخاب کنند. در این حالت، استخراجگران آزادند انتخاب کنند که کدام تراکنش را میخواهند تائید اعتبار کنند یا نادیده بگیرند. جهت راهنمایی فرستنده درباره اینکه چه قیمتی برای سوخت تعیین کند، استخراجگران میتوانند حداقل قیمت سوخت که در ازای آن تراکنشها را به اجرا میگذارند تبلیغ کنند.
برای ذخیرهسازی نیز باید حقالعمل پرداخت شود. از سوخت نه تنها جهت پرداخت حقالعمل محاسبه بلکه همچنین جهت پرداخت هزینه فضای ذخیرهسازی نیز استفاده میشود.
مجموع حقالعمل مربوط به ذخیرهسازی متناسب با حداقل فضای مورد استفاده محاسبه میشود.
حقالعمل ذخیرهسازی از ابعاد ظریفی برخوردار است. برای مثال، از آنجا که افزایش فضای ذخیرهسازی موجب افزایش اندازه حالت دیتابیس اتریوم بر روی همه گرهها میشود، در نتیجه برای کوچک کردن مقدار دادههای ذخیرهسازی شده انگیزه وجود دارد. به همین دلیل، اگر یک تراکنش مرحلهای را در بر گیرد که موجب پاک شدن یکی از مدخلهای وردی در فضای ذخیرهسازی میشود، از حقالعمل اجرای آن عملیات چشمپوشی میشود و در ازای پاکسازی فضای ذخیرهسازی حقالعمل مربوطه بازگردانده میشود.
هدف از وضع حقالعمل چیست؟
یکی از مهمترین ابعاد نحوه کارکرد اتریوم آن است که هر عملیاتی واحدی که توسط شبکه به اجرا گذاشته میشود همزمان از تک تک گرههای کامل متأثر میشود. با این حال، اقدامات محاسباتی بر روی ماشین مجازی اتریوم بسیار پرهزینه هستند. بنابراین، قراردادهای هوشمند اتریوم برای وظایف ساده نظیر اجرای یک منطق تجاری ساده یا تائید امضاها و دیگر آیتمهای رمزنگاری شده استفاده میشوند و در مورد وظایف پیچیدهتر نظیر ذخیرهسازی فایل، ایمیل، یا یادگیری ماشینی که فشاری بیشتری به شبکه وارد میکنند بکار گرفته نمیشوند. وضع حقالعمل مانع آن میشود که کاربران فشار بیش از حد به شبکه وارد کنند.
اتریوم یک زبان تورینگ (Turing) کامل است. (ماشین تورینگ دستگاهی است که میتواند هر الگوریتم کامپیوتری را شبیهسازی کند.) این مسئله موجب ایجاد شکلگیری لوپها میشود و اتریوم را در برابر مشکل توقف آسیبپذیر میسازد. هنگامی که این مشکل رخ میدهد، شما نمیتوانید مشخص سازید آیا برنامه به صورت نامحدود اجرا خواهد شد یا نه. اگر هیچ حقالعملی وضع نشده باشد، یک بازیگر بدخواه میتواند با اجرای یک لوپ نامحدود در درون تراکنش، شبکه را دچار اختلال کند بدون آنکه با تبعاتی مواجه شود. بنابراین، حقالعمل از شبکه در برابر حملات عامدانه محافظت میکند.
شاید با خود بگویید «چرا باید در ازای فضای ذخیرهسازی نیز حقالعمل پرداخت کنیم؟» همانند محاسبات، ذخیرهسازی بر روی شبکه نیز هزینهای در بر دارد که متوجه کل شبکه میشود.
تراکنش و پیامها در اتریوم
قبلاً گفتیم که اتریوم یک ماشین حالت معاملهای است. به عبارت دیگر، معاملات صورت گرفته میان حسابها موجب تغییر حالت جهانی اتریوم از یک حالت به حالت دیگر میشود.
به سادهترین عبارت، تراکنش یک دستور رمزنگاری شده است که توسط یک حساب دارای مالکیت بیرونی ایجاد و برای بلاک چین ارسال میشود.
دو نوع تراکنش وجود دارند: تماسهای پیامی و خلق قرارداد (یعنی تراکنشهایی که قراردادهای اتریومی جدید خلق میکنند). همه تراکنشها صرفنظر از اینکه از چه نوعی هستند دارای مؤلفههای زیر هستند:
- نانس: شمار تراکنشهایی که توسط فرستنده ارسال شدهاند.
- قیمت سوخت: تعداد «وی» که فرستنده مایل است در ازای هر واحد سوخت مورد نیاز جهت اجرای تراکنش بپردازد.
- محدودیت سوخت: حداکثر مقدار سوخت که فرستنده مایل است در ازای اجرای تراکنش بپردازد. این میزان پیشاپیش قبل از انجام هرگونه محاسبات تعیین و پرداخته میشود.
- گیرنده: آدرس گیرنده. در یک معامله خلق کننده قرارداد، حساب قراردادی فاقد آدرس است و در نتیجه از یک مقدار خالی استفاده میشود.
- ارزش: مقدار «وی» که از فرستنده برای گیرنده ارسال میشود. در یک معامله خلق کننده قرارداد، این مقدار به مثابه موجودی آغازین در حساب قراردادیِ تازه خلق شده است.
- وی آر اس (v, r, s): جهت ایجاد امضایی استفاده میشود که فرستنده معامله را شناسایی میکند.
- آینیت (init) (تنها در مورد معاملات خلق کننده قرارداد موجود است): بخشی از کد ماشین مجازی اتریوم که جهت آغاز یک حساب قراردادی جدید استفاده میشود. آینیت تنها یک بار اجرا میشود و سپس کنار گذاشته میشود. آینیت هنگامی که اولین بار به اجرا گذاشته میشود به کد حساب برمیگردد. کد حساب در واقع به طور دائم با حساب قراردادی مرتبط است.
- دادهها (گزینه اختیاری که تنها برای تماسهای پیامی موجود است): دادههای ورودی (پارامترهای) تماس پیامی. برای مثال، اگر یک قرارداد هوشمند به عنوان یک سرویس ثبت دامنه عمل میکند، تماس با آن قرارداد میتواند در بر گیرنده دادههای ورودی نظیر دامنه و آدرس آیپی باشد.
ما در بخش «حسابها» فرا گرفتیم که تراکنشها ــ تماسهای پیامی و معاملات خلق کننده قرارداد ــ همواره توسط حسابهای دارای مالکیت بیرونی آغاز و برای بلاک چین ارسال میشوند. به عبارت دیگر میتوان گفت که تراکنشها همان چیزی هستند که دنیای خارج را با حالت درونی اتریوم پیوند میزنند.
اما این بدان معنا نیست که قراردادها نمیتوانند با دیگر قراردادها گفتگو کنند. قراردادهایی که در درون گستره جهانی حالت اتریوم قرار دارند میتوانند در درون همان گستره با قراردادهای دیگر گفتگو کنند. آنها در این راستا برای قراردادهای دیگر «پیام» یا «معامله» میفرستند. ما میتوانیم پیامها یا تراکنشهای درونی را همانند دیگر معاملات بدانیم، با این تفاوت که آنها توسط حسابهای دارای مالکیت بیرونی خلق نشدهاند. آنها در عوض توسط قراردادها ایجاد میشوند. آنها آیتمهای مجازی هستند که برخلاف معاملات به شکل سریالی در نمیآیند و تنها در محیط اجرای اتریوم موجود هستند.
هنگامی که یک قرارداد یک تراکنش درونی برای قرارداد دیگر میفرستند، کد مربوطه که بر روی حساب قرارداد گیرنده وجود دارد اجرایی میشود.
یک نکته مهم این است که تراکنشهای درونی یا پیامها فاقد محدودیت سوخت هستند. این امر بدان خاطر است که محدودیت سوخت توسط خالق بیرونی تراکنش اولیه (یعنی یک حساب دارای مالکیت بیرونی) تعیین میشود. محدودیت سوخت که توسط حساب دارای مالکیت بیرونی وضع میشود باید به اندازه کافی بالا باشد تا بتواند تراکنش و همچنین آیتمهای زیر مجموعه آن نظیر پیامهای میان قراردادها را به اجرا بگذارد.
اگر در زنجیره تراکنشها و پیامها، سوخت مربوط به اجرای یک پیام تمام شود، فرآیند اجرای پیام و پیامهایی که متعاقباً ارسال شدهاند شکل معکوس به خود میگیرند و به حالت اول برمیگردند. با این حال، فرآیند اصلی اجرا شکل معکوس به خود نمیگیرد.
بلوکها
همه تراکنشها در قالب «بلوکها» دستهبندی میشوند. یک بلاک چین حاوی مجموعهای از این بلوکهاست که زنجیروار به یکدیگر متصل هستند.
در اتریوم، یک بلوک متشکل از موارد زیر است:
- سربرگ بلوک
- اطلاعات درباره مجموعه تراکنشهای موجود در بلوک
- مجموعهای از دیگر سربرگهای بلوک برای اومرهای (ommer) بلوک فعلی
اومر چیست
«اومر» دیگر چیست؟ اومر یک بلوک است که معادل والدِ والدِ بلوک فعلی قلمداد میشود. بگذارید ببینیم اومرها برای چه استفاده میشوند و چرا بلوک حاوی سربرگ بلوک برای اومرهاست.
با توجه به شیوه ایجاد اتریوم، زمان بلوک (۱۵ ثانیه) آن بسیار کمتر از زمان بلوک دیگر بلاک چینها نظیر بیت کوین (۱۰ دقیقه) است. این امر پردازش سریعتر تراکنشها را امکانپذیر میسازد. با این حال، یکی از معایب زمان کوتاهتر بلوک آن است که راهکارهای بلوکی رقابتی بیشتری توسط استخراجگران یافت میشوند. این بلوکهای رقیب همچنین «بلوکهای یتیم» نامیده میشوند (یعنی اینکه بلوکهای استخراج شده به درون زنجیره اصلی راه پیدا نمیکنند).
هدف از اومرها کمک به اعطای پاداش به استخراجگرانی است که این بلوکهای یتیم را لحاظ نمودهاند. اومرهایی که توسط استخراجگران لحاظ میشوند باید «معتبر» باشند، یعنی اینکه در محدوده نسل ششم با پایینتر بلوک مادر باشند. بلوکهای یتیم را پس از شش نسل دیگر نمیتوان مورد ارجاع قرار داد (زیرا لحاظ نمودن تراکنشهای قدیمیتر موجب پیچیدهتر شدن اوضاع میشود).
بلوکهای اومر در مقایسه با بلوکهای کامل پاداش کمتری دریافت میکنند. با این وجود، هنوز هم استخراجگران انگیزه دارند که این بلوکهای یتیم را لحاظ کنند و پاداش دریافت کنند.
سربرگ بلوک
بگذارید برای چند لحظه دوباره به سراغ بلوکها برویم. ما قبلاً گفتیم که هر بلوک دارای یک «سربرگ» بلوک است. اما این سربرگ دقیقاً چیست؟
سربرگ بلوک بخشی از بلوک است که موارد زیر را شامل میشود:
- هش مادر (parentHash): هش سربرگ بلوک مادر (این همان چیزی است که موجب میشود بلوک یک «زنجیره» را آغاز کند)
- هش اومر (ommersHash): هش فهرست اومرهای بلوک فعلی
- ذینفع: آدرس حسابی که حقالعمل استخراج این بلوک را دریافت میکند
- ریشه حالت (stateRoot): هش گره ریشه درخت حالت (اگر یادتان باشد قبلاً یاد گرفتیم که درخت حالت در سربرگ ذخیره میشود و در نتیجه کلاینتهای سبک میتوانند به آسانی هر چیزی درباره حالت را راستی آزمایی و تائید کنند)
- ریشه تراکنش (transactionsRoot): هش گره ریشه درخت که حاوی همه تراکنشهای فهرست شده در این بلوک است
- ریشه گیرنده (receiptsRoot): هش گره ریشه درخت که حاوی گیرندههای همه تراکنشهای فهرست شده در این بلوک است
- بلوم لاگها (logsBloom): فیلتر بلوم (ساختار داده) که حاوی اطلاعات لاگ است
- دشواری: سطح دشواری این بلوک
- شماره: شماره بلوک فعلی (بلوک جنسیس دارای شماره بلوک صفر است؛ شماره بلوک در ازای هر بلوک متعاقب به میزان ۱ عدد افزایش مییابد
- محدوده سوخت: محدوده سوخت کنونی در ازای هر بلوک
- مصرف سوخت: مجموع مقدار سوخت استفاده شده توسط تراکنشها در این بلوک
- تایماستمپ (timestamp): تایماستمپ یونیکس نقطه آغاز این بلوک
- دادههای مازاد: دادههای مازاد مربوط به این بلوک
- میکس هش (mixHash): یک هش که پس از ترکیب با نانس ثابت میکند که این بلوک محاسبات کافی را به اجرا گذاشته است
- نانس: یک هش که پس از ترکیب با میکس هش ثابت میکند که این بلوک محاسبات کافی را به اجرا گذاشته است
توجه داشته باشید که هر سربرگ بلوک حاوی سه ساختار درختی است:
- حالت (ریشه حالت)
- تراکنشها (ریشه تراکنشها)
- رسیدها (ریشه رسیدها)
این سه ساختار چیزی نیستند جز درختهای مرکل پاتریشیا که قبلاً درباره آنها صحبت کردیم.
بعلاوه، چند اصطلاح دیگر نیز هستند که باید تشریح شوند. بگذارید نگاهی به آنها بیندازیم.
لاگها
اتریوم ترتیبی میدهد تا لاگها ردگیری تراکنشها و پیامهای گوناگون را امکانپذیر سازند. یک قرارداد میتواند صریحاً از طریق تعریف «رویدادهایی» که میخواهد ثبت کند یک لاگ به وجود بیاورد.
مدخل لاگ حاوی موارد زیر است:
- آدرس حساب لاگر
- مجموعهای از موضوعات که نمایانگر رویدادهای گوناگونی هستند که توسط این تراکنش اجرایی شدهاند
- هرگونه دادههای مرتبط با این رویدادها
لاگها در فیلتر بلوم ذخیره میشوند و فیلتر بلوم دادهای لاگ نامحدودی را به نحو مؤثر و کارآمد ذخیرهسازی میکند.
رسید تراکنش
لاگهای ذخیره شده بر روی سربرگ از اطلاعات لاگ موجود در رسید تراکنش میآیند. درست همانگونه که هنگام خرید از فروشگاه یک رسید دریافت میکنید، اتریوم نیز برای هر معامله یک رسید صادر میکند. همانگونه که انتظار دارید، هر رسید حاوی برخی اطلاعات درباره معامله است. این رسید حاوی آیتمهای زیر است:
- شماره بلوک
- هش بلوک
- هش معامله
- سوخت مورد استفاده تراکنش فعلی
- مجموع سوخت مورد استفاده در بلوک فعلی پس از اجرای تراکنش فعلی
- لاگهایی که هنگام اجرای معامله فعلی ایجاد شدهاند
- و امثال اینها
دشواری بلوک
«دشواری» بلوک جهت افزایش هماهنگی و انطباق مدت زمانی که جهت تائید اعتبار بلوکها صرف میشود مورد استفاده قرار میگیرد. بلوک جنسیس دارای دشواری ۱۳۱۰۷۲ است و جهت محاسبه دشواری هر بلوک بعد از آن از یک فرمول ویژه استفاده میشود. اگر یک بلوک سریعتر از بلوک قبلی تائید اعتبار شود، پروتکل اتریوم میزان دشواری آن بلوک را افزایش میدهد.
دشواری بلوک بر نانس تأثیر میگذارد. نانس یک هش است که باید هنگام استخراج یک بلوک با استفاده از الگوریتم اثبات کار محاسبه شود.
رابطه بین دشواری بلوک و نانس از لحاظ ریاضیاتی بدین شکل است:
در اینجا Hd نمایانگر دشواری است.
تنها راه برای آنکه هش بتواند آستانه دشواری را محقق سازد استفاده از الگوریتم اثبات کار با هدف برشمردن همه احتمالات است. مدت زمان مورد انتظار جهت یافتن یک راهکار به میزان دشواری بستگی دارد ــ هر چه که میزان دشواری بالاتر باشد، یافتن نانس سختتر میشود و در نتیجه تائید اعتبار بلوک نیز سختتر میشود. متعاقباً، مدت زمان تائید اعتبار یک بلوک جدید نیز افزایش مییابد. بنابراین، با تنظیم دشواری یک بلوک، پروتکل میتواند مشخص سازد که تائید اعتبار یک بلوک چقدر زمان میبرد.
از سوی دیگر، اگر مدت زمان تائید اعتبار کمتر شود، پروتکل از میزان دشواری خود میکاهد. بدین ترتیب، مدت زمان تائید اعتبار به صورت خودکار به گونهای تنظیم میشود که یک ریتم و شتاب یکنواخت را به وجود بیاورد ــ به طور میانگین یک بلوک در هر ۱۵ ثانیه.
اجرای تراکنش
اکنون به یکی از پیچیدهترین بخشهای پروتکل اتریوم رسیدیم: اجرای یک تراکنش. فرض کنید یک تراکنش را به شبکه اتریوم میفرستید تا پردازش شود. چه اتفاقی میافتد تا حالت اتریوم تغییر کرده و تراکنش شما را نیز شامل شود؟
ابتدا، همه تراکنشها باید یک مجموعه اولیه از ملزومات را محقق سازند تا بتوان آنها را اجرا نمود. این ملزومات عبارتند از:
- تراکنش باید یک آرالپی (RLP) برخوردار از فرمت مناسب باشد. آرالپی مخفف «پیشوند طول بازگشتی» است و یک فرمت داده است که مجموعه دادههای دوتایی را رمزگذاری میکند.
- امضای معتبر تراکنش
- نانس معتبر تراکنش. یادتان باشد که نانس یک حساب در واقع شماره تراکنش ارسالی از طرف آن حساب است. نانس تراکنش برای آنکه معتبر باشد باید برابر با نانس حساب فرستنده باشد.
- محدوده سوخت تراکنش باید برابر با یا بزرگتر از سوخت درونی مورد استفاده تراکنش باشد. سوخت درونی شامل موارد زیر است:
- هزینه از قبل تعریف شده ۲۱۰۰۰ سوخت برای اجرای تراکنش
- حقالعمل سوخت برای دادههای ارسالی به همراه تراکنش (۴ سوخت برای هر بایت داده یا کد که برابر با صفر است، و ۶۸ سوخت برای بایت غیر صفر داده یا کد)
- اگر تراکنش از نوع خلق کننده قرارداد باشد، ۳۲۰۰۰ سوخت بیشتر
- موجودی حساب فرستنده باید از اتر کافی برخوردار باشد تا هزینههای سوخت که فرستنده باید «پیشاپیش» بپردازد را تأمین کند. محاسبه هزینه سوخت پیشپرداخت ساده است: اولاً اینکه، محدوده سوخت تراکنش ضرب در قیمت سوخت میشود تا حداکثر هزینه سوخت مشخص شود. سپس، این حداکثر هزینه به مجموع ارزشی که از فرستنده برای گیرنده ارسال میشود افزوده میگردد.
اگر تراکنش همه ملزومات فوق را در راستای تائید اعتبار محقق سازد، در آن صورت وارد مرحله بعدی میشویم.
ابتدا، ما هزینه پیشپرداخت اجرا را از موجودی فرستنده کسر میکنیم و نانس حساب فرستنده را به میزان ۱ عدد برای تراکنش فعلی افزایش میدهیم. در این مقطع، ما میتوانیم سوخت باقیمانده را در قالب مجموع محدوده سوخت منهای سوخت درونی استفاده شده محاسبه کنیم.
سپس اجرای تراکنش آغاز میشود. در جریان اجرای تراکنش، اتریوم «حالت فرعی» (substate) را رصد میکند. این حالت فرعی شیوهای جهت ثبت اطلاعات در جریان تراکنش است. این اطلاعات بلافاصله پس از تکمیل تراکنش لازم میشوند. حالت فرعی مشخصاً موارد زیر را شامل میشود:
- مجموعه نابودی خودکار: مجموعهای از حسابها که پس از تکمیل تراکنش کنار گذاشته میشوند.
- مجموعههای لاگ: چک پوینتهای بایگانی شده و قابل ایندکس اجرای کد ماشین مجازی
- موجودی مرجوعی: مبلغی که باید پس از تراکنش به حساب فرستنده مرجوع شود. قبلاً گفتیم که ذخیرهسازی بر روی اتریوم هزینه دارد و اینکه در ازای پاکسازی فضای ذخیرهسازی، حقالعمل فرستنده بازگردانده میشود. اتریوم حساب و کتاب این مبالغ مرجوعی را با استفاده از یک شمارشگر نگاه میدارد. این شمارشگر از عدد صفر شروع میشود و هر بار که چیزی از فضای ذخیرهسازی پاک میشود بر میزان آن افزوده میشود.
پس از آنکه همه گامهای مورد نیاز تراکنش برداشته شدند، مشروط بر آنکه هیچگونه حالت نامعتبری وجود ندارد، میزان سوخت غیرمصرفی که باید به فرستنده مرجوع شود مشخص میگردد و حالت نهایی میشود. علاوه بر سوخت مصرف نشده، همچنین مبلغی از «موجودی مرجوعی» که ذکر آن قبلاً آمد به فرستنده تخصیص مییابد.
پس از آنکه مبالغ به فرستنده ارجاع داده شدند:
- اتر مربوط به سوخت به استخراجگر پرداخت میشود
- سوخت استفاده شده توسط تراکنش به شمارشگر سوخت بلوک افزوده میشود (این شمارشگر مجموع سوخت مورد استفاده همه تراکنشهای موجود در یک بلوک را ثبت میکند و هنگام تائید اعتبار بلوک مفید واقع میشود)
- همه حسابهای موجود در مجموعه نابودی خودکار حذف میشوند
نهایتاً اینکه، حالت جدید و مجموعه لاگهایی که توسط تراکنش ایجاد شدهاند برای ما باقی میماند.
اکنون که جزئیات اساسی اجرای تراکنش را بررسی کردیم، بگذارید به برخی تفاوتهای میان معاملات خلق کننده قرارداد و تماسهای پیامی بپردازیم.
پایان قسمت دوم
ادامه دارد…