协议演进 / BIP/比特币改进提案 / BIP-325
BIP-325
一种在工作量证明之外还要求区块签名的测试网络,让多方长期协作测试能以可预期的不可靠程度运行。本 BIP 目前处于已完成状态。
一、档案卡
| 编号 | BIP-325 |
|---|---|
| 标题 | Signet |
| 作者 | Karl-Johan Alm <[email protected]>, Anthony Towns <[email protected]> |
| 指定日期 | 2019-03-20 |
| 层级 | Applications(应用) |
| 类型 | Specification(规范类) |
| 状态 | Complete(已完成) |
| 阅读版 | https://bips.dev/325 |
| 官方原文 | https://github.com/bitcoin/bips/blob/master/bip-0325.mediawiki |
二、放在哪一族
测试网络族。比特币已有的测试环境各有短板:主网不能拿真钱试错;testnet 虽不要真钱,却以不可控的不可靠著称;regtest 出块成本为零,任何一方都能完全控制链,不适合多方长期场景。
BIP-325 提出的 signet 是这中间的一档:保留工作量证明,又叠加一道由指定挑战脚本控制的签名关卡,让出块权回到可协调的范围内。它与主网规则的关系是“另起一条测试链”,不改主网共识。
相关脉络包括:
BIP-141:隔离见证(共识层),signet 区块的签名承诺借用了 BIP-141 在 coinbase 中的见证承诺位置
理解 BIP-325,是理解交易所、第二层协议(如文中提到的 Eltoo、侧链锚定)为何需要一条“像主网、又能人为触发罕见事件”的长期测试链的起点。
三、它要解决什么
3.1 testnet 太不可靠
原文指出,testnet 上常见巨型重组(reorg)、长时间不出块、又突然连珠炮式出块。对单机短时试错尚可,但对“多家独立机构、各自跑软件、持续较长时间”的集成测试,现实中几乎不可行。
3.2 regtest 又太可控
regtest 里造块几乎零成本,任何参与方都能完全主宰测试链,因此撑不起需要多方互不完全信任、又要长期运行的场景。
3.3 目标:可预期的不可靠
signet 的目标不是完美可靠,而是“可靠地不可靠”(reliably unreliable):整体行为像主网,不出现成千上万个区块级别的重组;同时又比主网更容易触发那些预期内但罕见的事件,例如 6 个区块深度的重组,以便提前演练软件的应对。
四、规则本身
4.1 挑战(challenge)
signet 网络多了一个共识参数,称为挑战,即一个 scriptPubKey。它可以是简单的单公钥(P2PKH 式)、k-of-n 多签,也可以是任何其他脚本。出块者必须给出能满足该挑战的解,区块才算完整有效。
4.2 签名放在哪里
每个 signet 区块都必须在 coinbase 交易中带有 BIP-141 承诺。见证承诺的可选数据里,要再放入一段对挑战的解,格式为:
- 1–5 字节:推送长度前缀;
- 4 字节:Signet 头
0xecc7daa2; - x 字节:scriptSig;
- y 字节:scriptWitness。
不以 Signet 头开头的推送会被忽略;多个带 Signet 头的推送只认第一个。特例是:当空解本身就有效时(scriptSig 与 scriptWitness 皆空),这段额外承诺可以省略,以便用不感知 signet 的出块代码测试挑战平凡为真的自定义 signet 链。
4.3 怎么签、怎么验
规范用两笔虚拟交易来定义签名对象:一笔 to_spend 交易的输出脚本就是 signet 挑战,其输入的 scriptSig 里放由区块版本、前一区块哈希、signet 默克尔根与时间组成的 block_data;另一笔 to_sign 交易花费它,填入挑战的解。
其中 signet 默克尔根,是把区块交易的默克尔根在“将 coinbase 见证承诺中的 signet 解替换为空解”之后算出的。这样处理是因为签名不可能被包含在它自己所签的消息里。签名也不承诺区块的 nonce,因此滚动 nonce 寻找工作量证明时不必反复重签;扩展 nonce 则不能用,因为它会使签名失效,需要时应直接对同一或更新后的区块重新签名。
区块只有在 to_sign 是 to_spend 的有效花费时,才算完全验证通过。挑战为 OP_TRUE(0x51)等空解即成功的情形下,signet 承诺缺席也可视为有效。
4.4 最低难度与链的起点
signet 的最低难度约为 0.0011265,对应最大目标 00000377ae…、nBits 为 0x1e0377ae。这个取值是为了让最大目标乘以最大重定目标时间跨度(8 周,以秒计)不溢出 uint256,便于难度调整计算。
所有 signet 网络共用同一个创世区块(时间戳 1598918400,nonce 52613770),而消息起始字节(message start)则因链而异:取挑战脚本作单次推送后做 sha256d,取其前 4 字节。不同挑战因此自然分隔成不同的 signet 网络。
五、谁必须动
普通持币人:主网资产与钱包不受影响。signet 上的币是测试币,没有主网价值。
钱包与应用开发者:若要参与 signet 测试,只需给客户端加上对应 signet 的网络参数(魔术数等)即可连接现成的 signet 网络;区块头带有有效工作量证明,未做完整签名校验的客户端也能粗略判断区块“大概有效”。
全节点与出块者:完全验证节点必须校验 coinbase 中的区块签名,不带所需签名的区块会被立即拒绝。出块者要按挑战脚本收集签名,且注意签名不覆盖 nonce、不能用扩展 nonce 的约束。
共识层:主网共识不变。signet 是靠额外共识参数(挑战)定义的独立测试网络类型,签名校验只在这类网络内部生效。
六、现在算不算数,以及一个常见误读
状态为 Complete(已完成)。这表示这份规范本身已经完成定稿,成为定义 signet 这类测试网络的成文标准;它不是主网升级提案,不存在“在主网上激活”一说。
常见误读:
“signet 是又一条要取代主网或 testnet 的新链,链上币以后会值钱。”
不对。原文把 signet 定位为测试网络类型:服务于交易所集成测试与下一代第二层协议等长期、多方测试场景,追求的是行为可预期。它的价值在测试本身,设计上也不以取代某条既有网络为目的。
七、延伸
- 阅读版:https://bips.dev/325
- 官方原文:https://github.com/bitcoin/bips/blob/master/bip-0325.mediawiki
- 相关:BIP-141 隔离见证(共识层)
- 仓库总目录:https://github.com/bitcoin/bips
