談談自己對鉑鏈(Bottos)的看法和分析

首次接觸和第一印象

第一次接觸鉑鏈是在初鏈羣中被鉑鏈羣管拉進技術羣時開始的。鉑鏈對我來說印象最深的還是他那長達70多頁的白皮書。作爲一條主攻AI領域的專用公鏈,我在還沒開始看鉑鏈項目代碼時就設想鉑鏈對於AI部分的處理應該是在區塊鏈內部構建一個運行AI運算的基礎設施模塊,再由區塊鏈完成AI模塊產出數據的確權,AI的運算可能將一部分交由智能合約處理,做到運算和數據雙雙上鍊。AI計算天生是構建在大數據之上的,可以將大數據比作糧食,AI比作野獸,野獸只有在充分進食後才能進化,所以如果AI運算的基礎設施和區塊鏈整合在一起那區塊鏈一定會大數據緊密結合,區塊鏈如果和大數據緊密結合那對於數據存儲這一塊兒的要求就非常高了,數據分片技術可能會成爲一個瓶頸。AI+大數據+區塊鏈?再加上那70多頁的白皮書?基於以上猜想,我對鉑鏈充滿好奇。在進入鉑鏈技術羣之後,我就從GitHub上下載了鉑鏈的代碼,花了一個星期左右的時間看完了絕大部分代碼,也發現了一些小BUG和不足,目前的感受是鉑鏈的代碼其實寫得挺好的,看得出來是在一個經驗豐富的架構師的帶領下發起的項目,但在架構設計上和我之前對鉑鏈的設想有明顯的出入,我並未看到任何和AI相關的代碼,也未發現對於數據儲存這一塊兒有明顯亮眼的處理。

重新整理對“AI+區塊鏈”的認知

