如何解決比特幣和以太坊編程模型中存在的問題

“通過分層架構,可以創建一個經濟實惠且通用的基礎架構,在我看來,這是區塊鏈驅動世界唯一可行的未來。”

三大編程模型

——UTXO模型

首先,從比特幣開始。

比特幣又被稱為點對點電子支付系統,其使用名為UTXO關聯比特幣地址的比特幣金額的集合,是一個包含數據和可執行代碼的數據結構的編程模型

最簡單的方法是將UTXO看作一個盒子。該盒子包含一個表示貨幣價值的數字和一個鎖。只有拿著相應鑰匙的人才能打開盒子。當進行轉賬時,持有鑰匙的所有者或個人使用鑰匙解鎖,找到另一個空盒子,將新面值放入新盒子中,並附加一個新所有者的鎖。

整個交易可以概括為打開盒子,拿出裡面的錢,摧毀原來的盒子,然後把它放在另一個盒子裡。

總而言之,盒子表示存儲數據的UTXO模型,鎖表示所有權。

——Account模型

除了UTXO模型,還有Account模型。這個模型最著名的例子是以太坊。

除了數據,以太坊Account模型中還有計算邏輯。你可以將ERC20合約想象成一個盒子,盒子裡沒有錢而是一組複雜的邏輯和數字。

與UTXO不同,Account模型的盒子始終可以重複使用,並且在其生命週期內無法打開。

當Account模型的盒子被製作出來時,一套規則會被寫進盒子裡,而一些按鈕也會被放置在盒子中,這樣人們就可以和盒子互動了。例如,規則可能這樣表示:如果一方想轉賬,那麼她或他或它需要出示身份證明的一種形式,並輸入密碼。一旦完成前面的步驟,就需要以下信息:轉賬金額、收件人和其他信息。一旦進入,她或他或者它需要按下轉移按鈕才能完成轉移。在收到信息後,它會從您的金額中扣除並更改到另一方的帳戶,然後更新所有內部數據。

熟悉編程的人會很快發現Account模型類似於現實世界中的OOP(面向對象編程一種計算機編程架構,按鈕的概念類似於API應用程序編程接口

如果我們擴展盒子隱喻,以太坊的功能更像ATM機。

在Account模型中,該盒子保存邏輯和數據。在將邏輯寫入工廠設置的盒子後,永遠不能更改它。您只能在需要修改數據時使用外部按鈕。每個人的錢都記錄在盒子裡。要進行事務是,只需要輸入事務信息,該盒子便會根據規則處理的請求進行數據更新。

——Cell模型

在Cell模型中,我們也可以將Cell看作一個盒子,因為它與UTXO模型非常相似,可以包含任意鎖定的任意對象。

你可以對該框執行並編寫一組規則來指定該盒子可以存儲什麼。通過這種方式,單元內的數據可以表示貨或加密貓之類的資產。此外,UTXO中的鎖也是相同的。但是在單元格模型中,用戶可以自由地更改和使用定製的鎖。(你可以將普通掛鎖與指紋鎖或數字鎖做對比)

總的來說,Cell模型是一個廣義的UTXO模型,具有以下兩個意義:第一鎖是可定製的; 第二盒子可以存儲用戶定義的數據。

Nervos(分層架構的分佈式應用網絡)的核心項目CKB 中,有一個編程模型便結合了比特幣編程模型和以太坊編程模型的優點。

有些人可能會對Cell模型如何使用其編程模型感到好奇。

首先理解區塊鏈系統的演變是很重要的。比特幣是p2p(點對點)支付系統的衍生,後來又誕生了更廣義的分散式應用平臺——以太坊。區塊鏈的進一步發展帶來了各種各樣的新項目,而且越來越多樣化。

由於需要全網共識的交易和存儲成本高昂,因此區塊鏈不可避免地採用一種架構。該架構允許在一致同意的範圍內實現靈活性,從而允許它們大規模地交付低成本交易。

主要障礙

——可擴展性問題

繼續阻礙區塊鏈發展的一個障礙是可擴展性問題。如果我們無法緩解這一問題,區塊鏈能力將受到限制,我們將無法看到強大的高級應用程序的開發,繼而釋放分散經濟的真正潛力將面臨挑戰。

可擴展性是“區塊鏈三難”的一部分,其中還包括安全性和分散性。而一個區塊鏈系統最多可以具有三難困境中的2個。

——交易成本問題

第二個障礙是交易成本問題。一個社會整體交易成本的降低是衡量一項技術在規模上可行性的最有力指標之一。由於需要全網共識的交易和存儲成本高昂,因此區塊鏈不可避免地採用一種架構。該架構允許在一致同意的範圍內實現靈活性,從而允許它們大規模地交付低成本交易。

解決方案:分層架構

計算機愛好者知道他們的設備包含一個複雜的分層架構。該分層架構中包括內存、硬盤、多級緩存和各種寄存器。這種架構允許普通大眾低成本使用,同時利用其可伸縮的能力以滿足不斷增長的計算挑戰。

我們可以將相同的設計原則應用於區塊鏈。通過分層的架構,可以創建經濟實惠且通用基礎設施。在我看來,這是區塊鏈驅動的世界唯一可行的未來。隨著Lightning、(閃電網絡)、Plasma(以太坊擴容的四大方案之一)和支付通道的興起,我們已經可以看到這種類型的架構正在興起以及它所促進的用例。 在接近這種分層的區塊鏈架構時,重要的是要檢查構成區塊鏈系統的三種不同數據模型之間的關係:UTXO模型,Account模型和Cell模型。

——驗證與計算模型

Cell模型源自UTXO模型,因此是驗證模型。相反,Account模型是計算模型。

在資產從第2層返回到第1層時,第2層解決方案會利用證明提交和驗證機制(如閃電網絡)。而由於第1層扮演的是驗證角色,而不是計算角色,因此我們可以看到UTXO或Cell模型是這種結構的合適方法。

——解決規模擴增性問題

目前,以太坊和“下一代”區塊鏈面臨著規模不斷增長的嚴峻挑戰。雖然大規模採用已實現突破,但全節點的數據存儲成本日漸增高,包括各種殭屍帳戶的擴增,也讓情況變得更糟。

使用Account模型時,所有用戶的資產都存儲在一個合約中。如果沒有直接的方法來為每個用戶分割狀態,則很難根據每個用戶佔用狀態的容量和持續時間向他們收費。

同時,這對支付通道收費的實施也提出了挑戰。目前在以太坊,交易費用是一次性支付,授予永久性存儲。但鑑於區塊鏈是公共基礎設施,這種模式是不可持續的。我們可以看到,持續支付倉儲空間租金是一種更加合理的方式。

在單元模型中,每個用戶的數字資產分別存儲在各自的單元中。如果用戶不想繼續持有資產,則可以釋放單元中的數據,並且可以將存儲容量出售或借給其他用戶。這種設計確保了第1層不會無限期地存儲廢棄的資產,併為狀態存儲開闢了新的可能性。

結論

總的來說,當考慮存儲和驗證要求時,單元模型最適合分層區塊鏈架構的需求。

附:UTXOACCOUNT優缺點對比

UTXO 模型

UTXO 模型中,交易只是代表了 UTXO 集合的變更。而賬戶和餘額的概念是在 UTXO 集合上更高的抽象,賬號和餘額的概念只存在於錢包中。

如何解決比特幣和以太坊編程模型中存在的問題

優點:

計算是在鏈外的,交易本身既是結果也是證明。節點只做驗證即可,不需要對交易進行額外的計算,也沒有額外的狀態存儲。交易本身的輸出 UTXO 的計算是在錢包完成的,這樣交易的計算負擔完全由錢包來承擔,一定程度上減少了鏈的負擔。

除 Coinbase 交易外,交易的 Input 始終是鏈接在某個 UTXO 後面。交易無法被重放,並且交易的先後順序和依賴關係容易被驗證,交易是否被消費也容易被舉證。

UTXO 模型是無狀態的,更容易併發處理。

對於 P2SH 類型的交易,具有更好的隱私性。交易中的 Input 是互不相關聯的,可以使用 CoinJoin 這樣的技術,來增加一定的隱私性。

缺點:

無法實現一些比較複雜的邏輯,可編程性差。對於複雜邏輯,或者需要狀態保存的合約,實現難度大,且狀態空間利用率比較低。

當 Input 較多時,見證腳本也會增多。而簽名本身是比較消耗 CPU 和存儲空間的。

ACCOUNT 模型

對於 Account 模型,Account 模型保存了世界狀態,鏈的狀態一般在區塊中以 StateRoot 和 ReceiptRoot 等形式進行共識。交易只是事件本身,不包含結果,交易的共識和狀態的共識本質上可以隔離的。

如何解決比特幣和以太坊編程模型中存在的問題

優點:

合約以代碼形式保存在 Account 中,並且 Account 擁有自身狀態。這種模型具有更好的可編程性,容易開發人員理解,場景更廣泛。

批量交易的成本較低。設想礦池向礦工支付手續費,UTXO 中因為每個 Input 和 Out 都需要單獨 Witness script 或者 Locking script,交易本身會非常大,簽名驗證和交易存儲都需要消耗鏈上寶貴的資源。而 Account 模型可以通過合約的方式極大的降低成本。

缺點:

Account 模型交易之間沒有依賴性,需要解決重放問題。

對於實現閃電網絡/雷電網絡,Plasma 等,用戶舉證需要更復雜的 Proof 證明機制,子鏈向主鏈進行狀態遷移需要更復雜的協議。

UTXO VS ACCOUNT

對於以上幾個優點和缺點,我們再做一些分析和對比。

第一,關於計算的問題。

UTXO 交易本身對於區塊鏈並沒有複雜的計算,這樣簡單的講其實並不完全準確。主要原因是 Bitcoin 本身的交易多為 P2SH,且 Witness script 是非圖靈完備的,不存在循環語句。而對於 Account 模型,例如 Ethereum,由於計算多在鏈上,且為圖靈完備,一般計算較為複雜,同時合約安全性就容易成為一個比較大的問題。當然是否圖靈完備對於是否是賬戶模型並沒有直接關聯。但是賬戶模型引入之後,合約可以作為一個不受任何人控制的獨立實體存在,這一點意義重大。

第二,關於 UTXO 更易併發的問題。

在 UTXO 模型中,世界狀態即為 UTXO 的集合,節點為了更快的驗證交易,需要在內存中存儲所有的 UTXO 的索引,因此 UTXO 是非常昂貴的。對於長期不消費的 UTXO,會一直佔用節點的內存。所以對於此種模型,理論上應該鼓勵用戶減少生產 UTXO,多消耗 UTXO。但是如果要使用 UTXO 進行並行交易則需要更多的 UTXO 作為輸入,同時要產生更多的 UTXO 來保證併發性,這本質上是對網絡進行了粉塵攻擊。並且由於交易是在錢包內構造,所以需要錢包更復雜的設計。反觀 Account 模型,每個賬戶可以看成是單獨的互不影響的狀態機,賬戶之間通過消息進行通信。所以理論上用戶發起多筆交易時,當這些交易之間不會互相調用同一 Account 時,交易是完全可以併發執行的。

第三,關於 Account 模型的交易重放問題。

Ethereum 使用了在 Account 中增加 nonce 的方式,每筆交易對應一個 nonce,nonce 每次遞增。這種方式雖然意在解決重放的問題,但是同時引入了順序性問題,同時使得交易無法並行。例如在 Ethereum中,用戶發送多筆交易,如果第一筆交易打包失敗,將引起後續多筆交易都打包不成功。在 CITA 中我們使用了隨機 nonce 的方案,這樣用戶的交易之間沒有順序性依賴,不會引起串聯性失敗,同時使得交易有並行處理的可能。

第四,存儲問題。

因為 UTXO 模型中,只能在交易中保存狀態。而 Account 模型的狀態是在節點保存,在 Ethereum 中使用MPT 的方式存儲,Block 中只需要共識 StateRoot 等即可。這樣對於鏈上數據,Account 模型實際更小,網絡傳輸的量更小,同時狀態在節點本地使用 MPT 方式保存,在空間使用上也更有效率。例如 A 向 B 轉賬,如果在 UTXO 中假設存在 2 個 Input 和2個 Output,則需要 2 個 Witness script 和 2 個Locking script;在 Account 模型中則只需要一個簽名,交易內容只包含金額即可。在最新的隔離見證實現後,Bitcoin的交易數據量也大大減少,但是實際上對於驗證節點和全節點仍然需要針對 Witness script 進行傳輸和驗證。

第五,對於輕節點獲取某一地址狀態,UTXO 更復雜。

例如錢包中,需要向全節點請求所有關於某個地址的所有 UTXO,全節點可以發送部分 UTXO,錢包要驗證該筆 UTXO 是否已經被消費,有一定的難度,而且錢包很難去證明 UTXO 是全集而不是部分集合。而對於 Account 模型則簡單很多,根據地址找到 State 中對應狀態,當前狀態的 State Proof 則可以證明合約數據的真偽。當然對於 UTXO 也可以在每個區塊中對 UTXO 的 root 進行驗證,這一點與當前 Bitcoin 的實現有關,並非 UTXO 的特點。

作者:Zhang Yaning

編譯:共享財經馬明

相關推薦

推薦中...