乾貨|關於 UTXO 的思考

干货|关于 UTXO 的思考

什麼是 UTXO ?

在比特幣中,一筆交易“在黑盒子裡”實際運作的方式是:花費 一種東西的集合,這種東西被稱為 “未被花費的交易輸出”(即 “UTXO” ),這些輸出由一個或多個之前的交易所創造,並在其後 製造 出一筆或多筆新的 UTXO ,可以在未來的交易中花費。每一筆 UTXO 可以被理解為一個 “coin(幣)”:它有面額、有一個所有者。而且,一筆交易若要有效,必須滿足的兩個規則是:1)該交易必須包含一個有效的簽名,來自它所花費的 UTXO 的擁有者;2)被花費的 UTXO 的總面額必須等於或者大於該交易產生的 UTXO 的總面額。一個用戶的餘額因此並不是作為一個數字儲存起來的;而是用他佔有的 UTXO 的總和計算出來的。

如果一個用戶想要發送一筆交易,發送 X 個幣到一個特定的地址,有時候,他們擁有的 UTXO 的一些子集組合起來面值恰好是 X,在這種情況下,他們可以創造一個交易:花費他們的 UTXO 並創造出一筆新的、價值 X 的 UTXO ,由目標地址佔有。當這種完美的配對不可能的時候,用戶就必須打包其和值 大於 X 的 UTXO 輸入集合,並添加一筆擁有第二個目標地址的 UTXO ,稱為“變更輸出”,分配剩下的幣到一個由他們自己控制的地址。UTXO 的好處

近來 UTXO 模型已經被推廣了,因為它在比特幣中的應用,已經一些私有鏈的用戶也在使用它;Hyperledger 切換到 UTXO 的理由如下所示:

我們同樣正在將我們的賬戶、餘額這樣簡單化的概念切換到應用比特幣 UTXO 模型在事實上的標準,只是稍微作了改進。雖然 Hyperledger 完全不使用比特幣,比特幣系統仍然是非常巨大而富有創造性的,人們已在其中投入上億美元。通過將比特幣的交易模型應用為標準,Hyperledger 的用戶將從比特幣的創造性中受益;反之亦然,與讓 Hyperledger 變得更富互操作性有同樣的效果。

除了"比特幣的網絡效應",我們可以為 UTXO 模型提出一些技術上的主張;一個特別的主張是:它允許交易的並行化處理,正如一個交易發送者發送兩筆獨立的交易是,他們可以小心地花費獨立的 UTXO ,因此這些交易也可以用任意次序來處理。這種順序不變性與可並行化屬性也許可以帶來可擴展性的好處。使一個人的幣可以分離開來,同樣有一些隱私保護上的好處,尤其是,當一個用戶接到的每一筆 UTXO 都使用了一個不同的地址的時候,因為這些地址的私鑰可以確切地被所有者通過一個 master seed 生成出來;雖然這種隱私所得很容易被打破,如果該用戶並沒有仔細地保證他的資金相互分離的話。在本文作者看來,如果隱私是被強烈偏好的,那麼由 UTXO 提供的資金分離對於這個任務來說是遠遠不夠的;這將需要更復雜的建構如環簽名(Ring Signatures),額外的同態加密(Homomorphic Value Encryption)以及 ZK-SNARKs。

為什麼不使用 UTXO ?

反對 UTXO 的核心主張有下面兩部分:

  1. UTXO 的複雜性是沒有必要的,而其複雜性在實際運行中會比在理論上還要大。

  2. UTXO 是無狀態的(stateless),因此並不能很好的適用於比資產的發行和保存更加複雜的應用,它們一般來說是有狀態的,比如不同類型的智能合約。

來考察第一種主張。考慮一下你會如何實現一個 UTXO 模式下的錢包——尤其是,生成一個發出交易的函數。這一函數不僅要求一個賬戶的私鑰作為輸入,還有一些瑣碎的數據,比如一個有序的數字,而不是屬於該賬戶的 UTXO 的全集。這一函數還必須接受集合,並確定一個價值大於需要的輸出數額的子集作為如數。某些時候,如果存在多個最小的子集,又會產生一些決定要花費哪個子集的複雜任務。

此外,如果一個錢包真的想要從上面提到的, UTXO 的並行化交易處理屬性中獲益,該錢包必須仔細地分切“變更輸出”以至於該錢包總是有多個變更輸出可以用作資金的來源;如果一個錢包只控制一個大的變更輸出、總是從中抽取出一個小的數額來做下一筆支出,整個事情又變成連續的了。這不是純粹理論上的問題;大部分的比特幣錢包仍然不能使其最優化,與賬戶和連續數字模型相比,這在本質上使其 UTXO 的可並行化收益作廢。