在鉑鏈技術羣裏發表了自己對鉑鏈架構設計的看法,也得到了鉑鏈開發者的迴應,這才認識到自己對“AI+區塊鏈”的認知存在偏差。“AI+區塊鏈”其實並不是將AI和區塊鏈整合在一起,AI構建在大數據之上,而區塊鏈則是作爲AI在數據確權和分享上的一種延申。根據 《Blockchain —構建新一代的人工智能生態系統(http://www.blockchainbrother.com/article/1024)》 這篇文章的描述,AI的發展歸咎於算力、算法和數據這三個核心因素。AI算法在上世紀就已被研究透徹,但當時AI並未發展起來的原因正是算力和數據的缺失。在21世紀的今天,CPU/GPU的算力依據摩爾定律(甚至超過摩爾定律)在增長,互聯網的發展加快了社會進步的節奏,以往在線下堆積的數據也逐漸搬到了線上,大數據和雲計算的出現更是讓AI在算力和數據上的不足得以彌補,所以近幾年AI領域出現了爆發式地增長:算法一直都有,現在算力和數據也跟上了,AI發展的三要素也都集齊了。雖然算力和數據跟上了,但也只是在“量”上粗暴地增加了而已,在算力共享、數據交換和數據確權等“質”的轉變上,由於區塊鏈的出現也迎來了轉機。區塊鏈構建在密碼學基礎上的數字身份讓數據天然的具有“身份”屬性,其去中心化的特性也讓數據的流轉脫離了中心化的束縛而變得更加高效。數據具有身份驗證而且流通更快,這讓AI產生的數據更具價值,再配合上區塊鏈網絡龐大的協同計算能力,AI的運轉速度無疑將更上一個臺階。所以我想,像鉑鏈這樣主打AI的區塊鏈,更多的還是爲現有的AI體系提供數據上鍊和分享服務,而並不是構建一個獨立的AI生態系統,如果是這樣,那以後跨鏈通信應該會是這些主攻AI市場的區塊鏈所應該具備的功能。

鉑鏈代碼的簡單分析

> 高併發框架

鉑鏈代碼由Go語言編寫,代碼結構比較清晰,代碼質量和原創程度都比較高,沒有看到明顯抄襲的痕跡。鉑鏈主體採用高併發的Actor模型構建,由ProtoActor.Go實現。鉑鏈將API服務(Api)、鏈處理(Chain)、P2P網絡處理(Net)、區塊生產(Producer)、交易處理(Transaction)和可選的MongoDB服務(OptionDB)抽象爲對應的Actor模型:

  • API服務:以RPC(遠程過程調用)的形式對外提供API服務,與鉑鏈的消息交互採用Protobuf編碼,天然支持由多種語言編寫的外部應用程序
  • 鏈處理:實現鉑鏈的區塊鏈數據庫功能,包括區塊查詢、交易查詢、區塊接收與廣播和鏈信息查詢功能
  • P2P網絡處理:實現交易和區塊在P2P網絡中的傳播功能
  • 區塊生產:每500毫秒檢測一次自己是否是當前區塊的生產者,是的話就構建一個區塊併發送給“鏈處理”處理
  • 交易處理:從終端或P2P網絡接收交易放入交易池,並將交易發送給“P2P網絡處理”處理,支持獲取所有可加入區塊的交易和交易的移除操作
  • MongoDB服務:MongoDB服務作爲一個可選服務,可在配置文件中配置是否啓用,啓用MongoDB服務後可以將區塊寫入MongoDB中

每一個Actor對應一個線程,完全獨立地運行,與外部隔離。Actor之間的交互手段採用消息通信地方式,只有通過發送消息才能改變一個Actor的內部狀態。鉑鏈使用Actor模型讓幾個可以獨立運行的模塊在高併發的環境下併發運行,在數據量大的環境中運行效率應該會有比較明顯的提升。

> RESTFUL化服務

幾乎每一個區塊鏈項目都提供了基於Http的Restful接口,提供Restful化的接口可以提供統一的接口調用規則,適合讓區塊鏈服務器同時服務多種類型的終端,其中一些終端就包括區塊鏈瀏覽器和在線錢包。鉑鏈的Restful服務提供查詢區塊、交易和賬戶的服務,也提供發送交易、獲取合約ABI(應用程序二進制接口)和合約代碼的服務,鉑鏈的命令行客戶端就使用Restful接口與區塊鏈通信。

> 數據庫持久化服務

除開像MongoDB這樣的分佈式數據庫外,鉑鏈還使用了另外兩個嵌入式數據庫,分別是LevelDB和BuntDB。以太坊中也使用LevelDB爲數據持久化提供服務,由於以太坊採用特殊的MPT字典樹結構儲存狀態,所以每個樹節點的值都可以鍵值對的形式儲存在LevelDB中。鉑鏈採用的區塊儲存結構非常簡單,就是普通的二進制序列,所以對於區塊和區塊頭的增刪查改就交由像LevelDB這樣的以鍵值對形式組織的非結構化數據庫來做,非常方便。BuntDB是用Go語言編寫的內存數據庫,類似於Redis和Memcache,提供數據持久化和查詢功能,支持結構化查詢,鉑鏈使用它完成賬戶的存儲和結構化查詢操作。由於鉑鏈採用DPOS作爲其共識算法,經常需要對投票賬戶進行排序,所以使用BuntDB這類的提供結構化查詢服務的數據庫是一個不錯的選擇,而且BuntDB是個內存數據庫,所以也不需要再額外使用緩存保存頻繁查找的數據,直接用就行:

  • MongoDB數據庫: 以可選插件形式存在的Actor模塊,主要用於持久化保存鏈上的區塊,還提供轉賬和創建賬戶兩個內置的合約功能,和LevelDB功能重疊,但作爲一個本身就提供數據分片存儲功能的主從分佈式數據庫,可能在以後區塊數據激增的情況下接替部分LevelDB的功能,爲鉑鏈提供一個數據分片的解決方案。
  • LevelDB數據庫:以鍵值對的形式爲區塊鏈提供區塊存儲和查找功能,以哈希作爲鍵,以BPL(Bottos-Pack-Library,鉑鏈自研二進制編解碼庫)編碼作爲值,但需要配合LruCache爲其提供輔助的數據緩存服務
  • BuntDB數據庫:內存數據庫高效存取,不需要提供數據緩存服務,並且還支持結構化查詢和回滾操作,特別適合需要頻繁存取和排序查找的賬戶數據的存儲

> P2P網絡節點發現機制

不同於基於POW共識設計的區塊鏈,基於DPOS共識設計的區塊鏈由於可能存在固定的代理人節點,所以在區塊鏈的對等網絡中,對節點發現機制的複雜度要求就沒那麼高。很多基於POW共識算法設計的區塊鏈在節點發現機制上採用DHT(分佈式哈希表)系列算法,比如初鏈就採用Kadelima作爲其節點發現機制的算法,按照距離讓節點在對等網絡中均勻排布,以最大化優化消息在網絡中的傳播效率,爲了實現內網穿透,一般採用UDP協議建立連接,而鉑鏈則自研了一套基本能用的節點發現算法,節點之間採用TCP協議連接。在鉑鏈的節點發現算法中,存在三個層次的角色,分別是Neighbors、Candidates和Runners,在配置文件中預配置的種子節點列表則首先放入Neighbors層次中。節點在三個層次之間通過Discover模塊驅動流轉,其中Runners層次中的節點通過KeepAlive模塊完成心跳檢測。具體的發現機制如下:

  • 角色介紹:
    a) Neighbors層次:處在該層次的節點都是鄰居,所有在Neighbors層次中的節點都沒有與其建立連接,都以IP和端口等節點信息的形式存儲,處在該層次的節點通過Discover模塊與本節點建立連接後被提升至Candidates層次成爲候選者節點
    b) Candidates層次:處在該層次的節點都是候選者,本節點與所有候選者節點都已經建立了TCP連接,在連接建立後會立即開啓三次握手流程,在雙方都已達到最後一次握手流程時會互相將對方提升至Runners層次成爲連接者
    c) Runners層次:處在改層次的節點都是正式的連接者,所有的P2P通信都會通過他們進行轉發,也會通過他們完成接收,可廣播也可單播。
  • 流程介紹:
    A) 從配置文件中讀取所有種子節點的IP和端口等信息,全部放入Neighbors層次中
    B) Discover模塊每5秒從Neighbors層次中取出10個節點信息並嘗試建立TCP連接,連接成功後將節點從Neighbors層次中移除並放入Candidates層次中
    C) 每5秒中向所有處於Candidates層次中的節點開啓三次握手流程並將對應節點的握手計數器加1,如果超過10次握手都沒有成功那直接關閉和該節點的連接,然後將節點從Candidates層次中移除
    D) 在三次握手流程結束後將節點從Candidates層次中移除並放入Runners層次中並初始化該節點的心跳計數
    E) KeepAlive模塊每10秒向所有處於Runners層次中的節點發送一次Ping、Pong心跳檢測,在收到Pong消息後將對應節點的心跳計數加1
    F) 在終端啓動之後的前三個8秒中向所有處於Runners層次中的節點索要他們的Runners層次中的所有節點信息,將這些節點信息全部傳回本節點,然後放入本節點的Neighbors層次中
    G) 在終端啓動之後的第三個8秒之後的每8秒向最新加入Runners層次中的節點所要他的Runners層次中的所有節點信息,將這些節點信息全部傳回本節點,然後放入本節點的Neighbors層次中
    H) KeepAlive模塊每40秒檢測一次在Runners層次中的節點的心跳狀態,將所有心跳計數爲0的節點從Runners層次中移除,關閉和他們的連接,然後放入Neighbors層次中

