付款的兩種方式:基于賬戶(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 實現的,圖示如下: