若是你曾上過BlockExplorer觀察本身的比特幣收入情況,你是否曾經被搞的一頭霧水呢?這正是由於比特幣所使用的交易模型並不是咱們直覺上以帳戶爲基礎的,而是一種叫作UTXO的模型 。在個人前一篇文章:《深刻了解NEX:Neon Exchange》中,也提到了比特幣所使用UTXO模型與以太坊使用的帳戶模型在功能上的一些差別,但究竟這兩個模型到底差在哪兒?php
以太坊所使用的帳戶模型比較容易理解,就好像咱們每一個人都擁有一個銀行賬戶同樣。在以太坊的世界中,每一個地址就像是一個賬戶,每一次的扣款,交易事後,都會將賬戶的餘額紀錄在區塊鏈當中。所以在認證交易時只要檢查賬戶是否有足夠的餘額就能夠了。這個方法簡單,直觀,較利於智能合約的開發。若是你曾經上過Etherscan觀察你的交易紀錄,也會發現一切都簡單易懂輸入你的交易ID以後你會看到這種畫面:java
簡單的從A到B,這隻要看得懂英文應該就能夠理解了。安全
UTXO全名是Unspent Transaction Outputs
,未花費交易輸出,相比於帳戶模型來講沒那麼直觀。架構
在比特幣的世界裏,並無一個紀錄全部賬戶餘額的賬本。那麼要怎麼肯定一個地址如今有多少餘額呢?簡單的說,你要回顧之前全部的交易,而且找到全部寄給你的比特幣,再把他們全都加起來,纔會知道。less
比特幣中的一筆「交易」也較爲複雜。假設今天,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
的方法。設計
還有一個條件就是,output
跟input
總數要吻合。實際上在交易的時候,並不可能剛恰好老是找到兩筆加起來等於你要轉出金額的output
,就好像上圖中,若是愛麗絲Alice只想轉4.5個BTC給鮑勃Bob,那麼他就要多加一欄的output
,把多出來的0.5個BTC轉給本身,這樣的交易纔是平衡的。code
咱們能夠實際來看看比特幣的交易長什麼樣子,咱們如今若是想要觀察BlockExplorer上本身的交易紀錄,會發現它長的是這付德性:blog
一筆交易包含了大量的input
與output
,這頗有多是一筆交易所轉出金額的紀錄,因此含有不少的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由於沒有賬戶的存在,所以允許平行進行多筆交易。假如你有許多的UTXOs,你能夠同時進行多筆交易而不會被阻擋。再來就是匿名性,如上面提過得,你能夠輕易的隱藏本身的交易目的。除此以外,UTXO也被認爲比較安全且有效率,能夠透過Simple Payment Verification(SPV)來快速驗證檢驗交易。
但UTXO最大的缺點就在於他是Stateless
無狀態的,這對於在其上開發應用程序很是的不利。就像有名的Qtum雖然底子是UTXO的交易模式,可是仍然會設計Account Abstraction Layer
帳戶抽象層來讓應用程序的開發變得容易。
如今區塊鏈應用開發當道,UTXO傾向被你們視爲一種只能簡單處理交易的模型,我以爲必定程度上算是時代的產物吧!畢竟離比特幣的發明也已經十年了,儘管有一些特性是無可取代,可是你們還是偏好朝向Account Model或是混合式的架構前進。
但不論怎麼說,比特幣永遠都是區塊鏈世界的老大!並且如今你們免不了仍是要用到BTC交易,因此咱們仍是有必要了解UTXO運做方式的!
總之,但願這篇文章能夠對你們對比特幣有深一點的理解啦!
安利兩個個人教程:java比特幣開發, php比特幣開發,內容主要是區塊鏈存儲、去中心化共識機制、密鑰與腳本、交易與UTXO、集成比特幣支持功能如建立地址、管理錢包、構造裸交易等。但願對你們有幫助。