比特幣交易本質--UTXO(Unspent Transaction Output)


  UTXO 代表 Unspent Transaction Output。
  Transaction 被簡稱為 TX,所以上面這個短語縮寫為 UTXO。

  現在的銀行也好、信用卡也好、證券交易系統也好,互聯網第三方支付系統也好,其核心都是基於賬戶(account based)的設計,由關系數據庫支撐。

  數據庫要確保兩點,第一是你要確保業務規則得到遵守,張三的余額充足。第二是確保事務性,也就是原子性、一致性、隔離性、持久性(ACID)。這種基於賬戶的設計,簡單直觀,而且在 IT 系統設計里用了幾十年,應該說沒有什么問題。

  我們假設一個這樣的場景:張三挖到12.5 枚比特幣。過了幾天,他把其中 2.5 枚支付給李四。又過了幾天,他和李四各出資 2.5 比特幣湊成 5 比特幣付給王五。
  如果是基於賬戶的設計,張、李、王三人在數據庫中各有一個賬戶,則他們三人的賬戶變化如下圖所示:
140417wvvqmz48oa4qqwaz
  但在比特幣中,這個過程是通過 UTXO 實現的,圖示如下:
140447qe7vo3vt7g22slev
  比特幣的區塊鏈賬本里記錄的是一筆又一筆的交易。
  每筆交易都有若干交易輸入,也就是資金來源,也都有若干筆交易輸出,也就是資金去向。一般來說,每一筆交易都要花費(spend)一筆輸入,產生一筆輸出,而其所產生的輸出,就是“未花費過的交易輸出”,也就是 UTXO。
  比特幣交易遵守幾個規則:

  1. 除了 coinbase 交易之外,所有的資金來源都必須來自前面某一個或者幾個交易的 UTXO,就像接水管一樣,一個接一個,此出彼入,此入彼出,生生不息,錢就在交易之間流動起來了。
  2. 任何一筆交易的交易輸入總量必須等於交易輸出總量,等式兩邊必須配平。

  上圖第一個交易#1001號交易是coinbase交易。比特幣是礦工挖出來的。當一個礦機費盡九牛二虎之力找到一個合格的區塊之后,它就獲得一個特權,能夠創造一個coinbase交易,在其中放入一筆新錢,並且在交易輸出的收款人地址一欄,堂堂正正的寫上自己的地址。這個coinbase交易隨着張三挖出來的區塊被各個節點接受,經過六個確認以后永遠的烙印在歷史中。
  過了幾天,張三打算付2.5個比特幣給李四,張三就發起一#2001號交易,這個交易的資金來源項寫着“#1001(1)”,也就是#1001號交易——張三挖出礦的那個coinbase交易——的第一項UTXO。然后在本交易的交易輸出UTXO項中,把2.5個比特幣的收款人地址設為李四的地址。
  請注意,這一筆交易必須將前面產生那一項12.5個比特幣的輸出項全部消耗,而由於張三只打算付給李四2.5個比特幣,為了要消耗剩下的10比特幣,他只好把剩余的那10個比特幣支付給自己,這樣才能符合輸入與輸出配平的規則。
  再過幾天,張三和李四打算AA制合起來給王五付5枚比特幣。那么張三或李四發起#3001號交易,在交易輸入部分,有兩個資金來源,分別是#2001(1)和#2001(2),代表第#2001號交易的第(1)和第(2)項 UTXO。然后在這個交易的輸出部分里如法炮制,給王五5比特幣,把張三剩下的7.5比特幣發還給自己。以后王五若要再花他這5比特幣,就必須在他的交易里注明資金的來源是#3001(1)。
  所以,其實並沒有什么比特幣,只有UTXO。當我們說張三擁有10枚比特幣的時候,我實際上是說,當前區塊鏈賬本中,有若干筆交易的UTXO項收款人寫的是張三的地址,而這些UTX 項的數額總和是10。因為在比特幣系統里,一個人可以擁有的地址資源,可謂取之不盡用之不竭。要知道自己的一大堆地址里一共收了多少UTXO,人是算不過來的,需要由比特幣錢包代為跟蹤計算。

  如果采用基於賬戶的方案,需要一個數據庫。這個數據庫能夠讓你很方便的查到張三、李四各自的賬戶余額。
  而 UTXO 方案當然也需要一個數據庫,這個數據庫記錄着當前系統里每一筆“沒有花出去的交易輸出”,也是就比特幣。當節點接收到一筆交易的時候,它需要去 UTXO 數據庫里查,看看這筆交易所引用的 UTXO 是否存在,它的收款人(擁有者)是不是當前新交易的付款者。而交易結束之后,數據庫要做相應的更新。
  首先要明確,無論是賬戶數據庫還是 UTXO 數據庫,必須是分散的,每結點一個克隆,一定不能是中心化的。如果比特幣系統有一個中心數據庫,不管你有多少節點,每一筆交易都要跑去中心數據庫驗證一下、然后再執行“轉賬”的事務操作,那就完全談不上“去中心化”,比特幣就毫無價值了,不如老老實實用支付寶。
  長期來看,賬戶數據庫會無限膨脹,而UTXO 數據庫體積會小很多。
  比特幣是個匿名體系,它的賬戶就是“地址”。每一個比特幣用戶可以擁有幾乎無限多的地址,在比特幣系統來看,它完全不知道兩個地址背后對應的是不是同一個人。

  在版本控制方面的考慮,svn 是中心化的數據庫保持一份賬本,這和區塊鏈的設計自然是相違背的,git 是去中心化的數據庫,但會保存太多冗余數據,對於分布式性能肯定是要大打折扣。UTXO數據庫是拋棄了歷史包袱的git, 只存儲了最后一個版本。簡易實用。

  UTXO具有天然的匿名效果,一個賬戶所對應的未花費交易是難以發現的。
  在性能方面,由於UTXO是獨立的數據記錄,那么就存在極大的並行性可以提升區塊鏈交易驗證速度。

http://www.frankyang.cn/2017/09/30/utxo/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM