区块链

比特币交易脚本是什么

2018-05-21  本文已影响13人  92b0f2b9b6f8

比特币基于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的输入脚本为例说明其是如何执行的。

  1. 首先将输入脚本的签名和公钥压入栈。
  1. 执行输出脚本的第一个指令OP_DUP——复制栈顶元素并放在栈顶。
  1. 执行第二条指令OP_HASH160,对栈顶的Bob公钥进行哈希运算得到Bob的公钥哈希。
  1. 将输出脚本中的公钥哈希入栈,记为pubkeyhash’。
  1. 执行指令OP_EQUALVERIFY验证栈顶两元素是否相等,若相等则删除并继续执行。
  1. 执行最后一个指令OP_CHECKSIG对栈中最后两个元素进行签名的验签操作。

其中第3步pubkeyhash与pubkeyhash’相等说明Alice要转账付款的对象正是Bob提供的地址。第6步签名验签成功说明Bob拥有这个地址对应的私钥,即拥有这个地址和这个地址收到的btc。

若成功完成这六部,说明输入脚本可以验证输出脚本,Bob拥有Alice付给其的1btc,可以继续用这1btc与Carol进行交易。

作者:透明人(bbcstdy)
参考:http://www.8btc.com/understand-bitcoin-script

上一篇 下一篇

猜你喜欢

热点阅读