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_version | 1 字节 | AuxPoW 负载版本。Lokichain 使用 0x00。 |
parent_coinbase_tx | 序列化交易 | 包含联合挖矿承诺的完整父链 coinbase 交易。 |
coinbase_branch | 默克尔分支 (var_int 长度, 32 字节哈希, 32 位侧掩码) | 证明 coinbase 交易包含在父链默克尔根中。 |
chain_branch | 默克尔分支 (可选) | 证明辅助工作默克尔树中的 Lokichain 承诺;当父区块仅为 Lokichain 服务时为空。 |
parent_header | 80 字节序列化区块头 | 父链区块头,其工作量证明将根据 Lokichain 的要求进行验证。 |
Aux 工作量证明区块
字段按上表顺序序列化。aux_version 固定为 0x00;coinbase_branch 的侧掩码必须为 0,因为 coinbase 位于索引 0;当 Lokichain 是唯一的辅助链时,chain_branch 的长度可能为零。Lokichain 省略了过时的独立 block_hash 元素——节点根据提供的区块头和默克尔数据重新计算它。
父链 coinbase 承诺
矿工将联合挖矿标记 0xfa 0xbe 'm' 'm' 放置在 parent_coinbase_tx 的 scriptSig 中,紧随其后的是:
chain_root— 通过在当前 Lokichain 区块哈希上折叠chain_branch获得的双 SHA256 根,在脚本中以小端序编码。tree_size— 小端序uint32,必须等于1 << chain_branch.Size()。merkle_nonce— 与 AuxPoWchain_id混合的小端序uint32,用于在辅助工作树中选择 Lokichain 的确定性槽位。
Lokichain 使用 0x21 作为其 AuxPoW chain_id。
当仅有 Lokichain 参与时,chain_branch 长度为零,chain_root 仅为当前 Lokichain 区块哈希。当有多个辅助链时,矿工提供证明 Lokichain 在共享辅助工作树中叶子位置的分支。
验证规则
Lokichain 共识按如下方式验证 AuxPoW 区块:
- 要求 AuxPoW 区块头位和针对当前网络参数的正确
ChainID编码。 - 对
parent_header进行哈希处理,并确保产生的工作量证明达到或超过该区块高度的 Lokichain 难度目标。 - 使用
parent_coinbase_tx和coinbase_branch重新计算父链默克尔根,确保其与parent_header中的根匹配。 - 验证
coinbase_branch.SideMask为零,且 coinbase 交易大小保持在共识限制范围内。 - 将当前 Lokichain 区块哈希与
chain_branch(如果存在)结合以推导chain_root,并验证这些小端序字节恰好出现在父链 coinbase 的联合挖矿标记之后。 - 检查
tree_size是否等于1 << chain_branch.Size(),以及来自chain_branch的SideMask是否匹配确定性索引getExpectedIndex(merkle_nonce, chain_id, branch_size)。 - 确认当前区块头符合标准的 Lokichain 共识规则(前一哈希链接、难度位、中间时间及上下文检查)。
- 拒绝包含已弃用的
block_hash字段或与预期序列化不符的 AuxPoW 负载。
激活 (主网): 区块高度 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 负载。