区块链_UTXO

UTXO概述

Unspent Transaction Output(未花费的交易输出),Transaction被简称为TX

实际的比特币并不存在,存在的只有UTXO。

比特币的交易由交易输入和交易输出组成,每一笔交易输出都需要花费一笔交易输入。输入与输出是等价的,收货人由地址表示,一个人可以有无穷多的地址。

因此每一笔交易都可溯源,不断向上查找父交易,直到找到这个比特币的创建交易,即挖矿奖励。

栗子:当A拥有10个比特币时,向B转3个比特币。实际上是,向B的地址创建一笔+3的交易,然后再创建一个给自己+7的交易。原来的UTXO因为花费就失效了。

与传统账户的比较

UTXO优点

  • 私密性比较强,理论上每一笔输出都可以单独设置一个地址
  • 无需维护余额等状态值
  • 每个UTXO是独立数据记录,可以通过并行体大的提升区块链的交易验证速度

账户模型优点

  • 可以快速获取账户的余额,而UTXO模型则需要计算多笔UTXO来计算。
  • 节省空间,每笔交易只有一个输入和输出

区块节点分析

以 Bitcoin 中的区块 #514095 为例,分析其数据结构,了解其实现。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
{
  "hash":"00000000000000000018b0a6ae560fa33c469b6528bc9e0fb0c669319a186c33",
  "confirmations":1009,
  "strippedsize":956228,
  "size":1112639,
  "weight":3981323,
  "height":514095,
  "version":536870912,
  "versionHex":"20000000",
  "merkleroot":"5f8f8e053fd4c0c3175c10ac5189c15e6ba218909319850936fe54934dcbfeac",
  "tx":[
   // ...
  ],
  "time":1521380124,
  "mediantime":1521377506,
  "nonce":3001236454,
  "bits":"17514a49",
  "difficulty":3462542391191.563,
  "chainwork":"0000000000000000000000000000000000000000014d2b41a340e60b72292430",
  "previousblockhash":"000000000000000000481ab128418847dc25db4dafec464baa5a33e66490990b",
  "nextblockhash":"0000000000000000000c74966205813839ad1c6d55d75f95c9c5f821db9c3510"
}

previousblockhash:是上一个父节点整个区块的的Hash,这个设计真的很巧妙

  1. 通过Hash值能快速定位区块,类似于hashMap的作用
  2. 防止修改,一旦修改了区块的内容,通过Hash区块内容与区块头的Hash值比较,就知道有没有修改。一旦修改了区块头的hash值,这个区块就在区块链中无法查找了。优秀的设计

Merkle Root:Merkle树的根节点,Merkle树是一种使用哈希指针连接的数据结构;虽然Merkle树有叶节点和非叶节点,但只有叶节点会存储数据,其他非叶节点都是用于验证数据完整性的哈希。

小结:prev_hash 和 merkleroot 分别通过『指针』的方式保证所有的 Block 和交易都是连接起来的,最终保证 Block 和交易不会被恶意节点或攻击者篡改,几乎全部的区块链项目都会使用类似方式连接不同的 Block 和交易,这可以说是区块链项目的基础设施和标配了。

相关引用

其实并没有什么比特币,只有 UTXO

比特币和以太坊技术原理对比之账户模型

UTXO 与账户余额模型