1. 程式人生 > >第9課 比特幣錢包和現實中的錢包有什麼本質差別? -- Transaction資料結構、UTXO、錢包 -- 詳解

第9課 比特幣錢包和現實中的錢包有什麼本質差別? -- Transaction資料結構、UTXO、錢包 -- 詳解

有興趣朋友也可以進一步關注公眾號“架構之道與術”, 獲取原文。
或掃描如下二維碼:
這裡寫圖片描述

經過前面1序列的鋪墊,我們熟悉了各種基本概念,這1課,將進入最核心的原理的講解:Transaction與UTXO。這2個東西,是整個區塊鏈的核心的核心,後續一切,都基於對這個的深刻理解。

Transaction之間的網狀關係:一切交易可追溯

考慮如下場景:使用者A和使用者B之間發生了一個交易T3,A向B轉100元。

那這100元,哪來的呢? 來自T1:C向A轉的80元 + T2:D向A轉的30元(共110元,但A只轉了100元給B,10元找零返回給A的賬號)。

同理,C向A轉的這80元,來自使用者E、F的某次交易。。

D向A轉的這30元,來自使用者E的某次交易。。

舉這個例子,是想說明1個問題:

交易與交易之間組成了網狀關係,1個交易的輸出,成為了下1個交易的輸入;下1個交易的輸出,又成了下下1個交易的輸入。

所有的錢,在這個網路中流動,每1筆錢的去向、來源,都是可追溯的,而這也是區塊鏈網路的一個重要特點。

多個付款人 + 多個收款人

在現實生活的交易中,通常1筆交易就是1個付款人,1個收款人。

但比特幣網路的交易比這個靈活的多,支援1筆交易,有多個付款人 + 多個收款人,這個特性非常有用。

舉個例子:

找零的場景:1個使用者的錢包裡面有100元(來自1個UTXO,什麼是UTXO,稍後解釋),現在他要買1瓶礦泉水,只需要1塊錢,但是1個UTXO有且只能花費1次,也就是說,他要把100元1次性花出去!!!這怎麼處理呢?

答案就是:

付款人:1個,該使用者,100元

收款人:2個,賣家:1元 自己:99元

也就是,把100元,分成2部分,打給了2個人,1個是賣家,1個是自己。

對應到交易裡面,就是這筆交易有1個輸入,2個輸出!

多個輸入 + 多個輸出

再次考慮最上面的場景:T3,A向B轉賬100元

這個交易就有2個輸入,2個輸出:

2個輸入(也就是2個UTXO):

T1: C向A轉的80元

T2:D向A轉的30元

2個輸出:

B:100元

A:10元(找零)

UTXO 與 UTXO Set

UTXO是一個非常非常核心的概念,搞明白了這個,也就搞明白了交易的內部結構、錢包等一系列東西。

UTXO,全稱是Unspent Transaction Out,未花費的交易輸出。

所有的錢都不是無源之水,別人給你的轉賬中(對應多筆交易的輸出),有的被你花費了,有的沒有被花費,沒有被花費的叫UTXO。

下面這張圖,在上面的示意圖的基礎上,更詳細的展示了交易之間的關聯關係:

有user1, user2, user3, user4, user5 5個使用者,

考慮T4:user1要給user2轉賬37元。user1的37元來自哪呢??

來自T1,T2,T3 3個交易:

T1有1個Output(也就是1個UTXO,屬於user1,5元),

T2有2個Output(也就是2個UTXO,1個屬於user1,15元;1個屬於user2,20元),

T3有3個Output (也就是3個UTXO,分別屬於user5, 20元;user2,20元; user1,20元)

在T4裡,要湊夠這37元,user1需要1次性花費來自T1, T2, T3的3個UTXO(5+15+20 = 40元),同時產出了2個UTXO,1個給user2的37元,1個是自己找零的3元。

這找零的3元,有被花到了下1個交易T6。。。

通過上面的場景分析,我們知道了:

(1)任何1筆Transaction,會花費多個UTXO(Input),同時也產生多個新的UTXO(Output),屬於多個不同的收款人。

(2)1個UTXO,具有如下的表達形式:

1個UTXO = 1個Transaction ID + Output Index

(3)舊的UTXO不斷消亡,新的UTXO不斷產生。所有的UTXO,組成了UTXO Set 的資料庫,存在於每個節點

(4)任何1筆UTXO,有且僅可能被1個交易花費1次

錢包

深刻理解了UTXO的概念,錢包就很容易理解了:

某個人的錢包的餘額 = 屬於他的UTXO的總和

在這裡,你會發現一個不同於現實世界的“銀行”裡的一個概念:

在銀行裡,會儲存每個賬號剩餘多少錢。但這裡,我們儲存的並不是每個賬號的餘額,而存的是1筆筆的交易,也就是1筆筆的UTXO,每個賬戶的餘額是通過UTXO計算出來的,而不是直接儲存餘額!!

總結

講完了Transaction,UXTO,最後我們把整個的層次結構,用如下的示意圖展示出來:

1個區塊鏈,有多個區塊;

1個區塊,多筆交易(兩三千筆);

每筆交易,多筆Input,多筆Output。

相關連結:

《第8課 賬號相關概念:公鑰/私鑰/Public Key Hash/P2PKH》

《第7課 幣和交易,誰生成誰?先有雞,還是先有蛋?》

《第6課 分叉與51%算力攻擊》

《第5課:“挖礦”專業名詞 – 算力/礦機/礦池》

《第4課 到底啥叫“挖礦”?》

《第3課 “區塊鏈”到底長什麼樣?》

《第2課 走進 “區塊鏈”與”比特幣”的世界》

《第1課 掌握區塊鏈技術需要的預備知識》