2.1.2 借贷记账法和UXTO模式
在日常生活中,人们转账一般需要进行以下几个步骤。
第一步,得知道对方的账号、开户姓名和开户行。第二步,用手机银行(或到柜台)填写转账的表单(网上转账比柜台转账需要填写的信息少很多),其中包含转账金额、收款账户等信息。第三步,把填写好的表单提交给银行服务器(或营业员),等待处理完成后告知结果,打印凭证。
这样就完成了转账过程,其核心是基于账户的设计,主要依赖关系型数据库来保障数据的一致性,即原子性、一致性、隔离性、持久性。
银行后台的会计系统大多会采用“借贷记账法”,将账目分成借方和贷方,每发生一笔业务都要登记两个以上科目。
比特币使用UXTO模式代替了传统的借贷记账法。UXTO(Unspent Transaction Output)由中本聪设计。在本质上,UXTO就是流水账,只记录交易本身,不记录交易结果。从金融系统设计的角度来看,这种方式有点“交易、清算分离”的意思,区块链系统只处理交易,而清算、查看余额等由区块链节点自行处理。
UXTO模式和借贷记账法的区别到底在哪里呢?这里通过一个例子来说明。王五在山上挖矿,今天手气不错,挖到了价值10000元的稀有金属,为了感谢张三和李四将工具借给他,想分别给张三和李四转账100元和400元,以表示感谢。李四为了感谢张三告诉他王五想借工具这件事,给张三转账150元表示感谢。下面我们看看借贷记账法和UXTO模式是怎么处理的。
1)借贷记账法
首先需要有3个账户,账户状态1如表2-2所示。
表2-2 账户状态1
王五挖到一块价值10000元的稀有金属,此时的账户状态2如表2-3所示(只说明过程,不考虑其他)。
表2-3 账户状态2
然后,王五分别给张三和李四转账100元和400元,此时的账户状态3如表2-4所示。
表2-4 账户状态3
最后,李四给张三转账150元,此时的账户状态4如表2-5所示。
表2-5 账户状态4
借贷记账法只对账户余额做加减法运算,账户状态就是最终状态。每次操作前都需要对账户余额进行判断,查看是否具有成立条件。例如,李四转给张三150元,此时如果李四的账户余额不够150元,则转账失败。这种记账体系与拍照类似,是静态的,只保留当前情况。
2)UXTO模式
UTXO交易类型中的一类是CoinBase,即挖矿获得的奖励;另一类是我们日常所说的普通交易。其中,CoinBase交易必须是区块记录的第一笔交易。
第一步,王五挖到价值10000元的稀有金属,UXTO模式下的账户状态1如表2-6所示。
表2-6 UXTO模式下的账户状态1
第二步,王五分别给张三和李四转账100元和400元,UXTO模式下的账户状态2如表2-7所示。
表2-7 UXTO模式下的账户状态2
第三步,李四给张三转账150元,UXTO模式下的账户状态3如表2-8所示。
表2-8 UXTO模式下的账户状态3
综上所述,可以得到以下结论。
(1)比特币的普通交易必须有一个输入。例如,李四给张三转账150元,交易输入中的来源就是交易#10001#2,往前追溯就是王五转账给李四400元所对应的交易地址及序号。
(2)输入与输出必须相等。以李四给张三转账150元为例,根据输入可知这笔交易的输入是400元,而输出有两个,一个是转账给张三的150元,另一个就是李四自己剩余的250元。
(3)比特币系统中的“余额”是所有UTXO中的总和。例如,张三应该有250元,由交易#10001#1加上交易#10002#1得到,这两个地址都是未花费的交易输出。李四也有250元,是由交易#10002#2得到,因为交易#10001#2已被花费。对于王五来说,交易#10000#1是花费的,未花费的是交易#10001#3,所以王五的余额是9500元。
UXTO模式记录了所有的交易数据,只要交易完成,就可以根据交易记录推导出余额,也就实现了“交易即清算”,不需要完成借贷记账法中的对账工作,极大地降低了管理成本。
另外,在UXTO模式下,所有交易记录都保留在案。在上面的例子中,从交易#10000#2#2,也就是李四250元余额这条交易记录开始,一直倒推,直到最初的交易#10000的创世区块,就可以追溯到最初的王五挖矿获得10000元的交易。这就是区块链“可追溯”的基本原理。