主页 > imtoken-冷钱包 > 比特币技术---交易签名验证原理
比特币技术---交易签名验证原理
博客:
掘金:
GitHub:
出版书籍:
本文的风格采用直截了当的方法。
前提信息 私钥可以推导出公钥; 公钥可用于推导出公钥的散列; 1和2都不可逆。发送交易时——签名数据的组成
在花费一个比特币的输入时,即在花费输入时,构造交易时,签名阶段需要在输入结构体中携带签名数据体,即signature_script。 其核心结构如下:
{
"outpoint":{
"tx_hash": "",
"index": 0
},
"signature_script": object,
...
}
关键就在signature_script,它由几个部分组成比特币基于什么技术,从下面的源码片段可以知道。
signature_script = 其他 + 签名 + pkData
上式右边的另一个代表比特币虚拟机的一些操作码,我们忽略它。 那么,签名私钥就是对交易进行签名的真实数据,pkData就是私钥privKey衍生出来的公钥哈希(pubkeyHash)。
发送交易时——接收方的输出组成
output 为输出,其中可以指定转账的收款人是谁,接收多少btc。 它的结构是:
{
"value": 1,
"pk_script": []byte
}
pk_script是一个字节数组,对应脚本字节数据。 比特币有许多不同的脚本结构:
P2PKH, P2SH, P2WSH, P2WPKH...
我们以 P2PKH 为例。 结合下面的源码截图,可以看出其字节数组结构为:
OP_DUP OP_HASH160 pubKeyHash OP_EQUALVERIFY OP_CHECKSIG
OP_DUP OP_HASH160 这些是什么? 这些是比特币虚拟机的操作码比特币基于什么技术,OP是英文operation的缩写,操作码的本质是一个十六进制数。 如果你想更深入地了解它们,你可以买我的第二本书,里面有详细的技术分析,包括虚拟机。
上面的P2PKH结构,当虚拟机运行它时,代码执行流程如下:
OP_DUP:执行复制栈顶数据的操作,然后将数据放入栈顶; OP_HASH160:对栈顶数据执行ripemd160哈希操作。 160之前会先执行一个sha256(data); OP_EQUALVERIFY:对栈顶的两个数据进行比较操作,相等则移除; OP_CHECKSIG:执行验证签名操作,这里会用到pubKeyHash。
记住这个pubKeyHash,后面验证签名的时候会用到它,就是公钥哈希。
检查签名
以上内容已经准备好签名验证所需的所有数据。 签名验证步骤如下:
节点收到交易后,从新交易的数据中获取input结构中的signature_script(scriptSign)、tx_hash、index参数; 使用tx_hash和1中的index找到这个input对应的output(UTXO模型),设置为A ;从A中获取pk_script脚本命令和里面的pubKeyHash; 根据字节范围从signature_script中获取pkData,即pubKey(公钥); 从pubKey中推出pubKeyHash_1,比较pubKeyHash_1 == pubKeyHash; 结束签名验证。 课后回答为什么p2PKH步骤中不直接存储pubKey而是pubKeyHash?
答:隐藏收款人的公钥。
为什么以太坊的签名验证方式与比特币如此不同?
答:账户模型的不同导致了这样的结果。
程序员灯塔
转载请注明原文链接:比特币技术---交易签名验证原理