文章

BTC 系列构建多签原理

一、多签地址生成的本质

比特币多签地址(btc multisig address)其实是一个P2SH地址(以3开头),它不是直接由私钥生成,而是由下列流程确定的:

  1. 生成多方公钥(每个人各自生成一对公私钥)

  2. 制作多签赎回脚本(明确M-of-N规则与参与方公钥)

  3. 对赎回脚本做HASH160(先SHA256后RIPEMD160)

  4. 生成P2SH地址(Base58Check编码得到以“3”开头的地址)


二、具体步骤举例(以 2-3 多签为例)

场景

A、B、C三人(比如Alice、Bob、Carol)希望共同管理一笔资金,至少2人同意才能动用。


1. 每人生成各自的钱包(公私钥)

  • Alice:公钥A

  • Bob:公钥B

  • Carol:公钥C

假设各自的公钥为(16进制,假数字以演示):

  • Alice公钥:0279BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798

  • Bob公钥:03A34B95C76C41B1A616D75C7CB6BFF7B8E7F7A2A44A8A8B6E41E13C904D13BC7E

  • Carol公钥:02BF52F3AEAA6756BCB412B873CD7FC7E5D2C1B6E5C3FAEFC3BF3E282A8480B7E3


2. 构建多签赎回脚本

格式模板为:
<M> <PubKey1> <PubKey2> ... <PubKeyN> <N> OP_CHECKMULTISIG

本例:2-of-3
至少2个签名,3个参与者

写法为(这里按公钥实际排序):

2 0279BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798
  03A34B95C76C41B1A616D75C7CB6BFF7B8E7F7A2A44A8A8B6E41E13C904D13BC7E
  02BF52F3AEAA6756BCB412B873CD7FC7E5D2C1B6E5C3FAEFC3BF3E282A8480B7E3
3 OP_CHECKMULTISIG

通常不用写成Opcode文字,而是二进制形式,钱包软件/比特币库会自动封装。


3. 计算赎回脚本Hash160

  • 先对上面的赎回脚本做SHA256

  • 再做RIPEMD160,得出20字节哈希

这个结果就是P2SH地址的脚本哈希部分。


4. 生成P2SH多签地址

  • 拼接前缀0x05(P2SH),然后加上刚刚算出来的Hash160

  • 拼接校验和

  • 做Base58Check编码,得到以“3”开头的多签地址

举例生成后,出来的可能类似于:3QJmV3qfvL9SuYo34YihAf3sRCW3qSinyC


三、使用工具实际生成(模拟过程)

现实中多用比特币库(如bitcoin core、Electrum、bitcoinjs等)、硬件钱包或 CLI 工具。

比如用 bitcoin-cli:

# 用 bitcoin-core 命令行工具生成多签地址
addmultisigaddress 2 \
 '["0279BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798",
   "03A34B95C76C41B1A616D75C7CB6BFF7B8E7F7A2A44A8A8B6E41E13C904D13BC7E",
   "02BF52F3AEAA6756BCB412B873CD7FC7E5D2C1B6E5C3FAEFC3BF3E282A8480B7E3"]'

它输出:

{
"address": "3QJmV3qfvL9SuYo34YihAf3sRCW3qSinyC",
"redeemScript": "52210279BE66...2103A34B9...2102BF52F...53ae"
}
  • address:就是多签地址(所有人共同充值用)

  • redeemScript:赎回脚本内容,花的时候要暴露出来


四、总结易懂记忆法

“公钥收集-脚本拼装-哈希压缩-Base58编码 = 多签地址产生”


五、实用案例意义

  • 多签地址不是某个人算出来的,而是团队所有人提供公钥协作拼接、互相确认后产生的“共同控制权利的唯一收款入口”。

  • 任何人都可以向该地址打钱,花钱时需满足你们自己事先设置的签名数与规则。

许可协议:  CC BY 4.0