> DPOS共識算法

作爲摻雜了“人治”因素的共識算法,DPOS共識算法也像POW共識算法那樣飽受爭議,POW共識算法在挖礦算法設計不當的情況下,容易催生ASIC專用礦機從而在人性“逐利”的驅使下導致算力逐步集中爲礦池,導致去中心化程度明顯降低。針對目前POW共識算法的不足,DPOS共識算法並沒有給出一個優化方案,比如基於抗ASIC專用礦機挖礦算法的POW共識算法優化(比如初鏈就設計了一套抗ASIC專用礦機的挖礦算法),而是基於目前無法做到完全去中心化的事實,設計出一套從一開始就摒棄追求完全去中心化的初衷,以犧牲去中心化程度爲代價來換取區塊鏈性能提升的基於“人治”的共識算法。DPOS共識算法涉及代理人節點的競選、投票和換屆,獲得投票數量排前幾位的競選者將在當前的代理人換屆週期內被提升爲正式的區塊生產代理人節點,即記賬節點。每一個代理人節點都會在換屆週期內被分配一個出塊時間槽,輪到你出塊時就必須在當前時間槽內完成區塊的生成和廣播,不然就會被記錄爲錯過一次出塊任務,這個記錄會廣播給全網,其他節點在收到這些記錄信息後自然也能權衡在下次代理人換屆時是否還繼續給你投票。每一個節點都可以參與代理人競選,不過有沒有節點給你投票那就不是你能決定的了,人都有惰性和從衆心理,獲票數量始終在前的代理人節點會在頭部效應的影響下,地位越來越穩固,留給其他“小白節點”的機會就會越來越少,除非他們“資金”雄厚。DPOS共識算法會是在區塊鏈去中心化程度和運行效率的折中權衡下的一箇中長期共識方案,但一定不會是公鏈的最終共識形態。DPOS共識算法適合那種需要由人或社區去維護運行在區塊鏈之上的產品的專用公鏈,這些產品質量維護的好壞程度很難用算法去衡量其背後的工作量,但使用這些產品的用戶卻能深切感受到,在這種環境下設計的區塊鏈適合選用DPOS作爲其共識算法,因爲既然只能由人去確認區塊鏈的運行狀況,那“人治”就是不可避免的也是十分必要的一個環節,比如觸控科技的BCX區塊鏈遊戲引擎項目就是一個很好的例子。BCX區塊鏈採用DPOS共識算法,專爲區塊鏈遊戲生態打造,如果人人都能參與區塊鏈遊戲的維護,都有權力爲遊戲添加更多好玩的元素,那遊戲是否好玩就需要由玩家去鑑定,玩家會一直把票投給能讓遊戲真正變得好玩的維護者讓他們變成代理人,這些代理人一旦作惡讓遊戲變得不好玩或者不平衡,玩家自然不會再把票投給他們。扯了那麼多都沒有講鉑鏈DPOS共識算法的運行過程,鉑鏈團隊設計的DPOS共識算法和傳統的DPOS共識算法基本相同,沒有太大的出入,最多就調整了下代理人的選取規則。不過目前鉑鏈還處在測試階段,共識流程爲測試網絡中的流程,在正式網絡發佈後應該會有完善和變更。測試網絡中的共識流程如下:

