最新消息:

理解比特币脚本

Bitcoin justnode 1116浏览

假设有这么一系列交易:

1. 上图的三个交易都是单输入单输出交易
2. 每个『输入交易』『输出交易』中,都包含对应的『脚本』
3. 交易a,Alice转账给Bob;交易b,Bob转账给Carol;交易c,Carol转账给Dave
4. 当前交易的『输入』都引用前一个交易的『输出』,如交易b的『输入』引用交易a的『输出』

按照之前的说法,交易a中的『输出脚本』就是Alice为Bob出的数学题。那么,Bob想要引用交易a『输出交易』的比特币,就要解开这道数学题。题解是在交易b的『输入脚本』里给出的!Bob解开了这道题,获得了奖金,然后在交易b中为Carol出一道数学题,等待Carol来解…

所以说,下图中相同颜色的『输出』和『输入』才是一对题和解:

scriptPubKey和scriptSig的格式如下:

scriptPubKey: OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG
scriptSig: <sig> <pubKey>

验证的时候,scriptSig先把签名和公钥压到栈里,之后OP_DUP复制一份公钥,那么现在栈里就是一个签名,两个公钥。接着用OP_HASH160计算栈顶公钥的hash,再压上一个交易的收款人的公钥hash值到栈,用OP_EQUALVERIFY比较两个hash值,相同就说明这个钱不是你无中生有来的。最后OP_CHECKSIG检查签名,说明这个钱的确是你花出去不是别人花出去的,因为只有有私钥的你才能签名。

下面的步骤形象的展示了验证的过程。每一步中只有一个栈,箭头表示栈状态的变化。

第一步、

第二步、

第三步、

第四步、

第五步、

第四和第五步是用来验证你的公钥是不是出现在别人的vout交易中。如果你的公钥出现在别人的vout中,说明你拥有这部分比特币。

第六步、

这一步是用来验证你的币是你自己花出去的,不是别人花出去的。因为你的公钥只能解密自己私钥加密的内容,而不能解密别人私钥加密的内容。

交易的签名和验证

签名: sign(交易的摘要,发送方私钥) =>  签名

验证:  verify(签名,发送方的公钥) 计算的结果是否等于交易的摘要

交易的发送方对交易进行签名的作用有两个:

1.证明自己认可这笔交易

2.矿工节点需要验证签名和公钥是否匹配,以保证这笔交易是自己花出去的,而不是别人。

 

参考:https://zhuanlan.zhihu.com/p/25461051