پرش به مطلب اصلی

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 را شامل می‌شوند یا با سریال‌سازی مورد انتظار مطابقت ندارند، رد می‌کند.
important

فعال‌سازی (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 است که از قالب بلوک والد ساخته شده است.