在之前的文章我們已經介紹了快速在本地執行fabric,以及介紹了fabric的模型和工具(——linux環境下搭建hyperledger fabric(附流程**))。本次我們會手工執行fabric的工具,手動搭建乙個fabric網路,來鞏固和熟悉fabirc。
在開始搭建之前我們需要先提一下fabric的身份認證。之前我們說過fabric是支援安全認證的,而fabric的安全認證則是通過pki(public key infrastructure)方式認證的。
fabric預設採用業界比較普遍的x.509協議證書,同時這也是ssl證書普遍採用的格式。這套pki體系有以下四個關鍵要素:
有關pki體系的流程可以參考這篇文章(在整套pki體系中,最重要的莫過於ca了,ca機構必須具有權威性和公正性,所以在fabric網路中,直接內建了乙個fabric ca。但是注意,fabirc ca是可選元件,你完全可以自建ca或者直接使用第三方可靠的ca。
fabric ca的使用方式參考官方文件(
之前如果執行過官方的sample的話,會以指令碼的形式執行若干個docker容器,組建fabric網路。但是沒有什麼比自己動手搭建更快上手的了。在了解了fabric整個模型和執行方式之後,我們完全可以自己動手搭建乙個fabric網路。
fabric是聯盟鏈的解決方案,在聯盟鏈的成員中,必然存在組織這樣的概念。要加入fabric網路的組織必須有自己的身份標識。所以第一步我們必須為組織生成乙個證書,用於確認身份以及加密通訊。
fabric工具中就帶乙個cryptogen工具,用於快速批量生成組織證書。當然如果熟悉openssl的讀者完全可以用openssl直接生成x.509格式的證書。
/path/to/cryptogen showtemplate
複製**
可以顯示預設的證書模板,用於編寫配置參考,這個配置檔案也充滿了大量的注釋,幫助使用者理解配置檔案的含義。也可以直接把這個預設配置匯出來在此基礎之上修改:
/path/to/cryptogen showtemplate > template.yml
複製**
該工具使用的配置格式為yaml,乙個簡易的配置片段大致如下:
ordererorgs:
- name: orderer
domain: example.com
specs:
- hostname: orderer
peerorgs:
- name: org1
domain: org1.example.com
enablenodeous: false
複製**
之前我們說過,fabric網路中有三種節點orderer,peer,client,這裡就是直接生成order和peer節點配置的含義,每個ordererorgs或peerorgs下面的list配置大致包含以下幾個內容:
由於cryptogen工具預設帶有乙個模板配置檔案,因此我們可以直接用它來產生乙個orderer組織,兩個peer組織的證書:
$ cryptogen generate
org1.example.com
org2.example.com
複製**
產生的證書位於crypto-config/目錄下,直接用tree看看都產生了什麼玩意吧:
$ tree -l 3 crypto-config
crypto-config
├── ordererorganizations
│ └── example.com
│ ├── ca
│ ├── msp
│ ├── orderers
│ ├── tlsca
│ └── users
└── peerorganizations
├── org1.example.com
│ ├── ca
│ ├── msp
│ ├── peers
│ ├── tlsca
│ └── users
└── org2.example.com
├── ca
├── msp
├── peers
├── tlsca
└── users20 directories, 0 files
複製**
最後每個子目錄下面就是具體的證書檔案了,包含組織的證書,ca證書,管理員證書,以及使用者證書等等。所有的身份都是通過pki認證的。
當然我們也可以通過使用自己的配置,指定證書產生的目錄:
$ /path/to/cryptogen generate --config=config.yml --output=/path/to/outdir
複製**
第一次執行我們需要建立創世紀塊,以後交易我們需要記錄到區塊中,這些功能都可以通過configtxgen這個工具來完成。
這個工具就稍微有些繁瑣了,首先這個工具必須在當前目錄下找到乙個名為configtx.yaml的配置檔案,這個配置檔案裡面存放著各種各樣的profile。這個配置檔案的格式可以參考原始碼的範例。
configtxgen每次執行的時候必須有乙個*-profile引數,指明使用configtx.yaml哪個profile*,產生什麼樣的配置(比如創世紀塊,交易配置,peer配置等等)。
按照之前的sample執行的命令,應該是這樣:
$ /path/to/configtxgen -profile twoorgsorderergenesis -outputblock ./channel-artifacts/genesis.block
2018-05-27 21:28:28.501 cst [common/tools/configtxgen] main -> info 001 loading configuration
2018-05-27 21:28:28.522 cst [common/tools/configtxgen] dooutputblock -> info 002 generating genesis block
2018-05-27 21:28:28.524 cst [common/tools/configtxgen] dooutputblock -> info 003 writing genesis block
複製**
這條命令會在*./channel-artifacts/目錄下產生乙個genesis.block創世紀塊,注意./channel-artifacts/*目錄必須事先存在,否則會報錯。
交易的雙方必須加入同乙個channel,因此我們還需要產生乙個channel配置:
$ configtxgen -profile twoorgschannel -outputcreatechanneltx ./channel-artifacts/channel.tx -channelid mychannel
2018-05-27 21:32:10.966 cst [common/tools/configtxgen] main -> info 001 loading configuration
2018-05-27 21:32:10.978 cst [common/tools/configtxgen] dooutputchannelcreatetx -> info 002 generating new channel configtx
2018-05-27 21:32:11.050 cst [common/tools/configtxgen] dooutputchannelcreatetx -> info 003 writing new channel tx
複製**
按照終端日誌輸出,我們在*./channel-artifacts/產生了乙個channel.tx*。我們可以分別用*-inspectblock引數和-inspectchannelcreatetx引數分別跟上這兩個檔案,列印出區塊和channel的json*配置資訊。能看到正確的輸出,說明建立成功了。
其實這是我最想吐槽官方文件的地方,明知道應該用命令列工具peer和orderer啟動兩種型別的節點,但是官方文件卻隻字不提。甚至peer和orderer的命令列幫助文件也簡略到看了也不知道怎麼啟動。
目前在沒有仔細研究官方docker映象的前提下,只能通過docker啟動orderer和peer。
$ docker-compose -f docker-compose-cli.yaml up
複製**
這個docker-compose-cli.yaml檔案存在於*fabric-samples/first-network/*資料夾中。
好在官方比較良心的出了乙個composer工具,否則光執行網路節點這些步驟絕對能讓開發者敲桌。後續我們會逐步結合composer與官方文件的內容,講述利用composer簡化fabric網路的搭建、測試、部署流程。
Hyperledger Fabric網路節點架構
fabric網路節點的組成如下圖 客戶端必須連線到某乙個peer節點或者排序服務節點才可以與區塊鏈網路通訊。peer節點主要負責通過執行鏈碼 chaincode 實現對賬本的讀寫操作。所有的peer節點都是記賬節點 committer 負責維護狀態資料和賬本的副本。部分peer節點根據背書策略的設定...
Hyperledger Fabric 背書策略
背書策略是為了告知peer節點,交易是否被正確的背書。當peer接收到乙個交易到時候,它將會invoke與交易相關的chaincode的vscc validation system chaincode 作為交易驗證流的一部分,來驗證交易的有效性。recall that a transaction c...
Hyperledger Fabric(私有資料)
如果某個通道上的一組組織需要將該資料與該通道上的其他組織保密,他們可以選擇建立乙個新通道,只包含需要訪問資料的組織。但是,在每種情況下建立單獨的通道會產生額外的管理開銷 維護鏈碼版本,策略,msp等 並且不允許你希望所有通道參與者在保持部分資料私有的情況下檢視交易的用例。這就是為什麼從v1.2開始,...