日常生活中我们经常碰到转账的情况,这时我们可能需要做这么几件事:
第一步我们得知道对方的账号、开户姓名和开户行名称;
第二步我们会用手机银行或到柜台上填写一个转账的表单(网上转账需要填写的信息少很多),里面包含了转账金额、收款账户等信息;
第三步我们把填写好的表单提交给银行服务器(柜台交给营业员),然后等待处理完成告知结果,打印凭证。
这样我们就完成了整个转账的过程,其核心是基于账户(account based)的设计,主要依赖关系型数据库(RDBMS)来保障数据一致性也就是原子性、一致性、隔离性、持久性(ACID)。
那比特币网络与我们传统的这种机制有什么不同呢?如何处理一份资产多次发费的问题呢?
我们还是通过一个示例来向大家说明吧。
比特币网络原理
比如一个叫小五的人在山上挖矿,今天手气不错挖到了一块值10000元的稀有金属,为了感谢小三和小四借他工具所以想分别转账给小三和小四100和400块表示感谢,小四为了感谢小三告诉小五想借他工具这件事(只是借了下工具得到400元),为表示感谢小四给小三转账150表示感谢,下面我们看看基于账户是怎么处理的,比特币是怎么处理的。
Account Based(基于账户)
首先有三个账户:
接着小五挖了块值10000的稀有金属,此时账户状态如下(只说明过程,不考虑其他):
再接着小五分别给小三和小四转账100和400,此时账户状态如下:
最后小四给小三转账150,此时账户状态如下:
最终三个人的账户状态如下:
这就是我们的记账货币体系的核心,只对账户做加减法运算,账户状态就是最终状态。每次对账户操作之前需要对账户的余额做一个判断,是否具有成立条件,就如上面小四转给小三150,此时如果小四的账户不够150那转账就会失败。
Unspent Transaction Output(UTXO)
上面我们用基于账户的设计解释了示例,接下来我们看看在比特币网络是怎么样处理的。
首先解释下Unspent Transaction Output,中文就是"未花费的交易输出",其中Transaction缩写为TX表示交易。
UTXO交易类型分为CoinBase即挖矿获得的奖励,还有一类就是我们日常所说的普通交易,其中CoinBase类型的交易必须是区块记录的第一笔交易。接下来我们用UTXO解释下上面的示例。
第一步,小五挖到值10000的稀有矿,我们用下面这个表格描述UTXO:
第二步,小五分别给小三和小四转账100和400,我们用下面这个表格描述UTXO:
第三步,小四给小三转150,我们用下面这个表格描述UTXO:
通过上面三个表格我们可以得出下面几点结论:
1、 比特币网络中普通交易必须有一个输入,且输入是之前交易输出中的一个UTXO,如小四给小三转150,交易输入中的来源就是#10001#2,对应这个往前查找就是小五转给小四的400所对应的交易地址及序号。
2、 输入与输出两边是必须是配平,还是小四给小三转150,根据输入我们知道此笔交易输入是400,而输出项有二条,一条是转给小三的150,另一条就是小四自已余下的250。
3、 比特币网络中账户余额就是所有UTXO中的总和,如小三应该有250,由#10001#1加上#10002#1所得,小四也有250,是由#10002#2所得,因为#10001#2已被花费。
经过上面的讲解相信大家对UTXO应该有所了解了吧,比特币网络中是怎么转账的呢?有疑问的朋友可以在评论区留言哦,大家一起交流探讨吧。