主页 > imtoken官方首页 > 比特币脚本系统解释

比特币脚本系统解释

imtoken官方首页 2023-07-27 05:14:05

问:比特币系统中没有账户的概念,用户如何知道自己有多少钱,可以花掉比特币,即进行比特币交易?

问题理解:为了验证比特币系统在交易(也叫转账记录)中的交易权限,即验证某人是否有权使用发送给他的比特币,使用了脚本系统来验证权限。 常见的权限验证方式,比如使用公钥和签名,或者比如多人投票机制等。

脚本系统是一个简单的、基于栈的、从左到右处理的、非图灵完备的脚本系统,比以太坊、EOS等下一代区块链技术中使用的智能合约简单太多,所以功能比较有限。 它的本质是一个包含多条指令的列表。 只要这些指令在一条一条运行的过程中没有失败,直到指令列表中的指令正常执行,则表明交易有效,即用户可以使用发给他的比特币交易。 只要指令列表中的指令在执行过程中出现失败或异常,则表明交易无效,用户无权使用本次交易中发给他的比特币,因为他可能是一个非法用户。

脚本系统中常用的命令包括:

1、栈处理指令:OP_DUP(复制操作)、OP_DROP(删除栈顶元素)、OP_SWAP(交换栈顶的两个元素)

2、脚本流程控制指令:OP_RETURN(标记交易无效)\OP_VERIFY(如果栈顶元素为false,则标志交易无效。如果为true,则交易有效)

3、加密签名指令:OP_HASH256(用于哈希计算)、OP_CHECKSIGVERIFY(用于签名校验)等;

4、逻辑运算指令:OP_EQUAL(判断是否相等)、OP_EQUALVERIFY(判断是否相等,然后进行脚本流控判断。如果栈顶元素为false,则交易无效)

5、算术运算指令:OP_ADD(加法)\OP_SUB(减法)\OP_MAX(最大值)\OP_MIN(最小值)等。

问题说明:

下面用一个例子来说明比特币脚本系统的执行过程。

假设有如下一系列交易执行流程比特币系统中的交易运行原理,Alice 交易一些比特币给 Bob,Bob 交易一些比特币给 Carol,Carol 交易一些比特币给 Dave。 那么在交易b中,系统如何验证Bob有权将Alice转给他的比特币转给Carol呢?

火币比特币交易手续费_开源比特币交易系统_比特币系统中的交易运行原理

一笔交易的数据结构包括三部分,HASH、输入交易和输出交易。 如下所示:

火币比特币交易手续费_开源比特币交易系统_比特币系统中的交易运行原理

我们知道,在每一笔交易中,输入交易中包含了上一笔交易的txid和scriptSig。 这个scriptSig是为了验证用户是否有权使用之前交易中转给他的比特币。

例如

在 Bob->Carol 的交易 b 中,为了给 Carol 转账比特币系统中的交易运行原理,Bob 必须在交易 b 的输入交易中提供足够的信息来证明 Bob 可以在交易 a 中使用 Alice 转给 Bod 的比特币,而输入交易交易b的信息与交易a的输出交易信息配对。 两者执行成功可以证明Bob是合法的拥有者,可以使用交易a转给他的比特币。

Bob为了给Carol转账,在交易b中提供输入交易的输入脚本scriptSig信息如下:

3046022100ba1427639c9f67f2ca1088d0140318a98cb1e84f604dc90ae00ed7a5f9c61cab02210094233d018f2f014a5864c9e0795f13735780cafd51b94134acf50

03a63ab88e75116b313c6de384496328df2656156b8ac48c75505cd20a4890f5ab

这么长的列表其实就是签名和公钥。

对应的是交易a中输出交易的输出脚本scriptPubKey信息,其内容如下:

OP_DUP OP_HASH160be10f0a78f5ac63e8746f7f2e62a5663eed05788 OP_EQUALVERIFY OP_CHECKSIG

这么长的列表实际上是一个指令的脚本列表,比特币系统会在脚本系统栈中一条一条地执行这些指令来验证权限。

让我们看看如何执行这组脚本来验证权限。

第一步是执行事务b的输入脚本。 由于有两个元素,签名和公钥,所以将这两个元素添加到堆栈中;

火币比特币交易手续费_开源比特币交易系统_比特币系统中的交易运行原理

第二步,根据输入脚本引用的txid,找到事务a的输出脚本,得到输出脚本的命令列表,一一执行;

火币比特币交易手续费_开源比特币交易系统_比特币系统中的交易运行原理

第三步,第一条指令是OP_DUP,表示复制操作,即复制当前栈顶元素,所以进行复制

火币比特币交易手续费_开源比特币交易系统_比特币系统中的交易运行原理

第四步,第二条指令是OP_HASH160,意思是计算哈希值,即计算当前栈顶元素的哈希值,然后将计算出的哈希值入栈

火币比特币交易手续费_开源比特币交易系统_比特币系统中的交易运行原理

第五步,第三条指令是一组数字,所以把这个元素加入栈中;

火币比特币交易手续费_开源比特币交易系统_比特币系统中的交易运行原理

第六步和第四条指令是OP_EQUALVERIFY,意思是检查是否相等,即从栈中取出栈顶的两个元素,判断是否相等。 如果它们相等,它们将正常进行。

火币比特币交易手续费_开源比特币交易系统_比特币系统中的交易运行原理

第七步第五条指令是OP_CHECKSIG,意思是校验签名校验,即从栈中取出栈顶的两个元素,判断签名是否正确。 如果它们相等,它将正常进行。 如果它们不相等,执行将被中断。 返回失败。

火币比特币交易手续费_开源比特币交易系统_比特币系统中的交易运行原理

这样,在执行了交易b的输入脚本和交易a的输出脚本中包含的一系列指令列表后,就可以验证Bob是否有权使用交易a转给他的比特币,即将其转移给卡罗尔。