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/