1. 程式人生 > >比特幣UTXO模型及以太坊賬戶模型介紹

比特幣UTXO模型及以太坊賬戶模型介紹

如果你曾上過BlockExplorer觀察自己的比特幣收入狀況,你是否曾經被搞的一頭霧水呢?這正是因為比特幣所使用的交易模型並非我們直覺上以賬戶為基礎的,而是一種叫做UTXO的模型 。在我的前一篇文章:《深入瞭解NEX:Neon Exchange》中,也提到了比特幣所使用UTXO模型與以太坊使用的賬戶模型在功能上的一些差異,但究竟這兩個模型到底差在哪兒?

ETH與賬戶模型

以太坊所使用的賬戶模型比較容易理解,就好像我們每個人都擁有一個銀行帳戶一樣。在以太坊的世界中,每個地址就像是一個帳戶,每一次的扣款,交易過後,都會將帳戶的餘額紀錄在區塊鏈當中。因此在認證交易時只要檢查帳戶是否有足夠的餘額就可以了。這個方法簡單,直觀,較利於智慧合約的開發。如果你曾經上過Etherscan觀察你的交易紀錄,也會發現一切都簡單易懂輸入你的交易ID之後你會看到這種畫面:

簡單的從A到B,這隻要看得懂英文應該就可以理解了。

比特幣與UTXO模型

UTXO全名是Unspent Transaction Outputs,未花費交易輸出,相比於賬戶模型來說沒那麼直觀。

在比特幣的世界裡,並沒有一個紀錄所有帳戶餘額的帳本。那麼要怎麼確定一個地址現在有多少餘額呢?簡單的說,你要回顧以前所有的交易,並且找到所有寄給你的比特幣,再把他們全都加起來,才會知道。

交易中的輸入與輸出

比特幣中的一筆「交易」也較為複雜。假設今天,Fred給了Alice 2個BTC,Ted給了Alice 3個BTC,我們把這兩筆寄給Alice,總和為5的BTC稱為Unspent Transaction Outputs

即未花費交易輸出:也就是說現在Alice擁有了兩筆Unspent Transcation Outputs,可以當作他未來轉錢給別人的input

如果現在Alice想要轉5 BTC給Bob,他要將前面兩筆總和剛好為5的UTXO當作這筆交易的輸入。而礦工要驗證的就是並沒有其他交易在先前的區塊當中,已經使用過這筆Unspent Output。如果同一筆輸出已經被髮送過,那它就不是Unspent了,這就是比特幣預防Double Spending的方法。

還有一個條件就是,outputinput總數要吻合。實際上在交易的時候,並不可能剛剛好總是找到兩筆加起來等於你要轉出金額的output,就好像上圖中,如果愛麗絲Alice只想轉4.5個BTC給鮑勃Bob,那麼他就要多加一欄的output

,把多出來的0.5個BTC轉給自己,這樣的交易才是平衡的。

我們可以實際來看看比特幣的交易長什麼樣子,我們現在如果想要觀察BlockExplorer上自己的交易紀錄,會發現它長的是這付德性:

一筆交易包含了大量的inputoutput,這很有可能是一筆交易所轉出金額的紀錄,所以含有很多的output。而左邊的input則可能是大量轉入金額交易所錢包的交易output

有趣的是,我們實際上在一筆交易之中無法「確定」真正的交易金額。例如下面這一筆紀錄中,右邊包含了三個output,我們無法確定究竟0.2,0.03以及56.38三個output究竟哪一個才是真正的目的地。搞不好Alice只有一筆Unspent Transaction Output未花費交易輸出56.61 BTC,因此他在這筆交易中雖然他只想要轉0.2BTC,卻必須要動用他唯一一筆UTXO,而剩下的56.38再轉回給自己。

當然,現在的比特幣錢包已經幫我們照顧這些事情了,所以在使用的時候就好像銀行帳戶一樣,我們只要輸出目的地址,錢包就會幫我們找出合適的未花費輸出(UTXO)當作輸入來完成交易 。但如果你很閒,或是要幹一些不想讓你知道的事,就可以自己來打包奇怪的輸入輸出來增加匿名性。

UTXO的優勢與劣勢

UTXO因為沒有帳戶的存在,因此容許平行進行多筆交易。假如你有許多的UTXOs,你可以同時進行多筆交易而不會被阻擋。再來就是匿名性,如上面提過得,你可以輕易的隱藏自己的交易目的。除此之外,UTXO也被認為比較安全且有效率,可以透過Simple Payment Verification(SPV)來快速驗證檢驗交易。

但UTXO最大的缺點就在於他是Stateless無狀態的,這對於在其上開發應用程式非常的不利。就像有名的Qtum雖然底子是UTXO的交易模式,但是仍然會設計Account Abstraction Layer賬戶抽象層來讓應用程式的開發變得容易。

小結

現在區塊鏈應用開發當道,UTXO傾向被大家視為一種只能簡單處理交易的模型,我覺得一定程度上算是時代的產物吧!畢竟離比特幣的發明也已經十年了,儘管有一些特性是無可取代,但是大家仍是偏好朝向Account Model或是混合式的架構前進。

但不論怎麼說,比特幣永遠都是區塊鏈世界的老大!而且現在大家免不了還是要用到BTC交易,所以我們還是有必要了解UTXO運作方式的!

總之,希望這篇文章可以對大家對比特幣有深一點的理解啦!如果喜歡我的文章,可以按照我@antonsteemit,我會努力產出一些區塊鏈相關的文章。

建議你瀏覽我們匯智網的各種程式語言的區塊鏈教程和區塊鏈技術部落格,深入瞭解區塊鏈,比特幣,加密貨幣,以太坊,和智慧合約。

  • java比特幣開發教程,本課程面向初學者,內容即涵蓋比特幣的核心概念,例如區塊鏈儲存、去中心化共識機制、金鑰與指令碼、交易與UTXO等,同時也詳細講解如何在Java程式碼中整合比特幣支援功能,例如建立地址、管理錢包、構造裸交易等,是Java工程師不可多得的比特幣開發學習課程。
  • php比特幣開發教程,本課程面向初學者,內容即涵蓋比特幣的核心概念,例如區塊鏈儲存、去中心化共識機制、金鑰與指令碼、交易與UTXO等,同時也詳細講解如何在Php程式碼中整合比特幣支援功能,例如建立地址、管理錢包、構造裸交易等,是Php工程師不可多得的比特幣開發學習課程。
  • php以太坊,主要是介紹使用php進行智慧合約開發互動,進行賬號建立、交易、轉賬、代幣開發以及過濾器和交易等內容。
  • java以太坊開發教程,主要是針對java和android程式設計師進行區塊鏈以太坊開發的web3j詳解。
  • 以太坊入門教程,主要介紹智慧合約與dapp應用開發,適合入門。
  • 以太坊開發進階教程,主要是介紹使用node.js、mongodb、區塊鏈、ipfs實現去中心化電商DApp實戰,適合進階。
  • python以太坊,主要是針對python工程師使用web3.py進行區塊鏈以太坊開發的詳解。
  • C#以太坊,主要講解如何使用C#開發基於.Net的以太坊應用,包括賬戶管理、狀態與交易、智慧合約開發與互動、過濾器和交易等。
  • EOS入門教程,本課程幫助你快速入門EOS區塊鏈去中心化應用的開發,內容涵蓋EOS工具鏈、賬戶與錢包、發行代幣、智慧合約開發與部署、使用程式碼與智慧合約互動等核心知識點,最後綜合運用各知識點完成一個便籤DApp的開發。

匯智網原創翻譯,轉載請標明出處。這裡是原文