主页 > imtoken无法提币 > 比特币脚本与交易分析——智能合约原型

比特币脚本与交易分析——智能合约原型

imtoken无法提币 2023-06-04 05:25:09

相信随着区块链的普及,将对未来的交易模式和业务结构产生巨大的影响。

每个人都转账了,每笔交易都是这样的:张三的账户扣200元,李四的账户加200元。

在比特币区块链中,交易并不是那么简单。 交易实际上是通过脚本完成的,承载了更多的功能,这也是比特币被称为“可编程货币”的原因。

本文分析事务是如何可编程的。

未花费的交易输出 (UTXO)

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

事实上,比特币交易都是基于UTXObtc怎么交易,即交易的输入是上一笔交易未花费的输出,而本次交易的输出可以作为下一笔新交易的输入。

挖矿奖励属于一种可以没有输入的特殊交易(称为 coinbase 交易)。 UTXO 是交易的基本单位,不可分割。 比特币没有余额的概念,只有分散到区块链中的UTXO。

当钱从一个地址转移到另一个地址时,所有权链就形成了,就像这样:

btc怎么交易_btc国内交易渠道封死_btc交易一直未确认

btc国内交易渠道封死_btc怎么交易_btc交易一直未确认

比特币脚本

比特币交易是先提供一个用于解锁UTXO(使用私钥匹配锁定脚本)的脚本(通常称为解锁脚本:签名脚本),也称为交易输入。

交易的输出指向一个脚本(称为锁脚本:PubKey脚本),它表示:谁的签名(signature是一种常见的形式,不一定是签名)可以匹配输出地址,钱将支付给谁.

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

当解锁版脚本与锁定版脚本的设置条件匹配时,执行组合有效脚本时,结果显示为真。

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

btc怎么交易_btc交易一直未确认_btc国内交易渠道封死

通用交易脚本验证流程

btc国内交易渠道封死_btc交易一直未确认_btc怎么交易

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

比特币脚本语言包括基本算术计算、基本逻辑(如if...then)、报错、返回结果和部分加密指令,不支持循环。

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

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

btc交易一直未确认_btc怎么交易_btc国内交易渠道封死

上图是解锁脚本的运行过程(主要是入栈)

btc国内交易渠道封死_btc交易一直未确认_btc怎么交易

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

btc国内交易渠道封死_btc交易一直未确认_btc怎么交易

交易分析

事实上,比特币交易旨在合并多个输入和输出。

交易结构

让我们看一下完整的交易结构,

btc怎么交易_btc国内交易渠道封死_btc交易一直未确认

交易的锁定时间定义了可以添加到区块链的最早交易时间。 在大多数事务中,它被设置为 0 以指示立即执行。

如果锁定时间不为0且小于5亿,则视为区块高度,即在指定区块高度之前交易不会被写入区块链。

如果锁定时间大于 5 亿,则将其视为 Unix 纪元时间戳(自 1970 年 1 月 1 日以来的秒数),直到这个指定时间,交易才会被纳入区块链。

btc国内交易渠道封死_btc怎么交易_btc交易一直未确认

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

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

交易输入结构

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

btc怎么交易_btc交易一直未确认_btc国内交易渠道封死

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

btc交易一直未确认_btc国内交易渠道封死_btc怎么交易

交易输出结构

btc国内交易渠道封死_btc交易一直未确认_btc怎么交易

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

btc国内交易渠道封死_btc交易一直未确认_btc怎么交易

下面结合整个交易的结构来看一下输出结构:

btc交易一直未确认_btc怎么交易_btc国内交易渠道封死

交易哈希计算

在比特币区块结构默克尔树和简单支付验证的分析中提到,区块结构包含了多笔交易的哈希。

那么交易哈希是怎么计算出来的呢?

交易结构的每个字段被序列化为一个字节数组

将字节数组连接成支付字符串

对支付字符串计算两次 SHA256 以获得交易哈希