1. 程式人生 > >chain33 區塊鏈開發框架誕生記

chain33 區塊鏈開發框架誕生記

 

chain33 誕生記

很多年沒有寫部落格了,應該說,自從2013年開始玩比特幣,就沒有寫過了。這5年來,做了很多事情,也見了很多以前做夢都沒有想到過都事情。我做的最開心的事情,也是覺得最有意義的事情,就是負責開發了一個區塊鏈開發框架 chain33 ,目前這個框架已經在 github 上開源,開源地址是: https://github.com/33cn/chain33
歡迎大家點star,fork。

從2013年開始研究比特幣,後來到了2015年,開始看以太坊到程式碼。到了2016年,我們又研究了 tendermint 和 fabric,最終,我們還是決定要自己從頭開發。主要原因有兩個。這些軟體在設計到時候,沒有考慮到,像我們公司一樣要做深度定製的情況,比如,我要改變一下mempool的排隊方式,那麼,我必須要修改核心的程式碼,過一段時間,他們也升級了,然後我們開始合併程式碼,很多時候,系統會變的不相容。所以,我們一開始的目標就是做一個別人可以對核心做二次開發的區塊鏈系統,而不是隻是一個可以開發dapp的系統。還有一個原因是,我們對區塊的理解和這些系統的理解有一定的不同,所以,我們希望自主開發一個系統,有自己的智慧財產權是非常重要的,目前這個系統已經申請了接近200個專利。

當然,開發一個區塊鏈系統,實際上要比我們想像的複雜。在用別人系統的時候,我們總覺得別人的系統寫的不好,這個不好用,那個不好用,但是,真到了我們自己要重新構造整個系統的時候,我們發現,我們一開始問題想的太簡單了,構造一個系統需要有自己的世界觀,需要有對本質的洞悉。比如最簡單的,如何對待交易與交易的關係,以及合約與合約的關係。可以從一個小例子看一下區塊鏈的世界觀問題,點選連結檢視:
交易組

總結來說,整個開發過程可以分成三個階段:

第一個階段

一開始,我們就5個人,如果目標定的非常大,那麼肯定實現遙遙無期。於是我們開始第一個版本的開發,實現一個簡單的公鏈系統,不考慮複用,不考慮二次開發,而是就實現功能,用最快的速度。這個版本大概開發了3個月,就開始測試了,最後我們發現測試時間也花了三個月,bug特別多,很多模組很難測試,比如P2P 模組。這個階段,我們做對了很多事情,也做錯了不少事情。對的事情,就是我們一開始設計了一個 基於訊息傳遞的架構。可以簡單的用下面這個圖表示:

image

就是所有的模組通過一個訊息佇列通訊,而不是直接互相呼叫。當然,對於一個單機系統,可以用一個記憶體的訊息佇列,而對一個分散式系統,可以用真的訊息佇列系統。訊息佇列不僅僅解決了耦合的問題,還有一個非常重要,就是整個系統的構建是基於一套訊息協議的,而不會依賴具體的實現,這樣,第三方實現者只要實現一個模組的訊息協議,就可以直接替換掉這個模組,這個對二次開發非常有用。而且,它很容易讓區塊鏈系統可以分散式部署,解決單機系統性能瓶頸問題。當然,做的比較不好的地方,就是為了趕工期,對軟體質量的要求稍微低了一點,這也引起了測試時間太長,bug不容易被及時發現的問題。

第二階段

開發這個階段的時候,市場行情還算可以,我們資金也比較充沛,這個時候,開發人員開始增加到50人左右(有杭州,上海,南京)三個團隊,而且都是非常資深的後端開發人員,管理和組織工作不能像原來一樣簡單了,否則開發效率會大大降低。這個階段,我們做了devops的改造,配置了一套 gitlab + jira + jenkins 的系統。我們做了部分的模組化的工作,並且分成了兩個組,一個主要是公鏈方向的開發,一個是聯盟鏈方向的開發。這個階段的主要成就就是實現了 交易組 和 平行鏈的概念,平行鏈的概念其實非常簡單,那就是,用一條公鏈處理通用的資料的存證部分,使用者自己的平行鏈來處理具體的業務邏輯。如圖表示:
image


主鏈因為只有非常少的內建業務邏輯,所以,非常簡單,也很容易實現分片,而平行鏈上的節點不會非常多,類似eos一樣二十來個節點,它的升級就會非常的方便。同時,交易組的實現,也改變了傳統區塊鏈系統中交易都是獨立情況。

第三階段

這個階段的開發模式沒有什麼變化,但是,我們在開發的過程中發現,關鍵不是上面敏捷或者devops,而是在架構上保證,每個人可以做相對獨立的工作,不會相互影響。理論上來說,因為存在協作,所以效率一定會降低,不管用什麼方法,協作一定會大大的降低開發效率。當然,協作是不可避免的,但是,我們可以在架構上保證這個協作儘量的少。得益於我們第一階段的設計,系統模組本身就是互相獨立的,但是,這個粒度上是遠遠不夠的,使用者希望根據自己的需求,改造某個點,比如增加一種共識模式,增加一種簽名方式,增加一種mempool的排隊模式,所有的這些需求,都應該符合開閉原則,也就是說,不能通過修改我們的系統核心來實現,而是通過增加新的外掛來實現。如下圖表示:
image
核心非常小,基本上每個點,都可以通過可插拔都模式替換掉。我們開發了一些工具,幫助大家快速開發外掛,而且最關鍵都一點,使用者開發好都外掛可以分享給別人使用,這個也是我們開發chain33的目標,大家停止製造重複的輪子,可以像分享url一樣簡單都分享自己都勞動成果。隨著,大家在chain33核心上不斷開發出新的功能,chain33 會越來越強大,它的強大,會讓大部分人放棄自主開發自己的區塊鏈系統。

目前我們已經開源了大部分的外掛。開源地址:https://github.com/33cn/plugin

下面列舉一下主要的外掛:

共識部分:

  • pbft(聯盟鏈,beta)
  • tendermint(聯盟鏈)
  • raft(私有鏈)
  • ticket(公鏈)
  • solo (測試鏈)

加密部分:

  • sep256k1 (bitcoin, ethereum)
  • ed25519 (tendermint,sc)
  • sm2 (國密支援)

store:

  • mavl (tendermint 提供的後端資料儲存方式)
  • mpt (以太坊提供的資料儲存方式)
  • kvmvcc(目前效能最高的區塊鏈後端儲存方法)

執行器部分:

  • evm (以太坊虛擬機器支援)
  • wasm (目前沒有開源)
  • cert (聯盟鏈許可權管理)
  • hashlock (hash鎖定,和btc,eth 跨鏈使用)
  • paracross (平行鏈,注意,平行鏈只是我們的一個外掛,可見核心非常的小)
  • privacy (類似門羅幣的隱私保護實現,這個例子可以好好學習一下,它顯示我們系統可擴充套件性的強大,門羅幣是utxo模型,但是也可以在我們系統裡面相容 賬戶模型)
  • trade (內建一個幣幣交易所,可以支援鏈上所有資產的交易)
  • 遊戲(牛牛,時時彩,石頭剪刀布 …)

還有一點,我們為了公平的實現博彩遊戲,在共識的級別加入隨機數的概念,這個是目前區塊鏈系統無法做到的。最近eos經常被攻擊,就是因為這一點,共識節點可以隨意控制這個隨機數。

任何一個程式設計師,不管有沒有區塊鏈開發經驗,都可以加入我們都開源社群,目前社群中有一批非常有經驗都開發人員,可以給大家提供幫助。