比特币 (5):交易脚本详解

By | 2018-04-07
12,208 views | 1,380 Comments

看本文之前,请先重新阅读《精通比特币》的第五章《交易》。

经过第五章的学习,其实对区块链有一个更深的了解,就是,不仅区块前后相连,而且交易和交易之间也是相连,一个普通交易的输入部分总是前面某个交易的输出UTXO。在《比特币 (1):传统货币和比特币的区别》中看到的相连,就是普通交易之间的相互连接;在《比特币 (2):区块链的大致结构》中看到的相连,是区块之间的相互连接。

假设你已经阅读完第五章,对于为啥需要脚本也比较清楚了。首先明确一下,交易输入其实是之前某个交易的某个输出UTXO,是按照之前那个交易的Hash值加上对应输出在该交易中的位置标记的。一旦UTXO被选中,钱包会为每个UTXO生成包含签名的解锁脚本,换句话说,每个解锁脚本都对应的是一个之前某个输出的某个UTXO。

对于解锁脚本加上锁定脚本拼在一起,按照栈的方式运算,这个书中第五章已经说得很明确了,最重要的是栈操作的最后一步:

栈内是
<PubK>
<sig>
操作符是
CHECKSIG

其实CHECKSIG很简单,就是基于一定的规则,看看之前钱包生成的<sig>正不正确。CHECKSIG的步骤肯定和生成<sig>的过程相同。我们来看看CHECKSIG的过程,其实也就知道了生成<sig>的过程。如下图:

(本图参考自 https://en.bitcoin.it/wiki/OP_CHECKSIG)

正如前面所述,正在检查的这个解锁脚本,是放在该交易下面的该输入中,会对应一个之前某个交易的某个输出UTXO,那么假设,之前这个交易叫 TxPrev,而当前包含这个解锁脚本的交易叫TxNew(即TxNew的某个输入是该UTXO)。按照上图中说明的CHECKSIG的步骤(根据签名类型SIGHASH_ALL对整个交易进行验证):

1. 在栈中pop出<PubK>和<sig>

2. TxPrev中该UTXO对应的输出脚本,也即锁定脚本,会有很多的操作系列,每个操作系列之间使用OP_CODESEPARATOR分隔。取这个脚本最后一个操作系列,也就是倒数第一个OP_CODESEPARATOR和脚本结束之间的部分(上图与该逻辑不符合),取出来即为Subscript,注意该Subscript对应的是TxPrev下面的一个输出UTXO。

(3. 在Subscript中去掉签名)

4. 在Subscript中移除OP_CODESEPARATORS

5. 之前从栈中弹出的<sig>,最后一个字节代表的是签名类型,1是指SIGHASH_ALL,对整个交易进行验证。一个字节没有所谓的大小端问题。

6. 复制TxNew为TxCopy

7. 将交易TxCopy中的所有输入中的解锁脚本置为空(因为上面说过,CHECKSIG是和生成<sig>的过程对应,生成<sig>的时候,该部分都没有,所以验证的时候该部分肯定得去掉)

8. TxCopy中正在检查的解锁脚本位置,替换为经过步骤4处理完的Subscript

9. 序列化TxCopy,添加4字节的签名类型,即在步骤5中提到的签名类型,因为在5中是1个字节,现在变成4个字节,这时候才会涉及大小端问题,存为小端模式。得到的最终信息假设叫verifyThisStr。

10. 之前<sig>是个人钱包使用私钥对SHA256(SHA256(verifyThisStr))进行ECDSA加密的结果,现在已经重新计算出来了verifyThisStr,其他人验证的时候,利用对应的公开的公钥,对<sig>进行ECDSA解密,看是否与SHA256(SHA256(verifyThisStr))相同即可!!(反过来也是一样的)

至此,交易脚本的验证过程结束。

这里面最重要的是:

1. 生成verifyThisStr的过程,确保了每次进行加密解密的内容都不一样

2. 个人钱包使用用户的私钥进行加密,其他人利用用户公开的公钥进行解密

关于公钥私钥的过程,下几篇会讲到。

1,380 thoughts on “比特币 (5):交易脚本详解

  1. Matgype

    Viagra Doctor Calgary Nebenwirkungen Von Viagra Mechanism Benzene To Amoxicillin Cialis Viagra Versand Service

    Reply
  2. mk togel adhi luwuk

    比特币 (5):交易脚本详解 – 小溪日志
    If you wish for to grow your experience simply keep visiting this site and be
    updated with the most recent gossip posted here.

    Reply
  3. line invest togel 2d

    比特币 (5):交易脚本详解 – 小溪日志
    Nice post. I learn something new and challenging on blogs I stumbleupon on a daily basis.
    It will always be exciting to read content from
    other authors and practice a little something from their sites.

    Reply
  4. pengeluaran nomor togel hongkong

    比特币 (5):交易脚本详解 – 小溪日志
    Heya this is kinda of off topic but I was wondering if blogs use
    WYSIWYG editors or if you have to manually code with HTML. I’m starting a blog
    soon but have no coding skills so I wanted to get guidance
    from someone with experience. Any help would be enormously appreciated!

    Reply
  5. vurtil opmer

    Magnificent items from you, man. I’ve bear in mind your stuff prior to and you are simply extremely great. I really like what you have received right here, certainly like what you’re stating and the way in which in which you are saying it. You are making it enjoyable and you still take care of to keep it wise. I can’t wait to read far more from you. This is actually a tremendous site.

    Reply
  6. oprolevorter

    Terrific post however I was wanting to know if you could write a litte more on this topic? I’d be very thankful if you could elaborate a little bit further. Cheers!

    Reply

发表评论

电子邮件地址不会被公开。