mirror of
https://github.com/yjjnls/awesome-blockchain.git
synced 2024-10-01 00:45:35 -04:00
update
This commit is contained in:
parent
76c047390b
commit
533bfa1a80
@ -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 开始截断数据库,那么之前的数据可以删除掉了。
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user