BTC 多签校验过程
一、比特币多签校验——核心思路
比特币链上多签主要依靠脚本系统(Bitcoin Script)实现。节点验证交易时,是逐步“跑脚本”,只有脚本最终返回为真,资金才允许花出。
多签(如2-of-3)校验流程概括如下:
锁定脚本设置多签方案(如:需要3个公钥中的2个签名)。
花费时提供相应数量签名与原始多签脚本(赎回脚本)。
节点执行解锁脚本和锁定脚本,逐个校验签名与公钥是否匹配且满足阈值。
二、链上校验流程详细解析
以P2SH(pay-to-script-hash)多签为例,说明校验步骤:
1. 多签锁定(比特币被锁定时)
设3个公钥、公钥分别是A/B/C,需要2签才行,脚本长这样:
2 <PubKeyA> <PubKeyB> <PubKeyC> 3 OP_CHECKMULTISIG
系统不直接把这些内容作为地址,而是对整个脚本哈希,生成P2SH地址,等资金花出时再公开。
2. 交易花费(花比特币时)
(1)解锁脚本内容
花出时,需提交:
足够数量的签名(如签名A和签名C)
原始多签赎回脚本(即刚才那段完整Script)
解锁脚本如下:
<空值> <签名A> <签名C> <赎回脚本>
注意:OP_CHECKMULTISIG历史原因需最前面加“空值”
(2)节点执行校验过程
节点在校验UTXO花费时会做什么?
拼接脚本,依次运行
先跑解锁脚本堆栈(把签名推到栈上)
再执行锁定脚本/赎回脚本
重新哈希赎回脚本,对比地址锁定哈希
检查你提交的赎回脚本是否确实是该P2SH地址所对应的脚本
执行赎回脚本内容
执行
2 <PubKeyA> <PubKeyB> <PubKeyC> 3 OP_CHECKMULTISIG
对照你提交的签名,验证至少2个签名是否可由这3个公钥中的任意2个解开当前这笔交易
签名逐一校验
系统会确保每个签名与提供的公钥一一对应、且签名必须有效
达到要求数量(2个有效签名),即脚本执行结果为真,花费成功
三、例子直观说明
假设:
三人持有的钱包P2SH
Alice/Bob/Carol三公钥
赎回脚本要求2-of-3
花费交易里:
输入1:
ScriptSig:
0
<Alice签名>
<Carol签名>
<2 <AlicePub> <BobPub> <CarolPub> 3 OP_CHECKMULTISIG>
ScriptPubKey:
OP_HASH160 <20字节hash> OP_EQUAL (P2SH)
节点校验过程:
用ScriptSig和ScriptPubKey联合,还原出P2SH里锁住的条件
还原出完整赎回脚本
校验提供的“2个签名”是否能解锁脚本中的3个公钥之一
若脚本顺利执行通过,则本UTXO花费合法
四、要点归纳
链上校验本质是复现你设置的多签条件。
节点对“你花币时提供的赎回脚本和签名”进行哈希验证和脚本执行,确认确实满足M-of-N规则。
所有规则、哪几个签名可以联手、用的是哪些公钥,最终都在链上公开且验算。
五、简单记忆
“多签链上校验,逐个签名过公钥,数量达标才放币。”