作者:erhuok / 来源:nervosTalk
最近一直看NX-MAX共识协议,以前没有看过NC共识,很多基本的概念不是很了解,边看边做了些笔记,和大家分享:
Account模型
首先我们来看看Account模型是怎样的,举个例子A的银行账户里面有1000元,B有2000元,C有3000元,现做两个操作:
操作一,在A向B转账500
操作二,B向C转账1000元。
在正常操作逻辑下,账户模型的数据是这样的:
操作一
账户 | 转账金额 | 余额 |
---|---|---|
A | 1000 - 500 | 500 |
B | 2000 + 500 | 2500 |
C | 3000 | 3000 |
操作二
账户 | 转账金额 | 余额 |
---|---|---|
A | 500 | 500 |
B | 2500 - 1000 | 1500 |
C | 3000 + 1000 | 4000 |
现在的银行系统,证券系统以及我们常点的微信支付,支付宝,都是Account模型,底层数据库采用关系型数据库。支持事务处理,ACID特性(原子性,一致性,隔离性,持久性)。其实这个Account模型很容易理解,ETH也大致采用这个模型。
UTXO模型
UTXO的英文全称为Unspent Transaction Output, 未消费的交易输出。在UTXO模型,每一笔交易都有交易输入和交易输出两个部分。怎么理解,也同样举个例子:
假设A地址有10个比特币,B地址有5个比特币,C地址有0个比特币;现在进行如下操作:
操作一: A向B支付5个比特币;
操作二: A向C支付2个比特币;
操作三: B向C支付1个比特币;
操作四: C向A支付3.5个比特币;
起UTXO模型中的变化是这样的:
操作一:
地址 | 交易记录 | 净UTXO |
---|---|---|
A | 交易输入:5 | 5 |
B | 5 | |
C | 交易输出:5 | 5 |
操作二:
地址 | 交易记录 | 净UTXO |
---|---|---|
A | 交易输入:5。交易输入:2 | 3 |
B | 5 | |
C | 交易输出:5, 交易输出:2 | 7 |
操作三:
地址 | 交易记录 | 净UTXO |
---|---|---|
A | 交易输入:5。交易输入:2 | 3 |
B | 交易输入:1 | 4 |
C | 交易输出:5, 交易输出:2; 交易输出:1 | 8 |
操作四:
地址 | 交易记录 | 净UTXO |
---|---|---|
A | 交易输入:5;交易输入:2;交易输入:3.5 | 6.5 |
B | 交易输入:1 | 4 |
C | 交易输出:5, 交易输出:2; 交易输出:1;交易输入:5;交易输出:1.5 | 4.5 |
可以看见,在操作四的过程中:C地址有5,2,1三个交易输出,可以理解为有5,2,1三枚硬币,当要花出去3.5的时候,这三枚硬币不可以拆分,所以花出去5,找零1.5. 这个找零的操作是UTXO模型自己自动来处理的。所以,要统计某一个比特币地址有多少比特币,起本质是统计这个地址下所有净未花费的交易输出个数。