在比特幣的例子(現實一點來說,任何一個公有鏈都是)中,交易費用以每千字節計,而 UTXO 選擇算法必須額外地小心以最優化每一筆 UTXO 的長期平均交易消耗;這甚至引發了一個拒絕服務漏洞,攻擊者可以使用小額的 UTXO(其價值比花費它們需要的邊際手續費還要小) 來堵塞一個錢包。撇開這些,每千字節的手續費的存在在 UTXO 選擇算法中引入了一些摩擦:可能有這樣一種情況, UTXO 的子集 S 足以支付需要的數額 X,但大小為 S 的交易要求一筆交易手續費 F, 而 S 並不足以支付 X+F,那麼 S 就需要增加到 S’ ,但然後 S' 大小的交易又要求交易手續費 F' ,要求有 UTXO 的子集 S'',等等。 簡而言之,使用賬戶和連續數字,創造一個錢包只是一個高中級別的問題;然而你,使用 UTXO 它就變得很接近於一個本科生研究級別的挑戰了。

UTXO 是如何地不契合於有狀態的智能合約,也是清楚的:如果需要創建一個擁有多個階段的合約,比如,必須由多方提供一些形式的輸入,一段時間以後這些參與者又必須執行一些額外的操作,最後,作為他們操作的一個函數,該合約支出資金;很難看出如何拿這個模型去適應基本上無狀態而只有花費和未花費的對象。然而,在一個基於賬戶的模型中,事情就簡單了:一個人可以確認一個合約具有他所希望的代碼,然後,這個合約就可以被其靜態地址調用。

可以給出另一個例子,一個有潛在需求的用例是防止資產被盜的技能,通過引入一個存儲在一個安全位置的“復原密鑰”,你可以在特定時間之內衝你的主賬戶撤回交易。在一個 UTXO 模型中,即便交易輸出所在的一筆更大的 UTXO 可以對它們發往的目標地址施加一定的要求,這還是一個值得作為學術研究論文的挑戰。在一個基於賬戶的模式中,這可以在20分鐘的編程時間裡通過一個智能合約來實現,合約只要簡單地直接實現這個規則就可以了。對特定各方的有限資產所有權(例如:尚未KYC的用戶)是另一個例子,它可以用一些複雜的契約來管理,但在一個基於賬戶模式的智能合約中它不過是一個簡單的代碼寫作練習。值得指出的是,與其說這些是賬戶模式相對於 UTXO 的好處,不如說是一個有狀態的腳本語言的長處;缺乏一種有狀態的腳本語言(例如,在 NXT中),基於賬戶的抹上同樣無法簡單地處理這些問題中的任何一個。然而,可靜態尋址的對象的概念使得實現有狀態系統的邏輯在實踐上變得更加簡單、對開發者來說也更加友好。

我們能兩者都要嗎?

在最近的以太坊實現中,我們有了一個顯式的協議層概念,關於賬戶和交易中的連續數字;因此,我們已經為我們的用戶做出了抉擇,這是我們用來保護賬戶的模式。在下一次重要發行,Serenity ,我們正在計劃一個抽象模式,將這一選擇從協議層下沉到 EVM;本質上,每一個用戶都將可以為他們自己選擇用於保護他們賬戶的機制。這打開了朝向創造性的大門,比如,K-可並行化nonce(本質上,這個方案結合了一個帶有千位二進制過濾器的nonce,保證nonce是一次性使用的,但允許用戶提前使用未來的nonce,允許高達K筆交易以任意順序處理),甚至允許用戶建立基於 UTXO 的方案,如果他們希望的話。

在後續的以太坊版本中,我們想通過分片實現可擴展性,會有一個跨分片異步調用方案,如果一個合約(以太坊術語,及一個由一段代碼控制的賬戶)希望調用另一個分片中的合約,該合約會在它所在的分片中創建一個“收據”,收據可以被另一個分片上的合約通過默克爾樹分支來驗證。這種收據的概念在本質上融合了一個異步函數調用過程的概念與一個 UTXO 的概念:如果該函數調用問題是價值轉移,則函數調用過程在表面上 就是 一個 UTXO ——雖然是一個遠遠更可一般化的版本。因此,一旦所有這些協議變更實現了,以太坊將在多種形式上支持賬戶模型和一個 UTXO 模型,允許用戶從不管哪一個他們認為對給定應用來說最好的模式中獲益。


分享到:


相關文章: