协议演进 / BIP 索引 / BIP-11

BIP-11 M-of-N 标准交易

应用层|Deployed(已采用)|把“需要 N 个公钥中的至少 M 个签名才能花费”的交易,定为可被节点默认转发、矿工默认打包的标准交易类型。

一、档案卡

档案卡
编号BIP-11
标题M-of-N Standard Transactions
作者Gavin Andresen <[email protected]>
指定日期2011-10-18
讨论日期2011-10-02
层级Applications(应用)
类型Specification
状态Deployed(已采用)
阅读版https://bips.dev/11
官方原文https://github.com/bitcoin/bips/blob/master/bip-0011.mediawiki

二、放在哪一族

多签与标准交易族的早期关键文档。协议里早已有 OP_CHECKMULTISIG,但在 BIP-11 之前,这类交易属于“非标准”:多数节点不转发,矿工也未必打包,实际很难用。

BIP-11 把它推进为标准交易(在 n ≤ 3 的限制下)。后续演进包括:

BIP-13:P2SH 地址格式

BIP-16:Pay to Script Hash,把复杂脚本哈希进地址,多签更易用

再往后:SegWit、Taproot、描述符与现代多签钱包实践

理解 BIP-11,是理解“为什么比特币能做多人授权、托管、企业资金管控”的起点。

三、它要解决什么

3.1 受保护钱包(Wallet Protection Service)

采用 2-of-2:一把签名来自用户电脑上的钱包(可能已中毒),另一把来自钱包保护服务(WPS)。用户发起转账时,客户端把拟交易发给 WPS;WPS 再向用户确认“是否本人发起、金额与收款是否正确”,双方都签才生效。

文档特别提醒:用户应要求 WPS 提供所用私钥的备份,并离线安全保存,以免服务商倒闭后资金被锁死。客户端与 WPS 如何通信,不在本 BIP 范围内。

3.2 三方托管(买方、卖方、仲裁方)

采用 2-of-3:买方、卖方、可信仲裁人各提供一个公钥。买方把币打入 2-of-3 的 CHECKMULTISIG 输出,并把交易 ID 告知卖方与仲裁人。

三方如何交换公钥与签名,同样不在本 BIP 范围内。

3.3 其他

凡是“赎回资金需要不止一个签名”的场景——公司资金需多人签字、共享账户、简单治理安排等——都可以落在 M-of-N 模型上。

核心障碍不在操作码(OP_CHECKMULTISIG 已存在),而在网络策略:非标准交易难以进内存池、难以被挖出。BIP-11 要做的,就是把限定条件下的多签交易升为标准类型。

四、规则本身

4.1 标准锁定脚本(scriptPubKey)

节点应转发、矿工应纳入区块的标准形式为:

m <pubkey> ... <pubkey> n OP_CHECKMULTISIG

其中:

限制 n ≤ 3,是为了在当时客户端限制下仍可实用,并控制脚本体积与验证成本。

4.2 标准解锁脚本(scriptSig)

OP_0 <signatures> ...

前面的 OP_0 是占位:OP_CHECKMULTISIG 存在历史缺陷,验证时会多弹出一个栈元素,必须先压一个无用值,否则校验失败。多出来的这 1 字节,是刻意保留兼容、避免另造一套更重操作码序列的代价。

4.3 体积限制调整

当时的 Satoshi 客户端对 scriptSig 有约 200 字节的转发/挖矿上限,放不下实用的 3 签交易。BIP-11 配套将上限提高到 500 字节,以容纳 3 签名场景。

4.4 设计取舍(Rationale)

为何继续用 OP_CHECKMULTISIG,而不是多个 OP_CHECKSIG 拼出来?

它已启用,是支持多签场景最直接的方式。反对意见之一是:旧客户端与矿工把一次 CHECKMULTISIG 计为 20 个 sigops,而区块有 20,000 sigops 硬顶,理论上每块最多约 1,000 笔这类多签。用多个 CHECKSIG 可以计得更“省”。

回应是:此类交易预期会与 OP_EVAL 等机制结合并被更准确计数;且随着交易量上升,区块大小与 sigops 规则本身也需要再评估。另一条较弱的反对是栈弹出 bug——用 1 字节 OP_0 即可兼容,替代方案往往更费字节。

4.5 实现说明

旧客户端与矿工早已能验证 OP_CHECKMULTISIG,只是当非标准交易处理。BIP-11 改变的是“标准策略”(是否默认转发与挖矿),不是共识里“这种脚本是否合法”的底层定义。

五、谁必须动

普通持币人:不必改节点。若使用多签钱包或托管产品,由钱包软件生成符合标准的脚本即可。

钱包开发者:需能构造 m-of-n(n≤3)的标准 scriptPubKey,以及带 OP_0 占位的 scriptSig;并正确处理 2-of-2、2-of-3 等常见模板。

全节点与矿工(策略层):将此类交易视为标准:转发进内存池、允许打进区块。仍不支持的节点可能拒收,导致广播困难。

共识层:本 BIP 不修改共识规则。OP_CHECKMULTISIG 本来就合法;变的是“标准交易”政策。

因此:不升级的旧节点在共识上仍承认这些交易一旦上链;但在策略上可能不帮你传播未确认交易。

六、现在算不算数,以及一个常见误读

状态为 Deployed。它是比特币多签能在主网实用的早期基础。今天日常多签更多通过 P2SH、P2WSH、Taproot(含多签与脚本路径)等形态出现,地址与隐私、手续费、可塑性等性质更好,但“ M-of-N 共同授权”的语义一脉相承。

裸多签(bare multisig)在部分场景仍可见,但现代钱包更倾向把脚本藏进哈希(P2SH/SegWit)或 Taproot 树中。

常见误读:

“ BIP-11 发明了多签操作码。”

不对。OP_CHECKMULTISIG 原先就有。BIP-11 做的是:在 n≤3 的前提下,把这类交易定为标准,并放宽 scriptSig 大小限制,让网络默认转发和打包。没有这一步,多签很难在真实支付与托管里落地。

七、延伸

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