在沒有比特幣虐秦,區(qū)塊鏈之前是沒有UTXO這個詞語的凄敢。
要說清楚UTXO是什么唱凯?先給大家介紹兩個知識點报腔,一是什么是交易偎谁,二是什么是賬號模型
1、 什么是交易
交易比較好理解俺驶,英文是Transaction 被簡稱為 TX幸逆。以我們平時對交易的理解,李四給張三轉(zhuǎn)賬了一筆50塊錢暮现,那就是李四的賬上的錢少了50塊还绘,張三賬上的錢多了50塊;張三再想王五轉(zhuǎn)賬50元送矩,這樣的過程就叫做交易蚕甥,那么在計算機中怎么來記錄和保存這筆交易呢?
2栋荸、 什么是賬號模型
現(xiàn)在的銀行系統(tǒng)菇怀、證券交易系統(tǒng)、互聯(lián)網(wǎng)第三方支付系統(tǒng)等晌块,其核心都是基于賬戶的設計爱沟,由關(guān)系數(shù)據(jù)庫比如MySQL,Oracle來支撐的匆背。這是最直接最直觀符合人類思維的方式呼伸。
為了照顧沒有計算機和數(shù)據(jù)庫基礎知識的讀者,簡單介紹下數(shù)據(jù)庫知識。
數(shù)據(jù)庫指的是以一定方式儲存起來括享,能為多個用戶共享搂根,與應用程序彼此獨立的數(shù)據(jù)集合。簡單來說可視為電子化的表格铃辖,用戶可以對表格中的數(shù)據(jù)運行新增剩愧、更新、刪除等操作娇斩。
可以看出仁卷,關(guān)系數(shù)據(jù)庫可以簡單理解成一張表格。那么對于賬戶模型的數(shù)據(jù)庫犬第,簡單來講可以設計成兩個張表格:
- 賬戶表
- 交易記錄表
1 簡化的賬戶表格如下锦积,用來記錄所有人的銀行卡號及余額信息,實際情況會復雜很多:
編號 | 開戶人 | 開戶卡號 | 余額 |
---|---|---|---|
1 | 張三 | 62xxx001 | 100 |
2 | 李四 | 62xxx002 | 100 |
3 | 王五 | 62xxx003 | 100 |
... | ... | ... | ... |
2 交易記錄表如下歉嗓,用來記錄所有的轉(zhuǎn)賬記錄
編號 | 轉(zhuǎn)賬人 | 接收人 | 轉(zhuǎn)賬金額 |
---|---|---|---|
... | ... | ... | ... |
以上面李四給張三轉(zhuǎn)賬50元為例丰介,交易記錄表格,新增一條轉(zhuǎn)賬記錄如下:
編號 | 轉(zhuǎn)賬人 | 接收人 | 轉(zhuǎn)賬金額 |
---|---|---|---|
1 | 李四 | 張三 | 50 |
同時需要在賬號表格中做下余額修改鉴分,修改后的賬戶表格為
編號 | 開戶人 | 開戶卡號 | 余額 |
---|---|---|---|
1 | 張三 | 62xxx001 | 150 |
2 | 李四 | 62xxx002 | 50 |
3 | 王五 | 62xxx003 | 100 |
... | ... | ... | ... |
張三給王五轉(zhuǎn)賬50元后基矮,兩張表格的編號如下:
編號 | 轉(zhuǎn)賬人 | 接收人 | 轉(zhuǎn)賬金額 |
---|---|---|---|
1 | 李四 | 張三 | 50 |
2 | 張三 | 王五 | 50 |
修改后的賬戶表格為
編號 | 開戶人 | 開戶卡號 | 余額 |
---|---|---|---|
1 | 張三 | 62xxx001 | 100 |
2 | 李四 | 62xxx002 | 50 |
3 | 王五 | 62xxx003 | 150 |
... | ... | ... | ... |
3、什么是UTXO模型
上面的賬戶模型其實是人最直觀冠场、直接,容易理解的本砰。那么還有其他的方式來表示交易碴裙?中本聰設計的UTXO就是一種表示交易的方式。
UTXO是Unspent Transaction Output(未花費交易輸出)的簡寫点额,transaction 被簡稱為 TX舔株,所以上面這個短語縮寫為 UTXO。上面的賬戶模型是兩張表格組成还棱,UTXO經(jīng)過巧妙的設計不需要傳統(tǒng)的關(guān)系數(shù)據(jù)庫來支撐载慈,UTXO被翻譯成未消費交易輸出,由點拗口珍手,怎么理解呢办铡?
我們知道比特幣是挖出來的,假設張三琳要、李四寡具、王五都挖出了100個比特幣
同樣,以上面李四給張三轉(zhuǎn)賬50元為例
張三給王五轉(zhuǎn)賬50元后
解釋下上面的幾個圖的意思稚补。
比特幣的區(qū)塊鏈賬本里記錄的是一筆又一筆的交易童叠。每筆交易都有若干交易輸入,也就是資金來源课幕,也都有若干筆交易輸出厦坛,也就是資金去向五垮。一般來說,每一筆交易都要花費(spend)一筆輸入杜秸,產(chǎn)生一筆輸出放仗,而其所產(chǎn)生的輸出,就是“未花費交易輸出”亩歹,也就是 UTXO匙监。
挖礦所得的獎勵叫做coinbase,沒有輸入來源小作,所以張三亭姥、李四、王五的100個幣(為方便說明為100個顾稀,實際上根據(jù)減半機制达罗,比特幣在2018每個區(qū)塊獎勵是12.5個)均來自于挖礦,假設TX hash編號分別為0x001静秆,0x002粮揉,0x003。
李四給張三轉(zhuǎn)50個幣抚笔,轉(zhuǎn)賬交易的hash編號為0x004扶认,輸入的TX編號為0x001和0x002,輸出為張三150個幣殊橙,李四為50個幣辐宾。注意這里忽略了交易打包費。
在后來膨蛮,張三要給王五轉(zhuǎn)50個幣叠纹,轉(zhuǎn)賬交易的hash編號為0x005,聰明如你應該能猜出來敞葛,輸入是0x003和0x004誉察,輸出為張三100幣,王五150個幣惹谐。同樣這里忽略了交易打包費持偏。
由此,可以看出UTXO交易遵守下面規(guī)則:
- 除了 coinbase 交易之外豺鼻,所有的資金來源都必須來自前面某一個或者幾個交易的 UTXO综液,就像鏈條一樣,一個接一個儒飒,錢就在交易之間流動起來了谬莹。
- 任何一筆交易的交易輸入總量必須等于交易輸出總量,等式兩邊必須配平。
至此你應該能明白為什么有人說:比特幣網(wǎng)絡中沒有賬戶附帽,只有地址埠戳;比特幣不是余額,而是UTXO蕉扮。
你也能理解為什么你想看到比特幣錢包的最新余額整胃,必須要同步到最高的區(qū)塊高度才能正確顯示。
4喳钟、為什么要設計UTXO模型屁使?
4.1 賬戶模型的缺點
講點題外話:其實人的認知對于大與小的概念是不夠的。0.001秒對于人來講是一個很短很短的時間奔则,但是對于計算機來講是一個很長的時間蛮寂,在計算機世界可能相當于人類的1天。當我們嘲笑魚的記憶只用7秒的時候易茬,如果計算機有意識的話酬蹋,可能也會嘲笑人類的記憶最長也只有幾十年,因為計算機的存儲時間理論上來講是無限長的抽莱。
先給大家解釋下計算機基礎知識范抓。
筆者前面的文章解釋了圖靈機(http://www.reibang.com/p/c07d83c4f3a1),其實我們現(xiàn)在的所有計算機都是圖靈機食铐,從圖靈機的模型我們知道要修改一個數(shù)據(jù)匕垫,比如銀行卡余額增加100元,需要做三步:
1虐呻,先從賬戶中讀出余額
2年缎,把余額值增加100元得出新的余額值
3,把新的余額寫到賬戶中
在三步計算機操作在我們?nèi)丝磥硎撬查g(比如0.0001秒)完成铃慷,但是在計算機內(nèi)部其實要花一定時間的,它是一個分步驟完成蜕该,在多個CPU時鐘內(nèi)完成的犁柜。
對于賬戶模型,我們在上面已經(jīng)了解到堂淡,需要有兩張表格馋缅,轉(zhuǎn)賬過程中,要保證等式兩邊必須配平绢淀。所以發(fā)出去的交易是給某個帳戶加錢萤悴,同時要給另外一個賬戶減錢,即要對兩個賬戶的數(shù)據(jù)進行修改皆的,如果交易因為網(wǎng)絡等原因重新發(fā)送覆履,變成兩筆交易重復扣錢,這是在區(qū)塊鏈里面著名的“重放攻擊”。
在分布式系統(tǒng)中硝全,要保證加錢栖雾,減錢兩個同時完成,就需要實現(xiàn)分布式事務伟众,相信做個編程的同學就知道這是一個非常非常難析藕,非常消耗資源的一個事情,也是非常容易出現(xiàn)漏洞的地方凳厢,以太坊采用就是賬戶模型账胧,所以以太坊智能合約經(jīng)常由于編程不當引起被盜幣的事情發(fā)生
4.2 比特幣是沒有開戶的過程的,只有地址先紫。
去中心化系統(tǒng)沒有專門的機構(gòu)去讓人申請每個賬戶的生成和銷毀治泥,這樣的系統(tǒng)也無需記錄和跟蹤所有賬戶的信息,以UTXO來替代跟蹤帳戶交易的方式泡孩,消耗的系統(tǒng)資源會比較少 车摄,只要跟蹤UTXO即可,且不可篡改仑鸥。
4.3 更好匿名性
比特幣有個比較好的特性是匿名性吮播,可以每次交易就換一對公私鑰,交易輸出的給自己的找零往往輸出到一個另外的帳戶下去眼俊,UTXO迎合了這種需求意狠,如門羅幣就是采用混幣的方式實現(xiàn)隱私的。而使用帳戶模型就沒那么靈活了疮胖。
4.4 更好的并行處理
UTXO是獨立的數(shù)據(jù)結(jié)構(gòu)环戈,理論上來說可以并行地利用不同的 UTXO 簽發(fā)多筆交易,并廣播到網(wǎng)絡中澎灸,而不用考慮事務問題院塞;
4.5 占用空間小
去中心化系統(tǒng)考慮是全世界人民可以使用,開多個地址性昭,長期來看拦止,UTXO不會因為地址的增多而增加額外的空間,所以數(shù)據(jù)占用更小糜颠,而賬戶模型會越來越臃腫汹族。
5、從UTXO得到的啟發(fā)
5.1 跳出大眾思維其兴。比特幣作為一種點對點的電子貨幣系統(tǒng)顶瞒,跳出傳統(tǒng)貨幣系統(tǒng)的賬戶模型設計,采用了一種全新的方式元旬,用最低的成本榴徐,解決很多分布式問題守问。
5.2 找出等價性,越簡單越美箕速。 等價性是一種很厲害的解決問題的方式酪碘,在計算機領(lǐng)域有很多等價性的例子,比如用二進制來等價十進制盐茎,解決機械運動直接計算10進制非常復雜的情況兴垦;又比如把人工智能問題等價成數(shù)學問題。UTXO把賬戶交易用一種簡單的模型進行等價字柠,雖然不符合人常規(guī)思考方式探越,但非常簡單,非常具有美感窑业。
5.3 要學會某些妥協(xié)钦幔。 比特幣設計之初就是給全世界人民使用的,并且要具有去中心化常柄、可溯源鲤氢、不可篡改、匿名等特效西潘,就必須要所妥協(xié)卷玉,比如UTXO設計要實現(xiàn)EVM功能就非常困難,即實現(xiàn)圖靈完備的智能合約非常難喷市。這也是以太坊沒有采用UTXO模型的主要原因相种。