比特币基于UTXO模型,记住这一点在理解比特币各个环节都大有裨益。
UTXO是指未花费的交易输出(Unspent Transaction Output),也就是没有什么比特币只有UTXO。
这个名词是基于交易而来,对于一笔交易,至少有一笔或若干交易收入,即钱从哪里来,并有一笔或若干笔交易输出,即未花费的交易输出。
交易脚本又分为输入脚本和输出脚本,其中输入脚本存在于交易输入中,输出脚本存在于UTXO中。
为便于理解我们先看只有一笔输入一笔输出的比特币交易。

如图,三笔交易的关系如下:首先Alice转账给Bob一笔交易,假设为1btc,Bob又用收到的这笔钱付给Carol,然后Carol又付给了DAve。即:交易a,Alice转账给Bob;交易b,Bob转账给Carol;交易c,Carol转账给Dave。
在每笔交易中,输入交易表明钱从哪里来,输出交易表示钱要付给谁。后一笔交易的交易输入都要引用前一笔交易的交易输出。
在交易b中,Bob若想成功的付款给Carol,就需要引用交易a的交易输出,即用交易b的输入脚本去验证交易a的输出脚本。若验证成功,说明Bob拥有这1btc,可以付款给Carol。
若把输出交易比作题,则输入交易则是该题的解。如下图,相同颜色的输入输出交易才是一对题和解,准确的说是其脚本。

比特币脚本是一种堆栈结构,即先进后出的容器。
[输出脚本]内容为四个脚本指令和一个公钥哈希,对于交易a的输出脚本来说,该公钥哈希为Bob公钥的哈希。
[输入脚本]内容为签名和公钥,对于交易b的输入脚本来说,签名是用Bob的私钥对交易a进行签名,并附上Bob的公钥。
如下图:

接下来以交易a的输出脚本和交易b的输入脚本为例说明其是如何执行的。
- 首先将输入脚本的签名和公钥压入栈。

- 执行输出脚本的第一个指令OP_DUP——复制栈顶元素并放在栈顶。

- 执行第二条指令OP_HASH160,对栈顶的Bob公钥进行哈希运算得到Bob的公钥哈希。

- 将输出脚本中的公钥哈希入栈,记为pubkeyhash’。

- 执行指令OP_EQUALVERIFY验证栈顶两元素是否相等,若相等则删除并继续执行。

- 执行最后一个指令OP_CHECKSIG对栈中最后两个元素进行签名的验签操作。

其中第3步pubkeyhash与pubkeyhash’相等说明Alice要转账付款的对象正是Bob提供的地址。第6步签名验签成功说明Bob拥有这个地址对应的私钥,即拥有这个地址和这个地址收到的btc。
若成功完成这六部,说明输入脚本可以验证输出脚本,Bob拥有Alice付给其的1btc,可以继续用这1btc与Carol进行交易。
作者:透明人(bbcstdy)
参考:http://www.8btc.com/understand-bitcoin-script
网友评论