Monoxide是由王嘉平博士與其他研究人員共同設計的公有鏈方案,並發表了論文《Monoxide: Scale Out Blockchain with Asynchronized Consensus Zones》。我並沒有下載到並閱讀這篇論文,不過根據王嘉平博士的《Monoxide原理詳解:突破區塊鏈不可能三角的極簡架構》一文,已不難領悟其設計精要。理解Monoxide之前,可先思考一下區塊鏈系統的分片設計,及分片架構必然會遇見的兩個典型問題。1、什麼是分片:由於單一的、整體式的區塊鏈系統,交易處理速度慢、吞吐量低,因此可考慮將單一系統分割成一定程度上獨立的N個分片子系統,以提升整個系統的交易處理速度與吞吐量。2、如何處理跨分片交易:Alice的賬戶位於A分片,Bob的賬戶位於B分片,若Alice需給Bob轉賬,應如何處理?3、如何確保分片安全性:若採取PoW共識演算法,將挖礦算力分散到N個分片,每個分片的算力只佔全網算力的1/N,如何應對惡意算力攻擊?Monoxide採用非同步共識組方案:將單一的區塊鏈網路及賬本分割成N個形式上獨立的共識組,每個共識組擁有獨立的賬本(鏈)、P2P網路,分組K的區塊只在網路K中進行Gossip廣播,各個分組的行為與動作是非同步執行的,可以認為每個共識組就是一個分片。Monoxide在Nakamoto或GHOST的基礎上,只進行了非常簡單、而又極其有效的改進,這是目前其他的很多分片方案所不具備的,這些分片方案的設計過於複雜,不夠精妙。為了處理跨分組交易,Monoxide引入了接力交易(或稱之為中繼交易):分組A的Alice給分組B的Bob轉了X個幣,則可先在分組A的區塊Y中打包這筆交易,並執行Alice(-X)。接著生成接力交易,包含完備的轉賬資訊,比如區塊Y的頭部資訊,及交易Merkle Tree Path,並將接力交易傳送到分組B,分組B的礦工最終(雖然會延遲)會驗證接力交易的合法性,並記錄到分組B的區塊中、執行Bob(+X)。透過將1筆交易轉換為2筆交易的方式完成跨組交易,Monoxide稱之為交易的「最終原子性」。由於收款方共識組的全節點需要驗證接力交易的合法性,因此需要持續接收並儲存支付方分組的所有區塊頭部資料。每筆交易最多可跨越2個分組,隨著系統生態的繁榮、分組數量的增大,不跨分組的交易佔比逐漸趨零,因此由N個分組構成的系統,和不分組的單一系統相比,全賬本資料量增長到約2N倍,交易吞吐量與TPS提高到約N/2倍。為了確保分組安全性,Monoxide引入了連弩挖礦:礦工節點可以利用一次成功的挖礦運算,同時為多個分組生產區塊,多個分組共享全網算力,而不是各個分組獨自佔用一份算力,避免算力分散並確保分組安全和全網安全的等價性。對於礦工來說,執行連弩挖礦,更需要儲存所有分組的賬本,礦工必須確保自己正在擴充套件的各個分組賬本不與其他分組賬本的資料發生衝突、各個分組賬本資料必須是互相融洽的(比如跨分組的Alice(-X)和Bob(+X)),然後才能根據Nakamoto或GHOST繼續進行擴充套件。因此Monoxide雖然對賬本進行了形式上的分片和隔離,但實際上礦工節點仍需獲取所有分組賬本,並構造「全賬本」,對於專業的礦池來說,這並不是問題。專業的礦池為了提高算力利用率,必然會同時接入所有的共識組P2P網路,同時加入所有共識組執行連弩挖礦。連弩挖礦的工作原理:在區塊鏈技術中,一般以Merkle Tree的形式組織多筆交易,但實際上Merkle Tree可被用於組織任何資料條目。在連弩挖礦的設計中,礦工M可以同時生產多個分組的區塊,並將這些分組的區塊頭部用Merkle Tree組織起來,結合Root及其他相關引數進行統一的挖礦計算,一旦找到符合任一分組挖礦難度要求的解,就可以立即將「挖礦結果、Merkle Tree路徑、分組區塊 」廣播到該分組的P2P網路,並繼續執行挖礦運算,以求取符合其他分組難度要求的解。不同分組的挖礦難度最終會收斂到同等級別,因為在各個分組區塊獎勵相同的情況下,算力資源必然優加入挖礦難度低的分組中執行挖礦以獲取最高收益,這必然會抹平不同分組的挖礦難度差異。因此連弩挖礦有很大的概率“不連弩”,或許只找到一個有效解即可同時滿足所有分組的挖礦難度要求。Monoxide的可選最佳化項:在Monoxide系統中,礦工節點大概率會加入所有分組的P2P網路中,並儲存所有分組的區塊資料。而對於不執行挖礦運算、但需要執行資料驗證的的分組全節點來說,也必須加入所有分組網路,以獲取其他分組的區塊頭部資料,否則將無法驗證接力交易的合法性,這是不太合理的。可以考慮用N+1的分組方案解決這個問題:額外建立1個公共的P2P網路,用於廣播所有分組的區塊頭部資料,任一分組的全節點只需加入2個網路:自身分組網路與這個公共網路,這就極大地簡化了原先的N個分組之間的N*(N-1)/2個雙邊關係。
對Monoxide的幾點改進(或改造)思考
1)Monoxide按照賬戶地址的前k個位元,劃分出2^k個分組。而我認為可以有其他的可選分組方案:讓使用者自主選擇一個共識組,用這個共識組的編號作為字首修飾自己的地址,比如XYZ.abcdefg,XYZ是分組編號,abcdefg是使用者透過公鑰計算出的通用地址。整個系統可根據發展情況,逐步增加新的共識組,而不用提前規劃好一個固定的共識組數量。這樣也有利於錢包商部署自己的全節點,由錢包商APPx生成的地址,可以劃歸到APPx字首下,比如XYZ.APPx.abcdefg,類似於每個銀行賬號都有該銀行的固定字首一樣。錢包商APPx將自己的使用者全部劃歸到XYZ共識組下,可更方便地部署運維全節點,更好地為使用者提供查詢與交易廣播服務。
2)Monoxide擁有自己的智慧合約程式設計模型Oxidation,但我不太喜歡這個模型。因此我進行了一些腦洞思考:既然Monoxide採用了非同步共識組的分片機制,則可將所用智慧合約獨立編址,劃分到專用的一個或多個特殊共識組中,可稱其為「圖靈共識組」,可更方便地處理使用者與使用者之間的轉賬,以及使用者與合約之間的互動。普通共識組可以採用UTXO模型,而圖靈組可採用Account-Balance(Key-Value)模型。比如下圖中的紫色的ACZ8為圖靈共識組,專門負責執行智慧合約,每一個使用者普通賬戶除了在自己的共識組中有餘額,在圖靈共識組中可能也會有餘額(因為智慧合約在執行過程中會給某些相關賬戶存款,其額度可能非常小)。因此可以讓圖靈共識組中的對應餘額必須積累到一定數額後清零,然後才能生成接力交易,並廣播到該賬戶所屬的普通共識組中去,以顯著減少圖靈組與其他分組的互動次數。圖靈組也可能採用PoS、DPoS、PBFT之類的共識,而不採用PoW,並且最好具備狀態最終性,而不是概率最終性,這樣更有利於設計和實現高效的DAPP。
更多區塊鏈資訊:www.qukuaiwang.com.cn/news