付款的两种方式:基于账户(account based)的模型和UTXO(Unspent Transaction Output)未使用交易的输出的模型。 比特币使用未使用交易的输出模型,而以太坊使用账户模型。
基于账户/余额的模型:基于账户付款是生活中最常见的场景。举个例子吧,如果让我们设计一个支付系统,假设张三付给李四100块钱,基本流程是这样的。
1、检查张三的账户余额,如果余额不足100,终止交易。
2、如果张三的账户余额大于等于100,则张三的账户余额减100,李四的账户余额加100,这个过程需要事务保证一致性。
其实生活中大多数的计算余额都是基于账户来做的,例如银行系统、电商交易系统。
UTXO(Unspent Transaction Output)未花费的输出的模型。用白话说就是你手里有的钱。
每笔交易都有输入和输出,别人付给你的钱是“交易输入”,你收到的钱是“交易输出”。有点绕,关键点是站的角度,这个输入和输出是站在交易的角度,不是你的角度。交易就是有进有出。这次的输出可以作为下次交易的输入,这次的输入是之前交易的输出。
那什么是未花费输出呢,就是这个输出还没参加下次交易。如果参加了那就是交易输出。
假设场景张三给你转100个比特币
基本流程:
追溯“输出值”是“张三”相关的全部未花费的输出,对全部未花费的输出进行简单求和,判断是否大于等于100,如果确实大于等于,则将这些有效的交易记录合并形成一条新的交易记录(如下图)。如果小于100,其实可以不需要再继续往下探讨。
这里面有个找零的问题,就是如果大于100,所有未花费的输出还有剩余,这时候应该找给张三,也就是途中的30个比特币。
最后再通过一个网上的例子串一下。
场景:张三挖到12.5 枚比特币。过了几天,他把其中 2.5 枚支付给李四。又过了几天,他和李四各出资 2.5 比特币凑成 5 比特币付给王五。
如果是基于账户的设计,张、李、王三人在数据库中各有一个账户,则他们三人的账户变化如下图所示:
但在比特币中,这个过程是通过 UTXO 实现的,图示如下: