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

買賣虛擬貨幣

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

三大程式設計模型

——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層不會無限期地儲存廢棄的資產,併為狀態儲存開闢了新的可能性。

結論

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

附:UTXO與ACCOUNT優缺點對比

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 的特點。

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;