a) 節點在區塊鏈初始化時創建Bottos內置合約賬戶並注入大量資金,如果Bottos合約賬戶已存在則跳過此步驟
b) 通過向區塊鏈發送合約交易調用內置合約代碼,與共識相關的內置合約功能包括創建賬戶、交易轉賬、劃撥權益、註冊代理人競選和代理人投票
c) 節點先發送“創建賬戶”的交易創建密鑰賬戶、餘額賬戶和權益賬戶,然後發送“交易轉賬”交易從Bottos內置賬戶中索取需要的轉賬金額填充餘額賬戶,再發送“劃撥權益”交易將資金從餘額賬戶劃撥至權益賬戶,最後發送“註冊代理人競選”交易創建代理人投票賬戶
d) 以上所有交易都會進行全網廣播並執行對應的合約功能,這樣全網所有節點都能看到任意一個節點創建的代理人投票賬戶,他們可以選擇給指定的代理人投票賬戶投票,通過發送“代理人投票”交易將權益賬戶中的餘額用來更新指定註冊競選代理人的投票狀態
e) 每29個區塊完成一次代理人換屆,所有節點在收到區塊編號是29的倍數的區塊時開啓代理人換屆流程,從所有代理人投票賬戶中選取28個票數最高的賬戶和1個剩餘完成時間最小的賬戶,將這29個賬戶隨機打亂後就成爲本屆的出塊代理人賬戶名單
f) 根據節點的系統時間獲得當前的出塊槽位(Slot),再根據出塊槽位從29個代理人賬戶中選取對應槽位下的代理人賬戶,如果該賬戶在節點的本地賬戶名單中,那麼在代理人參與率和出塊調度時間都達標的情況下,本節點會被指定爲當前時間段內的出塊人,在立即將交易打包進區塊並全網廣播後完成本輪出塊任務
g) 在目前的測試網絡中,節點在出塊後並沒有分配相應的記賬獎勵,鏈上所有的資金都來自於初始化的Bottos內置合約賬戶中,該賬戶具有非常龐大的資金儲備,足夠在測試網絡中使用,在正式網絡中將完善整個獎勵過程

