關於 UTXO 的思考

什麼是 UTXO ?

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

若是一個用戶想要發送一筆交易,發送 X 個幣到一個特定的地址,有時候,他們擁有的 UTXO 的一些子集組合起來面值剛好是 X,在這種狀況下,他們能夠創造一個交易:花費他們的 UTXO 並創造出一筆新的、價值 X 的 UTXO ,由目標地址佔有。當這種完美的配對不可能的時候,用戶就必須打包其和值 大於 X 的 UTXO 輸入集合,並添加一筆擁有第二個目標地址的 UTXO ,稱爲「零錢輸出」,分配剩下的幣到一個由他們本身控制的地址。github

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 的複雜性是沒有必要的,而其複雜性在實際運行中會比在理論上還要大。less

  2. UTXO 是無狀態的(stateless),所以並不能很好的適用於比資產的發行和保存更加複雜的應用,複雜應用通常來講是有狀態的,好比不一樣類型的智能合約。異步

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

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

在比特幣的例子(現實一點來講,任何一個公有鏈都是)中,交易費用以每千字節計,而 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;本質上,每個用戶都將能夠爲他們本身選擇用於保護他們帳戶的機制。這打開了朝向創造性的大門,好比,可並行化nonce(本質上,這個方案結合了一個帶有千位二進制過濾器的nonce,保證nonce是一次性使用的,但容許用戶提早使用將來的nonce,容許高達K筆交易以任意順序處理),甚至容許用戶創建基於 UTXO 的方案,若是他們但願的話。

在後續的以太坊版本中,咱們想經過分片實現可擴展性,會有一個跨分片異步調用方案,若是一個合約(以太坊術語,及一個由一段代碼控制的帳戶)但願調用另外一個分片中的合約,該合約會在它所在的分片中建立一個「收據」,收據能夠被另外一個分片上的合約經過默克爾樹分支來驗證。這種收據的概念在本質上融合了一個異步函數調用過程的概念與一個 UTXO 的概念:若是該函數調用問題是價值轉移,則函數調用過程在表面上 就是 一個 UTXO ——雖然是一個遠遠更可通常化的版本。所以,一旦全部這些協議變動實現了,以太坊將在多種形式上支持帳戶模型和一個 UTXO 模型,容許用戶從無論哪個他們認爲對給定應用來講最好的模式中獲益。

原文連接: medium.com/@ConsenSys/…

做者: Vitalik Buterin

翻譯: 阿劍

稿源:以太坊愛好者(ethfans.org/posts/thoug…

相關文章
相關標籤/搜索