系統(tǒng)設(shè)計(jì)
Fabric系統(tǒng)主要由兩個(gè)應(yīng)用構(gòu)成:Orderer和Peer,其中Orderer負(fù)責(zé)交易共識(shí)并生成區(qū)塊,Peer節(jié)點(diǎn)負(fù)責(zé)模擬執(zhí)行交易和記賬。這種劃分可以使整個(gè)平臺(tái)擁有更好的彈性和擴(kuò)展性。
Peer和Orderer都是模塊化設(shè)計(jì),重要模塊支持插拔,比如共識(shí)機(jī)制、合約執(zhí)行環(huán)境、加密算法、證書(shū)服務(wù)模塊等。模塊化的設(shè)計(jì)讓企業(yè)可以利用現(xiàn)有IT設(shè)施來(lái)替換部分Fabric模塊。
Fabric架構(gòu)如下圖:

證書(shū)服務(wù)——共建信任
上圖中最左邊是證書(shū)服務(wù)系統(tǒng),主要提供會(huì)員注冊(cè)和證書(shū)頒發(fā)功能,F(xiàn)abric系統(tǒng)的參與方都必須經(jīng)過(guò)授權(quán),比如Orderer、Peer、Client等都需要擁有受信任的證書(shū)。
證書(shū)一方面用于系統(tǒng)接入,另一方面用于交易簽名。所以統(tǒng)一的證書(shū)服務(wù)非常重要。
會(huì)員證書(shū)又分為注冊(cè)證書(shū)和交易證書(shū),注冊(cè)證書(shū)與會(huì)員信息關(guān)聯(lián)在一起,用于標(biāo)識(shí)會(huì)員的身份,在必要的時(shí)候,還可以支持監(jiān)管和審計(jì);交易證書(shū)用于交易簽名,之所以交易要用不同的證書(shū),是為了避免會(huì)員的個(gè)人信息和交易信息被泄露,比如交易內(nèi)容或者多筆交易之間的關(guān)聯(lián)關(guān)系等,另外交易證書(shū)可以申請(qǐng)多份,甚至可以為每一筆交易申請(qǐng)一份交易證書(shū)。
共識(shí)網(wǎng)絡(luò)——獨(dú)特何在
上圖中最右側(cè)為區(qū)塊鏈共識(shí)網(wǎng)絡(luò),由Orderer集群組成,用于交易共識(shí)并生成區(qū)塊。區(qū)塊鏈?zhǔn)侨ブ行幕?,意味著需要多方一起參與交易排序,生成區(qū)塊。
Orderer目前支持SBFT和Kafka兩種共識(shí)機(jī)制,其中SBFT是拜占庭容錯(cuò)算法PBFT的簡(jiǎn)化版,能夠容忍部分節(jié)點(diǎn)故障,Kafka是一個(gè)中心化的排隊(duì)服務(wù),能提供更高的性能,兩種共識(shí)算法分別適用于不同的場(chǎng)景,用戶(hù)還可以定制自己的共識(shí)模塊。
和其他區(qū)塊鏈系統(tǒng)不同的是,交易共識(shí)在Fabric中被獨(dú)立成為單獨(dú)的系統(tǒng),這樣一來(lái),參與共識(shí)的節(jié)點(diǎn)數(shù)變少,共識(shí)速度得到提高,F(xiàn)abric的共識(shí)網(wǎng)絡(luò)支持多鏈,即多個(gè)區(qū)塊鏈賬本可以共用同一張共識(shí)網(wǎng)絡(luò),降低系統(tǒng)部署和運(yùn)維成本。
區(qū)塊鏈節(jié)點(diǎn)——便捷調(diào)用
區(qū)塊鏈節(jié)點(diǎn)Peer主要功能是調(diào)用智能合約執(zhí)行交易和記賬。
智能合約
智能合約是運(yùn)行于區(qū)塊鏈上的應(yīng)用程序,F(xiàn)abric的智能合約稱(chēng)為鏈碼,分為系統(tǒng)鏈碼和用戶(hù)鏈碼,系統(tǒng)鏈碼用來(lái)實(shí)現(xiàn)系統(tǒng)層面的功能,包括系統(tǒng)的配置,用戶(hù)鏈碼的部署、升級(jí),用戶(hù)交易的簽名和驗(yàn)證策略等。用戶(hù)鏈碼實(shí)現(xiàn)用戶(hù)的應(yīng)用功能。
鏈碼被編譯成一個(gè)獨(dú)立的應(yīng)用程序,運(yùn)行于隔離的Docker容器中,在鏈碼部署的時(shí)候會(huì)自動(dòng)生成合約的Docker鏡像。
鏈碼支持采用Go、Java、Nodejs編寫(xiě),并提供相應(yīng)的中間層供鏈碼使用,鏈碼可以使用GetState和PutState接口和Peer節(jié)點(diǎn)通信,存取K-V數(shù)據(jù) 。
共享賬本
共享賬本包括區(qū)塊文件和K-V狀態(tài)數(shù)據(jù),區(qū)塊文件存儲(chǔ)在本地文件系統(tǒng),由Peer節(jié)點(diǎn)負(fù)責(zé)寫(xiě)入,文件內(nèi)容是排序后的區(qū)塊數(shù)據(jù),每個(gè)文件有大小限制,存儲(chǔ)一定數(shù)量的區(qū)塊,區(qū)塊由交易共識(shí)系統(tǒng)產(chǎn)生,包含一條或多條交易。
K-V狀態(tài)數(shù)據(jù)提供給鏈碼存取使用,采用LevelDB存儲(chǔ)。