> 智能合約和WASM虛擬機

同以太坊類似,鉑鏈也具有普通賬戶和合約賬戶兩種賬戶類型。在鉑鏈中,普通賬戶和合約賬戶都使用同樣一個數據結構,在普通賬戶的基礎上爲其部署智能合約代碼和ABI數據(可選),那普通賬戶就算是一個合約賬戶了。鉑鏈的智能合約模塊主要爲內置的合約賬戶服務,該內置合約賬戶名爲“Bottos”,包含多種基礎的合約方法,像創建賬戶、交易轉賬、部署智能合約代碼和部署ABI數據等方法都實現在該合約裏,“Bottos”內置合約也是唯一一個在鉑鏈中使用ABI來爲合約方法的調用參數進行解碼的智能合約,因爲在WASM虛擬機中並未看到有對合約參數進行解碼的操作,這可能是因爲目前鉑鏈還處在測試階段的原因,也可能是WASM虛擬機在運行合約方法時不需要從外部提供調用參數。在鉑鏈裏所有的交易都是在調用智能合約裏的方法,像最基本的交易轉賬等功能也都是由內置合約方法實現。節點在執行一個交易時會先判斷交易觸發的合約方法是否爲內置合約方法,如果是則解碼交易中附帶的調用參數,然後調用該內置合約方法,比如交易轉賬,如果不是那麼就交給WASM虛擬機處理,WASM虛擬機會從交易指定的合約賬戶中查詢部署的智能合約代碼,在解析完合約代碼後就會開始運行交易中指定的合約方法,如果方法執行完畢後還發現有子交易未處理,那麼就繼續遞歸地執行下去,但遞歸深度不能超過10。鉑鏈會使用WASM字節碼作爲合約代碼應該是參考了EOS的設計,WASM全名爲WebAssemly,是一個能被瀏覽器解析執行的字節碼數據,目的是爲了解決JavaScript在瀏覽器中運行過慢的問題。WASM最亮眼的特點就是支持將多種語言編寫的程序代碼編譯爲WASM字節碼,這其中就包括C/C++、C#、Java、JS等語言。相比於以太坊單一的Solidity智能合約語言,WASM能讓區塊鏈支持多種語言編寫智能合約代碼,這無疑會極大地豐富區塊鏈的應用生態,也是下一代區塊鏈的基本要求。扯了那麼多還是羅列下鉑鏈處理智能合約的基本流程:

a) 從交易中取出合約賬戶、合約方法和合約參數三個數據,判斷合約賬號和合約方法是否屬於內置合約
b) 如果是,則依據合約方法內置的ABI結構解析合約參數,將解析出來的參數傳遞給對應的內建函數並調用執行,交易執行完畢
c) 如果不是,則依據合約賬戶從數據庫中取出部署在該賬戶下的合約代碼,創建WASM虛擬機並解析合約代碼,找到合約代碼中的入口函數“Start”和合約方法地址,將方法的地址傳入入口函數執行,如果在執行後存在子交易要處理,則回到第一步繼續遞歸處理直到再無子交易或遞歸深度超過10爲止,否則交易執行完畢

> 總結

鉑鏈的標籤就是“DPOS+WASM”,這不禁讓人聯想到EOS,可能鉑鏈就是在對標EOS,只不過更加關注AI領域,但再造一個EOS真的有意義嗎?目前鉑鏈公開的代碼還在測試網絡中運行,期待後續跟進的Beta版主網代碼,可能會有相當大程度的改進,到時候我們再一一解析吧。希望這篇文章能讓你更進一步地理解鉑鏈(Bottos)的設計和追求的目標,目前鉑鏈的代碼已可在GitHub上下載,上去搜“Bottos”就能找到,如果你對鉑鏈感興趣,不妨閱讀下他們的代碼,相信你一定會有所收穫的。相比於以太坊和EOS,鉑鏈的代碼應該更基礎也更容易閱讀,對於急切需要了解區塊鏈設計全貌的朋友來說是個不錯的切入點。再者,加入鉑鏈社區也是一個瞭解區塊鏈社區生態的不錯的選擇,社區裏會時不時地發佈一些有償的任務或無償的培訓計劃,讓社員在社區的激勵下逐步瞭解一款區塊鏈產品。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章