跳到主要内容

FIP-06: 联合挖矿

作者: Izimmerma <[email protected]>
状态: 已定稿 (Final)
创建日期: 2025-08-15

摘要

Lokichain 采用了辅助工作量证明 (Auxiliary Proof-of-Work, AuxPoW),使矿工能够重复使用在父 PoW 链上找到的工作量。AuxPoW 包封提供了父区块头、coinbase 承诺以及所需的默克尔证明,以证明 Lokichain 区块头已嵌入到父区块的工作量中。

动机

联合挖矿允许 Lokichain 继承更大网络的算力,而无需矿工分散精力。遵循成熟的 AuxPoW 惯例可以减轻矿池的集成负担,同时保持共识的清晰性。

术语

  • 父区块链 (Parent blockchain): 其有效的区块头和工作量证明被 Lokichain 重复使用的网络(例如,任何 scrypt 系列的 PoW 链)。
  • 辅助区块链 (Auxiliary blockchain): 即 Lokichain,它验证 AuxPoW 数据并接受父链的工作量作为自己的工作量。
  • AuxPoW 区块: 一个 Lokichain 区块,它本身可能不满足子链的难度目标,但包含了证明父区块工作量满足该目标的证明。
  • 辅助工作默克尔树 (Aux work merkle tree): 植根于父链 coinbase 的承诺结构,它产生了 coinbase 分支(进入父链默克尔根)和链分支(向下到 Lokichain 区块头承诺),使得多个辅助链可以共享同一个父区块。

规格

Lokichain 通过设置版本字段的第 8 位 (VersionAuxPow) 并将 6 位链标识符写入第 [16..21] 位,将区块头标记为已启用 AuxPoW。当此标志存在时,节点会在 80 字节的基础区块头之后、交易向量之前立即附加以下负载:

字段类型用途
aux_version1 字节AuxPoW 负载版本。Lokichain 使用 0x00
parent_coinbase_tx序列化交易包含联合挖矿承诺的完整父链 coinbase 交易。
coinbase_branch默克尔分支 (var_int 长度, 32 字节哈希, 32 位侧掩码)证明 coinbase 交易包含在父链默克尔根中。
chain_branch默克尔分支 (可选)证明辅助工作默克尔树中的 Lokichain 承诺;当父区块仅为 Lokichain 服务时为空。
parent_header80 字节序列化区块头父链区块头,其工作量证明将根据 Lokichain 的要求进行验证。

Aux 工作量证明区块

字段按上表顺序序列化。aux_version 固定为 0x00coinbase_branch 的侧掩码必须为 0,因为 coinbase 位于索引 0;当 Lokichain 是唯一的辅助链时,chain_branch 的长度可能为零。Lokichain 省略了过时的独立 block_hash 元素——节点根据提供的区块头和默克尔数据重新计算它。

父链 coinbase 承诺

矿工将联合挖矿标记 0xfa 0xbe 'm' 'm' 放置在 parent_coinbase_txscriptSig 中,紧随其后的是:

  1. chain_root — 通过在当前 Lokichain 区块哈希上折叠 chain_branch 获得的双 SHA256 根,在脚本中以小端序编码。
  2. tree_size — 小端序 uint32,必须等于 1 << chain_branch.Size()
  3. merkle_nonce — 与 AuxPoW chain_id 混合的小端序 uint32,用于在辅助工作树中选择 Lokichain 的确定性槽位。
提示

Lokichain 使用 0x21 作为其 AuxPoW chain_id

当仅有 Lokichain 参与时,chain_branch 长度为零,chain_root 仅为当前 Lokichain 区块哈希。当有多个辅助链时,矿工提供证明 Lokichain 在共享辅助工作树中叶子位置的分支。

验证规则

Lokichain 共识按如下方式验证 AuxPoW 区块:

  • 要求 AuxPoW 区块头位和针对当前网络参数的正确 ChainID 编码。
  • parent_header 进行哈希处理,并确保产生的工作量证明达到或超过该区块高度的 Lokichain 难度目标。
  • 使用 parent_coinbase_txcoinbase_branch 重新计算父链默克尔根,确保其与 parent_header 中的根匹配。
  • 验证 coinbase_branch.SideMask 为零,且 coinbase 交易大小保持在共识限制范围内。
  • 将当前 Lokichain 区块哈希与 chain_branch(如果存在)结合以推导 chain_root,并验证这些小端序字节恰好出现在父链 coinbase 的联合挖矿标记之后。
  • 检查 tree_size 是否等于 1 << chain_branch.Size(),以及来自 chain_branchSideMask 是否匹配确定性索引 getExpectedIndex(merkle_nonce, chain_id, branch_size)
  • 确认当前区块头符合标准的 Lokichain 共识规则(前一哈希链接、难度位、中间时间及上下文检查)。
  • 拒绝包含已弃用的 block_hash 字段或与预期序列化不符的 AuxPoW 负载。
important

激活 (主网): 区块高度 115,840。

原理

重复使用长期存在的联合挖矿结构可以保持符合 BIP 的语义,同时省略冗余的 block_hash 字段可以提供适度的带宽和存储优化。该结构与已经支持 AuxPoW 网络的现有矿池软件兼容。

参考实现

go-flokicoin 中实现(网络传输 + 共识)。参见发布版 0.25.7-beta 了解激活参数和传输结构体。

RPC 支持

AuxPoW 挖矿通过标准 RPC 接口公开:

createauxblock <payout_address>

返回一个包含以下内容的对象:

  • hash — 矿工必须在父链 coinbase 中进行哈希处理的标识符。
  • chainid — Lokichain 的链标识符(十进制 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 负载。