比特币技术 --- 交易的验签原理
作者:林冠宏 / 指尖下的幽灵。转载者,请: 务必标明出处。
GitHub : https://github.com/af913337456/
出版的书籍:
本文风格采用单刀直入方式。
前提信息
- 私钥 可以推出 公钥;
- 公钥 可以推出 公钥哈希;
- 1 和 2 皆不能反推。
发交易时 -- 签名数据的组成
花费比特币的一个输入,即花费 input 的时候,在构建交易的时候,签名阶段
需要在 input 结构中,携带上签名数据体,即 signature_script
。其核心结构如下:
{
"outpoint":{
"tx_hash": "",
"index": 0
},
"signature_script": object,
...
}
关键在 signature_script
中,它的组成有几部分,结合下面源码片段可知。
signature_script = 其它 + signature + pkData
上面等式右边的其它
,代表是一些比特币虚拟机的操作码,我们忽略它。然后,signature
私钥是对交易签名的真实数据,pkData
是从私钥privKey
推出的公钥哈希(pubkeyHash)。
发交易时 -- 接受者的 output 组成
output 即输出,可以在里面指明转账的收款人是谁,收多少数值的 btc,其结构是:
{
"value": 1,
"pk_script": []byte
}
pk_script
是字节数组,它对应着脚本字节数据。比特币拥有很多不同的脚步(script)结构:
P2PKH, P2SH, P2WSH, P2WPKH ...
下面拿 P2PKH 做例子。结合下面源码截图可知其字节数组结构是:
OP_DUP
OP_HASH160
pubKeyHashOP_EQUALVERIFY
OP_CHECKSIG
OP_DUP
OP_HASH160
这些是什么?这些是比特币虚拟机的操作码,OP
是英文operation
的缩写,操作码的本质是16进制数字。想详细了解它们,可以购买本人的第二本书籍,内含详细技术分析,包含虚拟机。
上面的 P2PKH
结构,虚拟机在运行它的时候,代码执行流程如下:
OP_DUP
: 执行复制栈顶数据
操作,然后该数据放置栈顶;OP_HASH160
: 执行对栈顶数据进行 ripemd160 哈希运算
操作。160 前,会先进行一次 sha256(data);OP_EQUALVERIFY
: 执行对比栈顶的两个数据
操作,如果相等都被移除;OP_CHECKSIG
: 执行验证签名
操作,这里会用到pubKeyHash
。
记住这个 pubKeyHash
,它是后面验签要用到的,它是公钥哈希。
验签
上面内容把验签需要的数据都准备好了,验签名步骤如下:
- 节点接收到交易后,从新交易的数据中获取到 input 结构中的 signature_script(scriptSign), tx_hash, index 参数;
- 使用 1 中的 tx_hash,index 找到这笔 input 所对应的 output (UTXO模型),设为 A ;
- 从 A 中得到
pk_script
脚本指令,以及它里面的pubKeyHash
; - 从 signature_script 按照字节范围得到
pkData
,即pubKey
(公钥); - 从 pubKey 中推出
pubKeyHash_1
,比较pubKeyHash_1
==pubKeyHash
; - 结束验签。
课后解答
- 为什么 P2PKH 脚步中不直接存放 pubKey 而放 pubKeyHash?
答:为了隐藏收款人的公钥。
- 为什么以太坊的验签方式和比特币的差异这么大?
答:账户模型的不同,导致了这样的结果。
我的“区块链”技术书籍:《区块链以太坊DApp开发实战》
、支付宝收款码 https://www.cnblogs.com/linguanh/gallery/825997.html
微信:https://www.cnblogs.com/linguanh/gallery/image/321906.html
银行卡:6217007200076746554 , 林冠宏