主页 > imtoken苹果app > 比特币脚本和交易分析 - 智能合约原型

比特币脚本和交易分析 - 智能合约原型

imtoken苹果app 2023-01-17 04:51:40

大家都转账了,每笔交易都是这样的:张三的账户扣了200元,李斯的账户增加了200元。在比特币区块链中,交易并不是那么简单,交易实际上是通过脚本来完成,承载更多的功能,这也是比特币被称为“可编程货币”的原因。本文将分析事务如何可编程。

未使用的交易输出(UTXO)

先介绍一个概念:未花费的交易输出——UTXO(Unspent Transaction Output)

其实比特币所有的交易都是基于UTXO,即交易的输入是上一笔交易的未花费输出,而这笔交易的输出可以作为下一笔新交易的输入。

挖矿奖励属于一种特殊交易(称为coinbase交易),无需任何输入即可进入。 UTXO 是交易的基本单位,不能进一步划分。在比特币中没有余额的概念,只有UTXO分散在区块链中

当资金从一个地址转移到另一个地址时,就会形成一条所有权链,如下所示:

own_chain

比特币区块链技术原理

比特币脚本

比特币交易是首先提供一个用于解锁UTXO的脚本(使用私钥匹配锁定脚本)(通常称为解锁脚本:签名脚本),也称为交易输入,以及交易的输出指向一个脚本(称为锁脚本:PubKey脚本)比特币区块链技术原理,表示:谁的签名(签名是常用形式比特币区块链技术原理,不一定必须是签名)能匹配到这个输出地址,钱就给谁。

每个比特币节点都会通过同时执行解锁和锁定脚本来验证一笔交易(不是当前的锁定脚本,而是之前交易的锁定脚本)。如果脚本组合的结果为真,则为有效交易。

当解锁版本脚本与锁定版本脚本的设置条件匹配时,只有在执行组合的有效脚本时才会显示结果

例如最常见的比特币交易脚本类型(Pay-to-Public-Key-Hash: P2PKH (Pay-to-Public-Key-Hash))的组合是这样的:

script

常见的交易脚本验证流程

比特币区块链技术原理

比特币交易脚本语言是一种基于逆波兰表示法的栈式执行语言(不懂逆波兰和栈的同学,去大学数据结构教科书,也可以跳过这部分)。

比特币脚本语言包括基本算术计算、基本逻辑(如if...then)、错误报告和返回结果以及一些加密指令,不支持循环。有关更多语言详细信息,请参阅:比特币脚本

脚本语言通过从左到右处理每个项目来执行脚本。

下面两张图说明了比特币交易脚本验证执行过程的常见类型:

script_run1

上图为解锁脚本运行过程(主要是堆叠)

script_run2

比特币区块链技术原理

上图为加锁脚本的运行过程(主要是出栈),最终结果为真,说明交易有效。

交易分析

实际上比特币交易被设计成包含多个输入和输出。

交易结构

我们来看看完整的交易结构,

交易结构

交易的锁定时间定义了可以加入区块链的最早交易时间。在大多数事务中,它设置为 0 表示立即执行。如果锁定时间不为 0 且小于 5 亿,则视为区块高度,即在指定区块高度之前该交易不会被纳入区块链。如果锁定时间大于 5 亿,则视为 Unix epoch 时间戳(自 1970 年 1 月 1 日起的秒数),在此指定时间之前,该交易不会被纳入区块链。

比特币区块链技术原理

交易数据结构没有交易费用字段。交易费用由所有输入之和与所有输出之和之差表示,即:

交易费用 = 求总和(所有输入) - 总和(所有输出)

交易输入结构

我们刚才提到输入需要提供一个解锁脚本,现在我们来看一个交易的输入结构:

输入结构

我们结合整个交易结构来看输入结构是这样的:

输入结构1

比特币区块链技术原理

交易输出结构

我们刚才提到输出指的是一个解锁脚本,具体交易的输出结构是:

交易输出结构

我们结合整个交易的结构,输出结构是这样的:

交易输出结构1

交易哈希计算

比特币区块结构中的默克尔树和简单支付验证分析 说到区块结构,区块结构中包含了多笔交易的哈希值。那么交易哈希是如何计算的呢?

交易结构的字段被序列化成字节数组,字节数组拼接成支付字符串。两次计算支付字符串的SHA256得到交易哈希