FIP-06: استخراج ادغامی (Merge Mining)
نویسنده: Izimmerma <[email protected]>
وضعیت: نهایی (Final)
تاریخ ایجاد: ۲۰۲۵-۰۸-۱۵
چکیده
لوکیچین (Lokichain) از «اثبات کار کمکی» (Auxiliary Proof-of-Work یا AuxPoW) استفاده میکند تا استخراجکنندگان بتوانند از کارِ انجام شده روی یک زنجیره اثبات کارِ والد (parent chain) دوباره استفاده کنند. پوششِ AuxPoW شامل هدرِ والد، تعهد Coinbase و اثباتهای مرکل (merkle proofs) مورد نیاز برای نشان دادن این است که هدرِ بلوک لوکیچین در کارِ بلوکِ والد گنجانده شده است.
انگیزه
استخراج ادغامی به لوکیچین اجازه میدهد تا از نرخ هش (hashrate) یک شبکه بزرگتر بهرهمند شود، بدون اینکه از استخراجکنندگان بخواهد تلاش خود را تقسیم کنند. پیروی از کنوانسیونهای تثبیت شدهی AuxPoW، بارِ ادغام را برای استخرهای استخراج کاهش میدهد و در عین حال شفافیتِ اجماع را حفظ میکند.
اصطلاحات
- بلاکچین والد (Parent blockchain): شبکهای که هدرِ بلوک معتبر و اثباتِ کارِ آن توسط لوکیچین مورد استفاده مجدد قرار میگیرد (مثلاً هر زنجیره PoW از خانواده scrypt).
- بلاکچین کمکی (Auxiliary blockchain): لوکیچین، که دادههای AuxPoW را اعتبارسنجی کرده و کارِ والد را به عنوان کارِ خود میپذیرد.
- بلوک AuxPoW: یک بلوک لوکیچین که ممکن است به تنهایی هدف سختیِ فرزند را برآورده نکند، اما شامل اثباتی است که نشان میدهد کارِ بلوکِ والد این کار را انجام داده است.
- درخت مرکلِ کارِ کمکی (Aux work merkle tree): ساختار تعهدی ریشهدار در Coinbase والد که هم شاخه Coinbase (به ریشه مرکل والد) و هم شاخه زنجیره (به تعهد هدر لوکیچین) را تولید میکند و امکان اشتراکگذاری یک بلوک والد واحد را برای چندین زنجیره کمکی فراهم میکند.
مشخصات فنی
لوکیچین یک هدر را با تنظیم بیت ۸ فیلدِ نسخه (VersionAuxPow) و نوشتنِ شناسه زنجیره شش بیتی در بیتهای [16..21] به عنوان AuxPoW-enabled علامتگذاری میکند. هنگامی که این پرچم وجود دارد، گره بلافاصله پس از هدر پایه ۸۰ بایتی و قبل از بردار تراکنش، بار (payload) زیر را اضافه میکند:
| فیلد | نوع | هدف |
|---|---|---|
aux_version | ۱ بایت | نسخه بارِ AuxPoW. فلوکیکوین از 0x00 استفاده میکند. |
parent_coinbase_tx | تراکنش سریال شده | تراکنش کاملِ Coinbase والد حاوی تعهدِ استخراج ادغامی. |
coinbase_branch | شاخه مرکل (طول var_int ، هشهای ۳۲ بایتی، ماسکِ جانبی ۳۲ بیتی) | ثابت میکند که تراکنش Coinbase در ریشه مرکل والد گنجانده شده است. |
chain_branch | شاخه مرکل (اختیاری) | تعهد لوکیچین را در درخت مرکلِ کارِ کمکی ثابت میکند؛ زمانی که بلوک والد فقط به لوکیچین سرویس میدهد، خالی است. |
parent_header | هدر سریال شده ۸۰ بایتی | هدر زنجیره والد که اثباتِ کارِ آن در برابر الزامات لوکیچین اعتبارسنجی میشود. |
بلوک اثبات کارِ کمکی (Aux PoW Block)
فیلدها با ترتیب جدول بالا سریال میشوند. aux_version روی 0x00 ثابت است؛ coinbase_branch باید یک ماسک جانبی 0 داشته باشد زیرا Coinbase در ایندکس ۰ قرار دارد؛ زمانی که لوکیچین تنها زنجیره کمکی است، طول chain_branch میتواند صفر باشد. لوکیچین عنصر قدیمیِ block_hash را حذف میکند - گرهها آن را از هدر و دادههای مرکلِ ارائه شده دوباره محاسبه میکنند.
تعهد Coinbase والد
استخراجکنندگان نشانگرِ استخراج ادغامی 0xfa 0xbe 'm' 'm' را در scriptSig از تراکنش parent_coinbase_tx قرار میدهند که بلافاصله موارد زیر به دنبال آن میآید:
۱. chain_root — ریشه double-SHA256 که با تا کردنِ chain_branch روی هش بلوک فعلی لوکیچین به دست میآید و به صورت little-endian در اسکریپت کدگذاری میشود.
۲. tree_size — یک uint32 به صورت little-endian که باید برابر با 1 << chain_branch.Size() باشد.
۳. merkle_nonce — یک uint32 به صورت little-endian که با chain_id لوکیچین مخلوط شده تا جایگاه قطعی لوکیچین در درختِ کارِ کمکی انتخاب شود.
لوکیچین از 0x21 به عنوان chain_id برای AuxPoW استفاده میکند.
هنگامی که فقط لوکیچین شرکت میکند، طول chain_branch صفر است و chain_root فقط هش بلوکِ فعلی لوکیچین است. با وجود چندین زنجیره کمکی، استخراجکنندگان شاخهای را ارائه میدهند که برگِ لوکیچین را در درختِ کارِ کمکی مشترک ثابت میکند.
قوانین اعتبارسنجی
اجماع لوکیچین بلوکهای AuxPoW را به صورت زیر اعتبارسنجی میکند:
- به بیت هدر AuxPoW و کدگذاری صحیح
ChainIDبرای پارامترهای شبکه فعلی نیاز دارد. parent_headerرا هش کرده و اطمینان حاصل میکند که اثبات کارِ حاصل با هدف سختی لوکیچین برای ارتفاع بلوک مطابقت دارد یا از آن فراتر میرود.- ریشه مرکل والد را با استفاده از
parent_coinbase_txوcoinbase_branchدوباره محاسبه کرده و مطمئن میشود که با ریشه درparent_headerمطابقت دارد. - بررسی میکند که
coinbase_branch.SideMaskصفر باشد و اندازه تراکنش Coinbase در محدودیتهای اجماع باقی بماند. - هش بلوک فعلی لوکیچین را با
chain_branch(در صورت وجود) ترکیب کرده تاchain_rootرا به دست آورد و تأیید میکند که بایتهای little-endian دقیقاً بعد از نشانگرِ استخراج ادغامی در Coinbase والد ظاهر میشوند. - بررسی میکند که
tree_sizeبرابر با1 << chain_branch.Size()باشد وSideMaskاز شاخه زنجیره با ایندکسِ مورد انتظارgetExpectedIndex(merkle_nonce, chain_id, branch_size)مطابقت داشته باشد. - قوانین استاندارد اجماع لوکیچین را در هدر بلوک فعلی تأیید میکند (اتصال هش قبلی، بیتهای سختی، زمان میانگین و بررسیهای متنی).
- بارهای AuxPoW را که فیلد قدیمیِ
block_hashرا شامل میشوند یا با سریالسازی مورد انتظار مطابقت ندارند، رد میکند.
فعالسازی (mainnet): بلوک ۱۱۵,۸۴۰.
منطق فنی
استفاده مجدد از ساختار قدیمیِ استخراج ادغامی، معناشناسی (semantics) منطبق با BIP را حفظ میکند، در حالی که حذف فیلدِ تکراریِ block_hash بهینهسازی مختصری در پهنای باند و فضای ذخیرهسازی ارائه میدهد. این ساختار با نرمافزارهای فعلی استخر که قبلاً از شبکههای AuxPoW پشتیبانی میکنند، سازگار است.
پیادهسازی مرجع
در go-flokicoin پیادهسازی شده است (سیمپیچی + اجماع). برای پارامترهای فعالسازی و ساختارهای شبکه، نسخه 0.25.7-beta را ببینید.
پشتیبانی RPC
استخراج AuxPoW از طریق رابط استاندارد RPC قرار میگیرد:
createauxblock <payout_address>
یک شیء حاوی موارد زیر را برمیگرداند:
hash— شناسهای که استخراجکنندگان باید در Coinbase زنجیره والد هش کنند.chainid— شناسه زنجیره لوکیچین (دهدهی33، هگز0x21).previousblockhashوheightوbitsوtarget— زمینه زنجیره فرزند و هدف کار.coinbasevalue— پرداخت Coinbase زنجیره فرزند در واحدهای اتمی.
پاسخ نمونه:
{
"hash": "0c63598bf66646ee9bf80797a40d607d12db9a6bc97fd4b98da70c904dd250c8",
"chainid": 33,
"previousblockhash": "94f1f588f620713ef99dfb1b2f3079a0f4545d4e15035e8227c5534dea965f33",
"coinbasevalue": 100000000000,
"bits": "202f725e",
"height": 13,
"target": "2f725e0000000000000000000000000000000000000000000000000000000000"
}
استخراجکنندگان فراخوانی میکنند:
submitauxblock <hash> <auxpow_hex>
که در آن auxpow_hex بارِ سریال شدهی AuxPoW است که از قالب بلوک والد ساخته شده است.