作者:devopsguy
來源:hackernoon
編譯:陳一晚風
眾所周知,比特幣和以太坊在很多方面都有很多不同之處。例如在追蹤用戶擁有多少代幣方面,比特幣和以太坊就是通過兩種完全不同的方式來進行。比特幣使用基于未花費交易輸出UTXO(Unspent Transaction Outputs)的模型,而以太坊則采用基于賬戶的方法,
比特幣:未花費交易輸出UTXO
比特幣交易主要由幾個部分組成,之前運用到UTXO的只有兩點:
1、交易輸入,即我們將要花費的代幣;
2、交易輸出,即誰將收到我們的代幣。
一筆交易必須至少有一個輸入和至少一個輸出,也就是一筆交易的輸出成為另一筆交易的輸入,通過這種方式,代幣的歷史才可以追溯到它被開采的區塊。
要理解這個系統是如何工作的一個很好的類比是,想象我們正在用現金購買產品,50美元的鈔票。付款時,你可能會遇到以下情況之一:
1、產品售價10美元
你可以選擇用一張10美元的鈔票來支付,這樣一來,這個交易就只有一個輸入(10美元的鈔票)和一個輸出(收銀員收到10美元的鈔票)。
2、產品售價30美元
你仍然可以選擇付款,但這次需要兩張不同的鈔票(10美元和20美元),在這種情況下,交易有多個輸入(10美元和20美元的鈔票)和一個輸出(收銀員收到30美元鈔票),
3、產品售價45美元
你可以選擇用50美元的鈔票付款,這樣收銀員就會退給你5美元,這種情況相當于一個輸入(50美元鈔票)和多個輸出(收銀員45美元,返還5美元),
4、產品售價55美元
你支付10美元和50美元,即60美元。收銀員退給你5美元。這種情況相當于多個輸入(10美元和50美元的鈔票)和多個輸出(收銀員55美元,返還5美元),
正如你所看到的,你給收銀員的賬單(以及你收到的賬單)將在未來用于其他付款。同樣,比特幣交易的輸出成為未來交易的輸入。在它們被使用之前,它們是未花費的,因此被稱為未花費交易輸出(UTXO),
如果你想知道你擁有多少現金,那么就需要將你錢包中所有紙幣和硬幣的價值相加。而在比特幣的情況下,錢包會跟蹤與用戶密鑰相關聯的UTXO。這樣他們就知道用戶擁有多少代幣。
以太坊:賬戶模型
理解以太坊基于賬戶模型的一個很好的類比是假設一個銀行賬戶,客戶的賬戶中有一定數量的資金,如果客戶A向客戶B轉賬5美元,假設客戶A至少有5美元,則客戶A的賬戶將借記5美元,客戶B的賬戶將貸記5美元。簡而言之,這就是以太坊賬戶的工作方式。
此外,還有兩種類型的帳戶:
外部擁有賬戶(EOA):它們由用戶通過私鑰控制。
合約賬戶:這些賬戶由智能合約代碼控制,由于它們不受私鑰控制, 因此無法發起交易,發送到智能合約的交易可能會導致該合約調用其他合約的函數,
所有帳戶都有以下字段:
1、余額:賬戶所擁有的ETH余額;
2、Nonce : 賬戶產生的確認交易數量。
3、存儲:永久數據存儲,僅供智能合約使用(對EOA不適用);
4、代碼:僅用于智能合約(EOA沒有任何代碼)。
以太坊中的所有交易都是由EOA發起的,EOA和合約賬戶都可以接收和發送ETH:
1、如果收款賬戶是EOA,其余額會增加;
2、如果接收賬戶是合約賬戶,其代碼將被執行,反過來,這個智能合約可以調用另一個智能合約。例如,將ETH發送到另一個智能合約,或者將ETH發送到EOA等等,
合約僅在帳戶調用時運行,它們可以從EOA或其他智能合約中調用,但最終,一切都源于由EOA創建的交易。
雙花攻擊
當同一代幣被多次使用時,就會發生雙花攻擊。如果你有一張10美元的鈔票,你不能花兩次,因為一旦你付了錢并把它交給別人,那么它就不會在你的控制之下。但是,對于數字貨幣該如何確保相同的代幣不會在不同的交易中使用呢?
比特幣如何解決雙花攻擊
當在交易中使用代幣時,該代幣就會從UTXO集中刪除,類似地,當新交易出現時,它們的輸出就被添加到UTXO集合中。因此,避免雙花攻擊就像檢查您嘗試花費的代幣是否是UTXO集和的一部分一樣簡單。如果是,你可以放心地使用它。否則,它就已經被花掉了。并且每個完整節點維護所有UTXO的列表,這使得驗證變得非常快速。
重放攻擊
由于您無法在以太坊中跟蹤單個代幣,因此雙花攻擊的概念在以太坊中并不適用,而在以太坊中最需要防止的則是重放攻擊(Replay Attacks)。
以太坊如何防止重放攻擊
想象一下,假設你想買一輛車,你向經銷商發送了10個ETH后收到了汽車,經銷商收到了10個ETH,你們都很高興。而在這筆有效的交易中,如果經銷商一遍又一遍地向以太坊網路發送相同的交易,以此來有效地耗盡您的賬戶,那么這就是所謂的重放攻擊,
以太坊使用Nonce的概念來解決這個問題。在密碼學中,Nonce是一個在密碼通信中只能使用一次的數字 。在以太坊中,Nonce是一個與賬戶相關聯的數字,代表從該賬戶發送的交易數量,如果是合約賬戶,則代表合約已創建(未調用)的合約數量,
Nonce是如何工作的
在交易進行時,你的交易將包含一個Nonce值,使其獨一無二。如果攻擊者嘗試重放相同的交易,節點將看到從你的地址到具有該Nonce的經銷商地址的該數量的ETH的交易已經被處理,然后該交易就被視為重復交易。
需要注意的是,攻擊者只能嘗試創建完全相同數量的交易 ,如果攻擊者要更改數量,這將使簽名無效,使其成為節點將拒絕的無效交易,另外,無論你將ETH發送到哪個地址,你的下一筆交易都會增加Nonce 。
這種機制不僅可以防止重放攻擊,而且還允許事務按特定順序執行,如果你發送一系列Nonce 為3、4和5的交易,即使先收到Nonce為4和5的交易,它們也會留在內存池中,直到帶有Nonce 3的交易被確認,除非你正在編寫代碼來發送交易,否則不需要擔心這個問題。一切都將由你的錢包處理,
UTXO模型&賬戶模型優缺點
UTXO模型
優點:
1、可以很容易地檢查輸出是否已經被花費,從而避免雙花攻擊;
2、交易可以輕松地并行處理,從而帶來更好的可擴展性;
3、隱私性好,用戶每次交易都可以使用一個新地址。
缺點:
1、新用戶很難掌握;
2、更難實施智能合約,因為UTXO不跟蹤任何狀態,
帳戶模型
優點:
1、易于實施智能合約;
2、交易更加緊密,節省空間。
缺點:
1、實現并發交易很棘手,因為存在受不同交易影響的全局狀態;
2、隱私度低,交易都綁定在一個帳戶中;
3、依靠Nonces來防止重放攻擊。
結論
從上述內容中我們可以看出,UTXO模式使用起來會很復雜,而以太坊的賬戶模型相較簡單。但實際上,UTXO的模型會讓整個賬本非常“輕”,因為UTXO的數據不會因為賬戶的增加而膨脹,也不會因為每筆交易的更新而更新所有人的余額資訊。這在很大程度上減少了比特幣網路需要更新和保存的數據。而以太坊網路就因為保存了大量無用數據使得空間內存不夠,從而造成交易速度緩慢,
但是在對交易進行驗證時,以太坊賬戶模型效率卻顯得更高。因為UTXO模型中,如果交易中存在多個輸入,則每個輸入都需要分別簽名,每次查詢需要也要遍歷相關的UTXO,效率相對會低一些。而以太坊賬戶模型因為不用對過去的UTXO進行簽名,所以可以從任何一個時間點開始更新區塊鏈狀態,讓輕節點的驗證更簡單可行,
那么在對比完比特幣UTXO模式與以太坊賬戶模型后,你更看好哪一個呢?