سلام به دوستان
در مورد نحوه ارسال یک تراکنش، تایید و در بلاکچین قرار گرفتن اون، خیلی ها سوال دارن که میتونن مستقیم برای مطالعه به لینک Mining | ethereum.org مراجعه کنن ولی چون بسیاری از دوستان ارتباط خوبی با لینک ندارن و یا ترجمه انگلیسی براشون دشواره این مطلب رو براشون تهیه کردم.
به این نکته توجه داشته باشید که مطلب زیر از لینک بالا اقتباس شده و درک بنده نویسنده هم چاشنیشه و ترجمه صرف نیست، هرجا مشکلی بود خوشحال میشم عنوان کنید .
نحوه استخراج تراکنش های اتریوم
در ادامه یک نمای کلی از نحوه استخراج (mine) تراکنش ها (transaction) در اثبات کار(proof-of-work) اتریوم ارائه می دهیم. شرح مشابهی از این فرآیند برای اثبات سهام (proof-of-stake) اتریوم را می توان در اینجا یافت.
- کاربر (user) یک درخواست تراکنش را با کلید خصوصی (private key) یک حساب (account) می نویسد و امضا (signs) می کند
درواقع شما وقتی یک تراکنش را از کیف پول خود ارسال میکنید، یک درخواست مینویسید که اطلاعات خواسته شما درون آن ذکر شده و با کلید خصوصی شما امضا شده است (چون فقط شما به اون حساب دسترسی دارین این امضا روی درخواست هایی که از اون حساب ارسال میکنید قرار میگیره. پس این امضا درواقع امضا یا بهتر بگم رمزنگاری از طریق اون حسابه، نگید منکه چیزی رو امضا نکردم)
- کاربر درخواست تراکنش را از یک گره (node) به کل شبکه اتریوم (Ethereum network) پخش (broadcasts) می کند.
اتریوم درواقع یک شبکه از نودها هست که در لحظه به هم متصل هستند و کارشون اینکه نشستن در جایی که هستن با یکسری سخت افزار پردازش داده و یک کپی مشترک از الگوریتم اتریوم و ماشین مجازی اتریوم(EVM) بر روی این سخت افزارها. منتظرن تا وقتی یک اکانت یا بهتر بگم آدرس، یک درخواست رو مینویسه و میخواد در شبکه انجام بشه، اونوقت اونرو از طریق یک نود(حالا هر نودی بستگی داره از چه کیف پول یا پلتفرمی استفاده میکنه یا اصلا میتونه نود خودش رو راه بندازه و اینکار رو انجام بده) به نودهای دیگه پخش میکنه. چون میدونیم در بلاکچین چیز شخصی نداریم (تنها چیزی که شخصیه کلید خصوصی شماست) پس تمام نودها باید از اون درخواست مطلع بشن تا اون درخواست اعتبار داشته باشه (بعدا بهش اشاره میکنیم که این به چه دلیلی هستش)
- پس از شنیدن درخواست تراکنش جدید، هر گره در شبکه اتریوم درخواست را به ممپول محلی (local mempool) خود اضافه می کند، لیستی از تمام درخواست های تراکنش که در مورد آنها شنیده اند و هنوز به بلاک چین در یک بلوک اضافه نشده اند.
در این مرحله همونطور که گفته شد همه نودها از الگوریتم مشخص اتریوم برای ارتباط با شبکه و دیگر نودها استفاده میکنن، پس همه نودها مثل هم هستند. یک فضایی دارند برای نگهداری تراکنش هایی که درخواست شده اند و در شبکه پخش شدن که به آن ممپول میگیم. این ممپول درون هر نودی وجود داره ولی تراکنش های درونش مانند همه نودهای دیگست و مشترکه.
تراکنش ها در این فضا منتظر میمونن تا زمانی که توسط یک نود انتخاب بشن و سپس بتونن در یک بلاک تایید شده بلاکچین ثبت بشن (یا به طریقی درخواست پس گرفته بشه)
- در برخی مواقع، یک گره ماینینگ چندین ده یا صد درخواست تراکنش را در یک بلوک بالقوه (potential block) جمع میکند، این به نحوی انجام میشود که بیشترین کارمز تراکنش را بتواند بدست بیاورد درحالی که گس کل باید زیر محدوده گس تعیین شده برای بلوک ها باشد. سپس میرسیم به استخراج از طریق گره:
در این مرحله نودها از ممپول تراکنش هایی که بیشترین سود رو براشون دارد رو جمع آوری میکنن و در بلاکی که میخوان استخراج کنن قرار میدن به این بلاک، بلاک بالقوه میگیم (به این دلیل به این بلاک بالقوه میگیم که هنوز به مرحله تایید و ثبت در شبکه نرسیده و شاید بعد از تشکیل بتونه در شبکه با طی فرایندش ثبت بشه). پس میبینیم که هر نود میتونه بلاک بالقوه خودش رو بسازه و این بلوک با نود دیگری از شبکه الزاما یکی نیست و یا الزاما تفاوتی نداره. نودها میتونن هر تعدا تراکنشی رو درون بلاک خود جا بدن تا زمانی که جمع گس این تراکنش ها زیر محدوده گس تعیین شده بلاک باشه (پس سعی میکنن تراکنش هایی با گس پایین و fee بالا رو انتخاب کنن تا اگر تونستن ماینش کنن سود بیشتری ببرن، و معمولا الگوریتم خودشون رو برای انتخاب تراکنش ها از ممپول و ساخت بلوک بالقوشون دارن)
- نود پس از ساخت بلوک بالقوه، اعتبار (validate) هر درخواست تراکنش را تأیید (verify) می کند (یعنی هیچ کس سعی نمی کند اتر را از حسابی که امضایش را ندارد منتقل کند، هیچ درخواستی بد فرم یا خارج از فرم نیست، و غیره)، و سپس کد درخواست را اجرا می کند و تغییرات در وضعیت (state) نسخه محلی آنها از (Ethereum virtual machine)EVM را اعمال میکند. ماینر کارمزد تراکنش را برای هر درخواست تراکنش به حساب خود اعطا می کند.
پس از تشکیل بلاک بالقوه هر نود. شروع به اعتبارسنجی تراکنش های درون بلاک بالقوش میکنه (تایید وجود تراکنش، تایید وجود حسابی که تراکنش را درخواست کرده، تایید ارسال تراکنش از طرف صاحب حساب و…). این اعتبارسنجی توسط اطلاعات پیشین که در زنجیره ثبت شده انجام میشه و نودها با استناد به اون اطلاعات این اعتبارسنجی رو انجام میدن.
پس از اون شروع میکنن به اجرای کد درون هر درخواست. این کد درون ماشین مجازی اتریوم یا EVM اجرا میشه و هر نود یک کپی از این ماشین را داره تا بتواند کدهای درون تراکنش ها را اجرا و براساس اون کد متغییر هایی که به متغییر های وضعیت (state) معروف هستند را تغییر بده. متغییرهای وضعیت، متغییرهایی هستند که کل حالت فعلی شبکه را تا آخرین بلاک تایید شده نشون میدن.
با اجرای هر تراکنش نود دستمزد تعیین شده اون تراکنش را به حساب خودش انتقال میده با درخواستی که خود ایجاد کرده و درون بلاک بالقوه خود قرارداده (تا اگر تونست بلاک را ماین کنه این دستمزدها هم به حساب اون انتقال داده بشه و متغییر وضعیت حساب ایشون هم تغییر کنه )
- هنگامی که تمام درخواستهای تراکنش در بلوک تأیید و در نسخه محلی EVM اجرا شد، فرآیند تولید «گواهی مشروعیت (certificate of legitimacy)» اثبات کار (pow) را برای بلوک احتمالی آغاز میکند.
در اینجا تازه ماینینگ شروع میشود و مسابقه حدس زدن نانس (Nonce) بین تمام نودهای شبکه آغاز میشه. ولی باید اینرو توجه داشت که این نانس عدد مشخصی نیست و برای هر کدوم از بلاک های بالقوه تشکیل شده توسط هر نود متفاوت میتونه باشه. (حتما متفاوته حتی اگر تمام تراکنش های درون بلاکشون یکی باشه. یک چیز درون بلاکشون با هم فرق داره. میتونی پیداش کنی که چیه؟ )
میدونیم که بلاک برای اضافه شدن به شبکه اتریوم باید اسمی داشته باشه که بهش هش بلاک (Block Hash) (یه نکته ریزی اینجا در بازی با کلمات به فارسی و اینگلسی هست ربطی به ماجرا نداره فقط هست) میگیم. این هش از ترکیب:
هش بلاک قبلی+هش تراکنش های داخل بلاک فعلی+نانس = هش بلاک فعلی
ساخته میشه.
این هش بر اساس یک الگوریتم که سختی شبکه رو تعیین میکنه باید در محدوده یک بازه مشخصی باشه. باید کوچکتر از سختی شبکه باشه تا تایید بشه. پس همه نودها در این مرحله تلاش خواهند کرد تا هش بلاک بالقوه خود را زیر سختی شبکه در بیاورند که این موضوع فقط با تغییر نانس امکان داره (چون تنها متغییر موجود در معادله هش بلاک هست).
- در نهایت، یک ماینر تولید یک گواهی را برای یک بلوک که شامل درخواست تراکنش خاص ما است، به پایان میرساند(بر فرض). سپس ماینر بلوک تکمیل شده را که شامل گواهینامه و کنترل وضعیت جدید (new state) EVM ادعا شده است را پخش می کند.
در مرحله بعد ما فرض میکنیم که نود تونست بلاک رو زودتر از دیگر بلوک ها ماین کنه (هش بلاک بالقوش رو زیر سختی شبکه زودتر از بقیه بدست بیاره) اونوقت به نودهای دیگه که درگیر محاسبه هستن پیام میده که دبرنا یا فریاد میزنه یافتم . در این وضع باید تمام تراکنش ها و اعتبار سنجی های انجام شده و تغییر وضعیت هایی که در متغییر وضعیت شبکه پس از اجرای کد های این تراکنش ها توسط EVM بوجود خواهد اومد رو به نودهای دیگه بفرسته و نودهای دیگه هم دست از ماین بلاک بالقوه خودشون میکشن و میرن سراغ ادعای ایشون.
- گره های دیگر در مورد بلوک جدید می شنوند. آنها گواهی را تأیید میکنند، همه تراکنشهای روی بلوک را خودشان اجرا میکنند (از جمله تراکنشی که در ابتدا توسط کاربر ما پخش میشود)، و تأیید میکنند که کنترل وضعیت جدید EVM بعد از اجرای همه تراکنشها، با کنترل وضعیت ادعا شده توسط بلوک ماینر مطابقت دارد. . تنها در این صورت است که این گره ها این بلوک را به دنباله بلاک چین خود اضافه می کنند و حالت EVM جدید را به عنوان حالت متعارف می پذیرند.
هر نود در شبکه به طور جداگانه تمام تراکنش های بلاک نود برنده را چک میکند (حتی اینکه اون تراکنش در ممپول خودش قبل از این وجود داشته یا نه) و تمام مراحل تشکیل بلاک تا قبل از ماین کردن آنرا به تنهایی انجام میده تا مطمين بشه که تمام اعتبار سنجی ها انجام شده و تغییر وضعیت ها درست است. بعد از اینکار نتایج رو با نتیجه نود برنده مقایسه میکنه اگر درست بود تایید میشود. این در تمام نودهای شبکه انجام میشه و بعد از تایید این بلاک رو به انتهای زنجیرشون اضافه میکنند و وضعیت زنجیرشون رو به وضعیت تغییر یافته در این بلاک تغییر میدن.
نکته: تمام اینها توسط الگوریتم اجماع اتریوم که روی نودها ران شده انجام میشه کسی این وسط دستی اینکارو نمیکنه یعنی وقتی نودی بلاک رو ماین میکنه این روند توسط الگوریتم اتریوم برای تمام نودها انجام میشه.
- هر گره تمام تراکنش های موجود در بلوک جدید را از ممپول محلی درخواست های تراکنش انجام نشده خود حذف می کند.
مشخصه که بعد از تایید بلاک و تراکنش های داخل اون باید تراکنش درخواستی درون ممپول نودها بروز بشه و تمام درخواست های تراکنش های ثبت شده توسط بلاک جدید از درون این ممپول پاک بشن.
اگر پاک نشن کسی میدونه چه اتفاقی میافته؟؟
- گرههای جدیدی که به شبکه میپیوندند، همه بلوکها را به ترتیب دانلود میکنند، از جمله بلوکهای حاوی تراکنش مورد علاقه ما. آنها یک کپی EVM محلی را راه اندازی می کنند (که به عنوان یک EVM حالت خالی شروع می شود)، و سپس فرآیند اجرای هر تراکنش در هر بلوک را در بالای کپی EVM محلی خود انجام می دهند، و کنترل وضعیت را در هر بلوک در طول مسیر تأیید می کنند.
گره های جدید برای اینکه به شبکه ملحق بشن باید از اول شروع کنن و تمام بلاک هارو از بلاک جنسیس کنترل کنن تا به بلاک فعلی برسن. خیلی کار دارن… البته این برای فول نودها اتفاق میافته نه تمام نودها
هر تراکنش یک بار استخراج می شود (در یک بلاک جدید گنجانده شده و برای اولین بار منتشر می شود) اما توسط هر شرکت کننده در روند پیشرفت حالت EVM باز اجرا و تأیید می شود. این یکی از اصل های اصلی بلاک چین را برجسته می کند: اعتماد نکنید، تأیید کنید. (پس اگر میخواین یه بلاکچین کار واقعی باشید، به این مطلب اعتماد نکنید برین و خودتون تاییدش کنید )
موفق باشید