本着「以教帶學,Learning by Doing」的想法,我於上週加入了Bob組織的HiBlock區塊鏈技術佈道羣。這個羣可不太好混,羣規要求每一個成員必需每週有輸出,連續兩次交白卷就要被踢出羣。html
在這樣的壓力之下,我決定開一個新坑:區塊鏈週週記,記錄下每週區塊鏈的學習成果和爬坑經驗。做爲系列的新篇章,我選擇從超級帳本的Fabric開始。java
我在以前的文章中曾說過會從超級帳本入手開始區塊鏈的學習和實踐,同時也給出了我的的理由。但做爲一篇佈道類文章,單單我的喜愛是沒有說服力的。node
在Fabric的文檔中,它強調了本身面向企業應用而生的理由:git
能夠看得出,相比起公鏈激進的作法,以Fabric爲表明的聯盟鏈要溫和的多,而且也容易爲企業所接受。加上其給出的若干限制,技術上的落地也相對容易不少。github
關於區塊鏈自己的理論和介紹,目前已經爛大街了,在此也就是再也不贅述。在本節,讓咱們來看看Fabric是如何經過主要組件完成技術落地的。數據庫
從大的方面講,Fabric的主要組件大體可劃分紅這幾個部分:編程
Fabric的分佈式帳本狀態由兩部分組成:世界狀態(World State)和區塊鏈。前者表明帳本的當前狀態,變動和查詢頻繁,每每以數據庫形式實現;後者則用來捕獲前者的每次變動,做爲交易的變動記錄,沒法修改且極少查詢,經常實現爲文件形式。網絡
對於世界狀態的DB載體,當前版本有兩個選擇:內置的LevelDB和外置的CouchDB,若是想要得到更靈活的查詢能力,選擇後者。由此你們應該能夠猜出:世界狀態中保存的數據是以KV對的形式存在。composer
對於區塊鏈來說,它以Block的hash鏈組成,每一個Block包含一組有序的交易。這個順序是交易順序,很是關鍵。框架
除了這兩個組件,Fabric還引入了一個獨特的設計:Channel,用來解決不一樣組織間的帳本共享問題。假如組織A同時與組織B和組織C作生意,而且組織B和組織C是競爭對手,那麼經過創建不一樣的Channel能夠實現A和B,A和C分別共享各自的帳本。利用Channel,很好地解決了常見的B2B場景。
Channel抽象出了業務參與方的溝通,可視爲業務網絡的子網,實現了交易的相互隔離和業務私密性。
Fabric的智能合約以「鏈碼(Chaincode)」的形式存在,外部客戶端利用它來完成對世界狀態的更改。與以太坊不一樣,鏈碼支持使用通用編程語言來書寫,當前版本支持Go和Node.js,但從Fabric Java SDK的源碼中能夠看出,離支持Java應該也不遠了:
public enum Type { JAVA, GO_LANG, NODE }
對於初學者須要注意的是:鏈碼 != Fabric SDK。前者運行於Fabric環境,執行業務邏輯。後者則由被客戶端程序用來與鏈碼完成交互。打個相似的比方:
由此可知,鏈碼自己其實是一個應用,其生命週期可分爲:package、install、instantiate、upgrade。一樣,鏈碼能夠綁定任意任意數量的Channel,並獨立運行。
關於鏈碼的教程,文檔已經給出了詳細的說明,在此就再也不囉嗦。
Fabric中有三類節點:
整個事務流程在文檔中有介紹:
從上面的流程能夠看出,Fabric的共識機制創建在endorsement policy之上,它能夠經過命令行參數進行配置,並不須要Channel的全部Peer參與。
成員服務負責參與方的身份許可和驗證,它創建於數字證書和信任鏈基礎之上。所謂成員,既能夠是組織(Org),也能夠是組織部門(OU)。Fabric的成員服務配置能夠出如今兩處:Local(節點)和Channel(Channel級)。
從開發角度來說,引入成員服務帶來的做用就是:若是應用(Client和Chaincode)要參與到區塊鏈網絡中,則須要相應簽名和證書。
老實講,從上面的簡單介紹已經看出,Fabric的開發並不簡單,它至少涉及:
這還不算完,如何測試也是一個大麻煩,相比起簡單的CRUD應用,光搭建Fabric的環境就讓人生畏。假如你對本身的要求更高點,想要實現一個持續集成環境,該怎麼辦?
此外,開發以後的運維成本也不會低,除了Fabric自己的基礎設施,鏈碼的平滑升級也對開發和運維提出了高標準。
鑑於這些麻煩的事情,假如你沒有辦法說服業務合做方也一樣部署一套Fabric,我以爲徹底沒有必要去基於它來開發應用。單組織內的區塊鏈應用,我我的認爲是一個僞命題,沒有存在的價值。
關於示例教程,Fabric的文檔已經給出了範例,各位能夠仔細閱讀。
爲了下降區塊鏈應用的開發難度,超級帳本項目又引入了Composer。其目的在於加速應用的開發和部署,目前已經支持Fabric,當前處於孵化階段。它創建在諸多框架和工具之上:
看起來很不錯!
對於一個初學者來說,寫這篇文章真不容易!如文章存在錯誤,不要客氣,只管指出,:)。關於下一週的週記,我會去寫一個實際的Fabric應用的例子,同時給出Composer的例子,請保持關注。
附註:在寫此文的過程當中,我還找到了一篇吐槽Fabric的文章,這裏一併給出連接,方便你們客觀評定。