【文章來自:https://segmentfault.com/p/1210000013473348/read】
大多數(shù)初學(xué)區(qū)塊鏈技術(shù)的朋友握爷,都是從比特幣和以太坊的技術(shù)原理來入手的。這兩個項目有很多相同之處拨与,但是他們在細(xì)節(jié)的實現(xiàn)上是有挺多的區(qū)別的桂对,今天我們就來說說賬戶模型的區(qū)別欲险。
0x00 如何正確表述兩者的余額
比特幣和以太坊在實現(xiàn)余額的處理上揖盘,采用了不同的機(jī)制项阴,比特幣采用了UTXO未花費交易輸出;而以太坊采用了維護(hù)賬戶狀態(tài)機(jī)制僻他。
在比特幣中宵距,其實并沒有所謂的賬戶,只有比特幣地址中姜。正確的表述一個比特幣地址里面的余額,應(yīng)該是這樣的:小明的比特幣地址里面擁有價值20個比特幣的UTXO(下面講何為UTXO)跟伏。
在以太坊中丢胚,是擁有賬戶的概念的,每個地址對應(yīng)一個以太坊的賬戶受扳,而表述以太坊賬戶的余額携龟,就是傳統(tǒng)的表述方式:小明的以太坊賬戶里面擁有20個以太坊。
0x01 比特幣的UTXO模型
UTXO英文全稱為:Unspent Transaction Output勘高,翻譯為中文:未花費交易輸出峡蟋。
其實理解UTXO最簡單的方式就是類比我們平時使用的紙幣。
比如你是一個賣冰峰的商家华望,小明有10元錢蕊蝗,想要購買一瓶冰峰,冰峰4元赖舟,小明支付給你10元錢蓬戚,你需要給小明找回6元錢。
也就是說宾抓,其實我們把10元錢分成了兩份子漩,一份是4元給商家的,一份是6元找零給小明的石洗。
將上述現(xiàn)金紙幣的消費模型抽象為UTXO模型如下:
該筆交易中幢泼,小明的10元錢就是交易輸入,4元錢和6元錢是未使用輸出讲衫,分別給了商家和小明缕棵。
也就是此時,你擁有了4元錢的未交易輸出。而此時的你挥吵,想去對面購買一瓶2元錢的礦泉水重父,此時你就可以使用小明之前給你的4元錢,作為作為交易輸入忽匈,支付給礦泉水商家房午。
總結(jié)之后:支付是交易輸入,收款是未花費的交易輸出丹允。
備注:在比特幣中郭厌,每一筆UTXO都不可分割,必須在一次交易中雕蔽,通過設(shè)置不同的輸出將其拆分給不同的地址折柠。
下面給張圖再展示下:
0x02 以太坊的賬戶模型
在以太坊中,其實賬號模型是比較好理解的批狐,因為以太坊的賬戶模型跟我們傳統(tǒng)所理解的賬戶模型是一致的扇售。在以太坊中,賬戶地址有兩種嚣艇,分別是:
外部賬戶地址:普通用戶擁有的公私鑰配對的賬戶承冰,也就是我們常用的存儲自己代幣的賬戶地址。
合約賬戶地址:合約賬戶地址指智能合約的賬戶地址食零。
在以太坊賬戶中困乒,我們維護(hù)以下幾個狀態(tài):
nonce:外部賬戶為交易次數(shù),合約賬戶為創(chuàng)建的合約序號贰谣。
balance:此地址的以太幣余額娜搂。
storageRoot:賬戶存儲內(nèi)容組成的默克爾樹根的哈希值。
codeHash:賬戶EVM代碼的hash值吱抚。合約賬戶即為合約代碼的哈希值百宇,外部賬戶為空字符串的哈希值。
0x03 UTXO模型與賬戶模型的優(yōu)缺點
UTXO未花費交易模型被很多人認(rèn)為是中本聰最牛逼的設(shè)計之一秘豹,那么它有什么優(yōu)點呢恳谎?而以太坊沒有選擇沿用比特幣的UTXO模型,而選擇了賬戶模型憋肖,又是為什么呢因痛?
UTXO優(yōu)點
私密性比較強(qiáng),理論上可以為每一筆輸出設(shè)置一個地址岸更。
無需維護(hù)余額等狀態(tài)值鸵膏。
UTXO是獨立數(shù)據(jù)記錄,可以通過并行極大的提升區(qū)塊鏈交易驗證速度怎炊。
無需關(guān)心事務(wù)問題谭企,只需要關(guān)心輸出腳本即可廓译。
UTXO無法分割,每次交易都需要多個輸出债查,分別為支出與找零非区。
賬戶模型優(yōu)點
可以快速獲取賬戶的余額,而比特幣需要將指定地址所擁有的所有UTXO中的未花費交易總值整合盹廷。
節(jié)省空間征绸,因為每筆交易只有一個輸入一個輸出。
可以較容易的實現(xiàn)圖靈完備的智能合約俄占。
0x04 結(jié)語
比特幣和以太坊想要解決的問題不一致管怠,比特幣想要實現(xiàn)電子現(xiàn)金系統(tǒng),而以太坊希望實現(xiàn)一個圖靈完備的智能合約平臺缸榄,所以他們各自選擇了最適合自己的一種模型來解決這個問題渤弛。所以,不能一概而論的說甚带,孰好孰壞她肯,而是需要分析想要解決的問題是什么,最適合的解決方式是什么鹰贵,也有可能你想解決的問題晴氨,這兩種都不適用,也許要創(chuàng)造出第三種砾莱,也有可能將兩者結(jié)合也說不定呢瑞筐。