Contents

UTXO

一些关于UTXO的理解

web3的的L0中, 涉及到一个概念 Platform neutral language (有些地方也写做 Platform-neutral computation description language ) 平台中立的计算描述语言, 指一种在不同物理平台(架构、操作系统等)上执行相同程序的方法。注意, 它是一种描述, 一种方式, 而不是具体的编程语言. 示例包括 EVM(以太坊)、UTXO(比特币)和 Wasm(Polkadot)。

这里先看看 UTXO : An unspent transaction output 未花费的交易输出

什么UTXO

一个交易(TX)由一个或多个输入(Input)和一个或多个输出(Output)组成.

一个输出由两个状态: 未被使用 和 已被使用, 这个使用的意思是: 该输出作为另外一次交易的输入而被花掉(或花掉一部分)

你的账户上所有未被使用掉的输入(unspent transaction output ,UTXO)的总和就是我们平时所说的账户余额. 但在BTC的区块链账本中,我们并不像平时一样使用余额(balance)来进行记录, 而是使用若干个未被使用掉的输入,也就是UTXOs

假设我们现在的账户上还有两个UTXO, 一个0.2BTC, 另外一个0.4BTC, 要进行某次交易,

  • 情况举例1: 交易需要花掉0.1BTC, 这个时候发现0.2BTC这个UTXO就够花了, 所以交易会使用0.2BTC作为input, 当这个交易完成时,这个0.2BTC就不再试UTXO, 其会被分解成2个0.1BTC的UTXO (我们这里先忽略旷工费), 其中一个0.1BTC的UTXO发送到了对方账户, 另外一个0.1BTC返还给我们自己. 这个时候我们账户上还存在2个UXTO, 一个0.1BTC, 一个0.4BTC
  • 情况举例2: 交易需要花掉0.5BTC, 这个时候我们返回0.2和0.4这两个UTXO都不足以完成该次交易, 但0.2+0.4是足够的, 所以需要将他们同时作为该次交易的input,并生成2个UTXO, 一个0.5BTC到对方账户, 另外一个0.1BTC返还到自己账户.

TX构成

一个交易(TX)由如下这些字段组成

TX的字段 大小 (字节) 描述
version 4 它是指定网络交易类型的版本号。通过,节点可以确定用于验证该特定交易的规则集
input counter 1-9 input 数量, 指下面的input list 的长度
inputs list 不固定 输入列表
output counter 1-9 output 数量, 指下面的output list 的长度
outputs list 不固定 输出列表
lock time 4 它指定交易是否可以立即或在指定时间后包含在区块链中

其中Input由下面这些字段组成

Input的字段 大小 (字节) 描述
previous tx hash 32 上一次交易的hash (追溯这个input是从哪里来的)
previous out index 4 上一次交易是其在outputs中的index号
Script length 1-9 解锁脚本的大小
Unlocking script 可变 解锁脚本是用于证明允许交易花费给定 UTXO 的脚本。这是通过首先执行解锁脚本,然后为交易输入引用的 UTXO 执行锁定脚本来完成的
Sequence number 4 通常是禁用或包含锁定时间 - 禁用表示为0xFFFFFFFF

其中 Output由下面这些字段组成

Output的字段 大小 描述
Value 8 将要转移的Satoshis总数(正整数)
Script size 1 – 9 锁定脚本大小
Locking script 可变 锁定脚本

锁定和解锁脚本参考 这里 https://medium.com/@ackhor/ch-10-something-on-transaction-unlocking-locking-script-83228754c3f9

比特币交易通过用当前所有者的签名(或与公钥/脚本一起)解锁现有的UTXO(在输入端),并通过锁定新所有者的公钥/公钥哈希/脚本哈希生成新的UTXO(在输出端)。 “解锁 “和 “锁定 “实际上是由称为 “脚本 “的编程语言来完成的。脚本是一个基于堆栈的程序,由数据和操作代码(操作代码)组成。数据是用来 “推 “入堆栈和 “弹 “出堆栈的。请不要将这些数据与比特币交易数据混淆。脚本中的这些数据基本上是公钥、公钥哈希、脚本哈希和签名。另一方面,操作码从堆栈中’弹出’数据,对数据做一些处理,然后将结果’推’回堆栈中。如果结果是'1’,那么这个脚本就是有效的

看懂一次交易

以这个交易为例:

https://www.blockchain.com/btc/tx/d28ca5a59b2239864eac1c96d3fd1c23b747f0ded8f5af0161bae8a616b56a1d

可以看到这个交易由一个input加上2个output组成.

input: 0.00137322btc

output[0]: 0.00033324btc

output[1]: 0.00093376btc

矿工费: 0.00010622 btc

0.00033324 + 0.00093376 + 0.00010622 = 0.00137322

UTXOs集

BTC区块链中存在的全部UTXO表示为一个集合,并由每个比特币节点不断维护。

每笔交易都会消耗这个集合中的元素,并创建新的元素,然后添加到这个集合中。 因此,这个集合代表了一个特定加密货币系统中的所有代币。 每当区块链中接受一个新区块时,UTXO集就会更新。 网络中的每个比特币节点在其本地存储中都会有UTXO集的精确副本。 完整的UTXO集可以被加总,以计算出某一特定时间点的加密货币的总供应量。 在区块链交易有效的情况下,只有未花费的输出可以用于资助进一步的交易。 只有未使用的输出可用于进一步的交易,这一条件对于防止重复消费和欺诈是必要的。

扩展的UTXO (EUTXO)

参考这里

https://iohk.io/en/blog/posts/2021/03/11/cardanos-extended-utxo-accounting-model/