经过第五章的学习,其实对区块链有一个更深的了解,就是,不仅区块前后相连,而且交易和交易之间也是相连,一个普通交易的输入部分总是前面某个交易的输出UTXO。在《比特币 (1):传统货币和比特币的区别》中看到的相连,就是普通交易之间的相互连接;在《比特币 (2):区块链的大致结构》中看到的相连,是区块之间的相互连接。
假设你已经阅读完第五章,对于为啥需要脚本也比较清楚了。首先明确一下,交易输入其实是之前某个交易的某个输出UTXO,是按照之前那个交易的Hash值加上对应输出在该交易中的位置标记的。一旦UTXO被选中,钱包会为每个UTXO生成包含签名的解锁脚本,换句话说,每个解锁脚本都对应的是一个之前某个输出的某个UTXO。
对于解锁脚本加上锁定脚本拼在一起,按照栈的方式运算,这个书中第五章已经说得很明确了,最重要的是栈操作的最后一步:
栈内是
其实CHECKSIG很简单,就是基于一定的规则,看看之前钱包生成的
正如前面所述,正在检查的这个解锁脚本,是放在该交易下面的该输入中,会对应一个之前某个交易的某个输出UTXO,那么假设,之前这个交易叫 TxPrev,而当前包含这个解锁脚本的交易叫TxNew(即TxNew的某个输入是该UTXO)。按照上图中说明的CHECKSIG的步骤(根据签名类型SIGHASH_ALL对整个交易进行验证):
1. 在栈中pop出
2. TxPrev中该UTXO对应的输出脚本,也即锁定脚本,会有很多的操作系列,每个操作系列之间使用OP_CODESEPARATOR分隔。取这个脚本最后一个操作系列,也就是倒数第一个OP_CODESEPARATOR和脚本结束之间的部分(上图与该逻辑不符合),取出来即为Subscript,注意该Subscript对应的是TxPrev下面的一个输出UTXO。
(3. 在Subscript中去掉签名)
4. 在Subscript中移除OP_CODESEPARATORS
5. 之前从栈中弹出的
6. 复制TxNew为TxCopy
7. 将交易TxCopy中的所有输入中的解锁脚本置为空(因为上面说过,CHECKSIG是和生成
8. TxCopy中正在检查的解锁脚本位置,替换为经过步骤4处理完的Subscript
9. 序列化TxCopy,添加4字节的签名类型,即在步骤5中提到的签名类型,因为在5中是1个字节,现在变成4个字节,这时候才会涉及大小端问题,存为小端模式。得到的最终信息假设叫verifyThisStr。
10. 之前
至此,交易脚本的验证过程结束。
这里面最重要的是:
1. 生成verifyThisStr的过程,确保了每次进行加密解密的内容都不一样
2. 个人钱包使用用户的私钥进行加密,其他人利用用户公开的公钥进行解密
-
区块链
+关注
关注
111文章
15562浏览量
106244 -
比特币
+关注
关注
57文章
7005浏览量
140760
原文标题:区块链系列--比特币 (5):交易脚本详解
文章出处:【微信号:AI_shequ,微信公众号:人工智能爱好者社区】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论