BTC 系列构建多签原理
一、多签地址生成的本质
比特币多签地址(btc multisig address)其实是一个P2SH地址(以3开头),它不是直接由私钥生成,而是由下列流程确定的:
生成多方公钥(每个人各自生成一对公私钥)
制作多签赎回脚本(明确M-of-N规则与参与方公钥)
对赎回脚本做HASH160(先SHA256后RIPEMD160)
生成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编码 = 多签地址产生”
五、实用案例意义
多签地址不是某个人算出来的,而是团队所有人提供公钥协作拼接、互相确认后产生的“共同控制权利的唯一收款入口”。
任何人都可以向该地址打钱,花钱时需满足你们自己事先设置的签名数与规则。