This commit is contained in:
yjjnls 2018-10-29 16:58:01 +08:00
parent 76c047390b
commit 533bfa1a80

View File

@ -9,16 +9,16 @@
区块链网络中有两种记账模式,除了 UTXO 模型还有 Account Based 结构,也就是普通账户模型,也叫账户余额模型,**前者在比特币系的数字货币中被广泛使用,后者更多是用在智能合约型的区块链上**。
## 普通账户模型
我们先从传统的账户模型出发来聊聊是如何记账的,假设我们现在有一个支付系统,在这个支付系统中有村长和张三两个账户,村长账户里有 100 万,现在要转账给张三 10 万,这其中涉及的操作是这样的:
1. 检查村长的账户余额是否大于 10 万;
2. 把村长的账户扣除 10 万变成 90 万,然后发送一笔转账消息给张三的账户;
3. 张三的账户接受到转账消息,将张三的账户余额加 10 万。
我们先从传统的账户模型出发来聊聊是如何记账的,假设我们现在有一个支付系统,在这个支付系统中有Alice和Bob两个账户Alice账户里有 100 万现在要转账给Bob 10 万,这其中涉及的操作是这样的:
1. 检查Alice的账户余额是否大于 10 万;
2. 把Alice的账户扣除 10 万变成 90 万然后发送一笔转账消息给Bob的账户;
3. Bob的账户接受到转账消息将Bob的账户余额加 10 万。
我们可以发现,无论是村长还是张三,都具有一个余额作为状态,即当前余额是记录在某个地方的,只需要读出来即可,这种设计我们叫做账户余额模型。
我们可以发现,无论是Alice还是Bob,都具有一个余额作为状态,即当前余额是记录在某个地方的,只需要读出来即可,这种设计我们叫做账户余额模型。
**如果以上三个步骤是在一个中心化系统中,甚至在同一个数据库中,那将非常简单,会直接退化成一个事务**,我们见到的银行账户、信用卡系统、证券交易系统、各种电商类应用,理财类应用基本都是一个中心化系统中的,最多也就是跨表跨数据库。
如果以上的步骤中,村长和张三的账户分属两个不同的系统,例如从 A 银行到 B 银行,就需要经过人民银行支付系统,即可信任的中心化第三方来做中介。
如果以上的步骤中,Alice和Bob的账户分属两个不同的系统,例如从 A 银行到 B 银行,就需要经过人民银行支付系统,即可信任的中心化第三方来做中介。
你可能发现了,在跨行转账的这种情况下,是没有办法做事务的,所以 **1 和 3 是不同步的,如果 3 操作失败,还需要从 2 倒退到 1 的状态,这个情况叫做冲正交易**
@ -35,21 +35,21 @@ UTXO 全称是“Unspent Transaction Output”这指的是未花费的
下面我们按照按照普通账户中的例子来重新讲解一遍。
如果要记录交易本身,那么我们可以构造一笔交易,这笔交易中村长转账 10 万给张三的同时90 万转给自己。
如果要记录交易本身,那么我们可以构造一笔交易,这笔交易中Alice转账 10 万给Bob的同时90 万转给自己。
如下所示:
```
 村长 100 万 --> 张三 10 万  
        --> 村长 90 万
 Alice 100 万 --> Bob 10 万  
        --> Alice 90 万
```
这里其实有三条子记录,左边一条,右边两条,左边叫做输入,右边叫做输出。
输入和输出组成了交易,输入和输入需要满足一些约束条件:
1. 任意一个交易必须至少一个输入、一个输出;
2. 输入必须全部移动,不能只使用部分,所以才产生了第二个输出指向村长自己;
2. 输入必须全部移动,不能只使用部分,所以才产生了第二个输出指向Alice自己;
3. 输入金额 = 输出金额之和 + 交易手续费,这里必须是等式。
对于村长来说,首先构造交易的输入输出,满足上述条件,然后广播到全网,接收方自行判断交易是否属于自己。这里满足约束条件构成的交易模型,也就是村长记录的三条转账事件就是 UTXO 模型。
对于Alice来说,首先构造交易的输入输出,满足上述条件,然后广播到全网,接收方自行判断交易是否属于自己。这里满足约束条件构成的交易模型,也就是Alice记录的三条转账事件就是 UTXO 模型。
## 账户余额模型与 UTXO 的比较
我们可以归纳出 UTXO 与普通账户模型的一些区别。
@ -85,7 +85,7 @@ UTXO 似乎天然是为数字货币设计的,具有 **较高频次跨账户转
这是区块链上一笔真实交易的例子,它记录了一笔 450ETP 的转账记录。
左边是输入,右边是两笔输出,其中第二个输出是给自己的账户,这和我们村长转账给张三的例子是一样的。
左边是输入,右边是两笔输出,其中第二个输出是给自己的账户,这和我们Alice转账给Bob的例子是一样的。
下图是交易解码为 JSON 格式的样子,可以看到 Previous_output 是放到 Inputs 数组里的,意思就是前向输出作为本次的输入。
@ -140,13 +140,13 @@ UTXO 似乎天然是为数字货币设计的,具有 **较高频次跨账户转
![](https://github.com/yjjnls/blockchain-tutorial-cn/blob/master/img/16.3.png)
这一笔比特币交易包含 6 个输入,几十个输出,交易一共 3.5kb,交易的输入输出会影响交易大小,比特币的交易费是根据字节收费的,交易尺寸越大越贵,而交易尺寸主要和输入输出的个数有关,也就是说,算法上并不规定输入输出的个数,而只有区块尺寸限制。
这一笔比特币交易包含 6 个输入,几十个输出,交易一共 3.5kb,交易的输入输出会影响交易大小,比特币的交易费是根据[字节收费](https://zhuanlan.zhihu.com/p/38479785)的,交易尺寸越大越贵,而交易尺寸主要和输入输出的个数有关,也就是说,**算法上并不规定输入输出的个数,而只有区块尺寸限制**
在比特币中将小于 100kb 的交易称为标准交易,超过 100kb 的称为非标准交易。它的前向 input 以及生成一个 out 约占用 161~250 bytes 。所以在比特币中,大约的 inputs/ouputs 的最大数目限制为 100KB/161B ~= 600 个。
在比特币中将小于 100kb 的交易称为标准交易,超过 100kb 的称为非标准交易。它的前向 input 以及生成一个 out 约占用 161~250 bytes 。**所以在比特币中,大约的 inputs/ouputs 的最大数目限制为 100KB/161B ~= 600 个**
## UTXO 的特性及缺点
从计算的角度来说,**UTXO 具有非常好的并行支付能力,也就是我们上文中所如果没有尺寸限制,一笔交易可以包含任意笔输入输出,同时也没有次序要求**,在一笔交易中哪一个 UTXO 在前,哪个在后面不影响最终结果。
从计算的角度来说,**UTXO 具有非常好的并行支付能力,也就是说如果没有尺寸限制,一笔交易可以包含任意笔输入输出,同时也没有次序要求**,在一笔交易中哪一个 UTXO 在前,哪个在后面不影响最终结果。
从存储的角度来说UTXO 具有较好的可裁剪特性,可裁剪性指的是 UTXO 类型的交易,如果从最老的那一笔 UTXO 开始截断数据库,那么之前的数据可以删除掉了。