协议演进 / BIP/比特币改进提案 / BIP-325

BIP-325 Signet(签名测试网)

一种在工作量证明之外还要求区块签名的测试网络,让多方长期协作测试能以可预期的不可靠程度运行。本 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 承诺。见证承诺的可选数据里,要再放入一段对挑战的解,格式为:

不以 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 定位为测试网络类型:服务于交易所集成测试与下一代第二层协议等长期、多方测试场景,追求的是行为可预期。它的价值在测试本身,设计上也不以取代某条既有网络为目的。

七、延伸

本页内容整理自 bitcoin/bips 仓库与 bips.dev,事实已与仓库核对;解读仅供学习参考。