超級賬本Fabric 1.0 多節點叢集的部署(3)

買賣虛擬貨幣
上兩期文章闡述了超級賬本 fabric 1.0多節點部署概述以及多節點叢集部署的準備工作(可點選),得到廣大讀者的關注,今天釋出連載之三,介紹搭建 fabric 1.0 叢集的具體配置和chaincode管理的步驟。因為是手動部署,因此步驟比較多。有需要的讀者可在文後下載3期合併的pdf版本。

超級賬本fabric 1.0 多節點叢集的部署(1):http://8btc.com/article-4542-1.html
超級賬本fabric 1.0 多節點叢集的部署(2):http://8btc.com/article-4543-1.html

( 接上期,部署配置中大量使用了 docker 和 docker compose ,建議不熟悉的讀者先補充相關知識。)

2.3 多節點 fabric 的配置

以下各vm的工作目錄為: 

$gopath/src/github.com/hyperledger/fabric/examples/e2e_cli

可在任意vm上執行以下命令,生成構建 fabric 網路所需的成員證書等必要材料:

bash generateartifacts.sh

該命令只需在某個vm上執行一次,其他vm上就不需要執行。

在執行該命令的vm中會生成 channel-artifacts 和 crypto-config 目錄,需要把它們複製到其他vm的 e2e_cli 目錄下,如果在vm中已經存在該目錄,則先把目錄刪除。當每個vm中都有統一的 channel-artifacts 和 crypto-config 目錄後接下來就開始配置 compose 檔案。
i. vm1的配置:

1.  修改 /etc/hosts 的對映關係
因為容器內部透過域名的方式訪問 orderer , 因此需要透過修改 /etc/hosts 把orderer 的域名和 ip 地址對應起來,在檔案中新增:

10.112.122.69   orderer.example.com
2.  修改docker-compose-cli.yaml
在預設的情況下,docker-compose-cli.yaml會啟動6個service(容器),它們分別為 peer0.org1.example.com、 peer1.org1.example.com、 peer0.org2.example.com、 peer1.org2.example.com、 orderer.example.com 和 cli,因為每臺機器只執行與之對應的一個節點,因此需要註釋掉無需啟動的 service。

(1) 除 peer0.org1.example.com 和 cli service 外,其他 service 全部註釋。
(2) 在 cli 的 volumes 中加入對映關係:
-./peer/:/opt/gopath/src/github.com/hyperledger/fabric/peer/
-/etc/hosts:/etc/hosts
(3) 註釋 cli 中的 depends_on 和 command :
   depends_on:
      #- orderer.example.com
      - peer0.org1.example.com
      #- peer1.org1.example.com
      #- peer0.org2.example.com
      #- peer1.org2.example.com

      #command: /bin/bash -c './scripts/script.sh ${channel_name}; sleep $timeout'
之前我們把容器中的工作目錄掛載到宿主機的 e2e_cli/peer 目錄下, 是因為在執行 create channel 的過程中,orderer 會返回一個 mychannel.block 作為 peer 加入 channel 的依據,其他的 peer 要加入到相同的 channel 中必須先獲取該 mychannel.block 檔案。因此,透過掛載目錄從宿主機就能方便獲得 mychannel.block ,並且把它傳輸到其他的 vm 上。

掛載 /etc/hosts 的目的是把主機中 orderer.exmaple.com 與 ip 地址10.112.122.69 的對映關係帶入容器中,目的是讓 cli 能透過域名訪問 orderer  。在實際環境中,建議透過配置 dns 而不是修改 /etc/hosts 檔案(下同)。

3.  修改 base/peer-base.yaml,新增 volumes:
volumes:
-/etc/hosts:/etc/hosts
這樣 peer 容器能透過域名訪問orderer了。

ii. vm2配置:

1. 修改 /etc/hosts 的對映關係
peer1.org1.example.com 使用了 peer0.org1.example.com 作為它的初始化節點,因此需要在主機中還需要加入 vm1 的 ip 地址。
10.112.122.69   orderer.example.com
10.112.122.144  peer0.org1.example.com
2. 修改docker-compose-cli.yaml
(1) 類似vm1,除 peer1.org1.example.com 和 cli service 外,其他 service 全部註釋。

(2) 在 cli 的 volumes 中加入對映關係:
-./peer/:/opt/gopath/src/github.com/hyperledger/fabric/peer/
-/etc/hosts:/etc/hosts
(3) 註釋cli中的 depends_on 和 command:
depends_on:
 #- orderer.example.com
 #- peer0.org1.example.com
 - peer1.org1.example.com
 #- peer0.org2.example.com
 #- peer1.org2.example.com
#command:/bin/bash -c './scripts/script.sh ${channel_name}; sleep $timeout'
(4) 修改cli中的環境變數
core_peer_address=peer1.org1.example.com:7051
3. 修改base/peer-base.yaml,同vm1的修改。
iii. vm3配置:

1. 修改 /etc/hosts 的對映關係
 10.112.122.69      orderer.example.com
2. 修改docker-compose-cli.yaml
(1) vm3 上執行 peer2 節點,因此除 peer0.org2.example.com 和 cli service 外,其他 service 全部註釋。

(2) 在cli的 volumes 中加入對映關係:
- ./peer/:/opt/gopath/src/github.com/hyperledger/fabric/peer/
-/etc/hosts:/etc/hosts
(3) 註釋cli中的 depends_on 和 command :
depends_on:
 #- orderer.example.com
 #- peer0.org1.example.com
 #- peer1.org1.example.com
 - peer0.org2.example.com
 #- peer1.org2.example.com

#command:/bin/bash -c './scripts/script.sh ${channel_name}; sleep $timeout'
(4) 修改cli中的環境變數
core_peer_localmspid="org2msp"
core_peer_address=peer0.org2.example.com:7051
core_peer_tls_rootcert_file=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerorganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt
core_peer_mspconfigpath=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerorganizations/org2.example.com/users/[email protected]/msp
3. 修改base/peer-base.yaml,同vm1。
iv. vm4配置:

1. 修改/etc/hosts的對映關係
peer1.org2.example.com 使用了 peer0.org2.example.com 作為它的初始化節點,因此需要在對映關係中加入 vm3 的 ip 地址
10.112.122.69       orderer.example.com
10.112.122.12       peer0.org2.example.com
2. 修改docker-compose-cli.yaml
(1) vm4執行peer3,因此除peer1.org2.example.com和cliservice 外,其他service全部註釋

(2) 在cli的volumes中加入對映關係:
-./peer/:/opt/gopath/src/github.com/hyperledger/fabric/peer/
-/etc/hosts:/etc/hosts
(3) 修改cli中的 depends_on 和 command:
depends_on:
  - peer1.org2.example.com
#command:/bin/bash -c './scripts/script.sh ${channel_name}; sleep $timeout'

(4) 修改cli中的環境變數
core_peer_localmspid="org2msp"
core_peer_address=peer1.org2.example.com:7051
core_peer_tls_rootcert_file=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerorganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt
core_peer_mspconfigpath=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerorganizations/org2.example.com/users/[email protected]/msp
3. 修改base/peer-base.yaml,同vm1。
v. vm5配置如下:
1. 修改docker-compose-cli.yaml
除orderer外的其他 service 全部註釋,即只啟動 orderer 。
2.4 啟動多節點fabric叢集

1.啟動orderer
進入到 vm5 的 fabric/examples/e2e_cli 目錄下,執行
docker-compose -f docker-compose-cli.yaml up -d

此時終端會出現大量記錄,當出現beginning to service requests時,orderer啟動完成。有了 orderer 之後,就可以透過它來管理 channel 。             
2.啟動 org1的第一個節點 peer0 ,即 peer0.org1.example.com

進入到 vm1 的 fabric/examples/e2e_cli 目錄下,執行
docker-compose -f docker-compose-cli.yaml up -d

此時透過docker ps -a 命令可以看到成功啟動了 peer0.org1.example.com 和 cli 兩個容器。

接下來實現建立 channel 、加入 channel 和安裝 chanicode 。首先進入到cli容器內:
docker exec -it cli bash
cli 與 orderer 之間的通訊使用 tls 加密,設定環境變數 orderer_ca 以作建立握手的憑證:
$orderer_ca=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererorganizations/example.com/orderers/orderer.example.com/msp/cacerts/ca.example.com-cert.pem

注:以下所有涉及到 orderer_ca 環境變數的命令都需預先給該變數賦值。

進入到 cli 容器後會自動跳轉到 /opt/gopath/src/github.com/hyperledger/fabric/peer 目錄,即工作目錄,透過compose檔案的配置,該目錄對映為宿主機的 /e2e_cli/peer 。

在工作目錄下輸入以下命令,建立名為 mychannel 的 channel :
peer channel create -o orderer.example.com:7050 -c mychannel -f ./channel-artifacts/channel.tx --tls --cafile $orderer_ca

channel 建立成功後,會在當前目錄下生成mychannel.block檔案。每個peer 在向 orderer 傳送 join channel 交易的時候,需要提供這個檔案才能加入到 mychannel 中,因此執行在其他 vm 上的 peer 需要得到 mychannel.block 檔案來加入到 mychannel 中。由於之前的檔案對映關係, mychannel.block 檔案可在宿主機的 e2e_cli/peer 目錄下獲取,這時可以透過宿主機把 mychannel.block 複製到 vm2, vm3, vm4的 e2e_cli/peer 目錄下。

把 peer0.org1.example.com 加入到 mychannel 中:
peer channel join -b mychannel.block

更新 mychannel 中 org1 的 anchor peer 的資訊:
peer channel update -o orderer.example.com:7050 -c mychannel -f ./channel-artifacts/org1mspanchors.tx --tls --cafile $orderer_ca            

安裝 chaincode 示例 chaincode_example02 到 peer0.org1.example.com 中:
peer chaincode install -nmycc -v 1.0 -p \
github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02

這時候 chaincode 程式碼已經安裝到了 peer0 節點上,但並未例項化執行。接下來先配置好其他節點。
3. 啟動 org1 的第二個節點 peer1,即 peer1.org1.example.com

進入到vm2的 fabric/examples/e2e_cli 目錄下,執行
docker-compose -f docker-compose-cli.yaml up -d

進入到 cli 容器內部:
docker exec -it cli bash

由於前面已經把 mychannel.block 複製到了 vm2 的 e2e_cli/peer 目錄下,因此 mychannel.block 可透過容器內的 /opt/gopath/src/github.com/hyperledger/fabric/peer 目錄訪問。

把 peer1.org1.example.com 加入到 mychannel 中:
peer channel join -b mychannel.block
安裝 chaincode_example02 到 peer1.org1.example.com 中:
peer chaincode install -nmycc -v 1.0 –p \
github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02
4. 啟動 org2 的第一個節點 peer2,即 peer0.org2.example.com

進入到 vm3 的 fabric/examples/e2e_cli 目錄下,執行
docker-compose-f docker-compose-cli.yaml up -d
進入到cli容器內部:
docker exec -it cli bash
把peer0.org2.example.com加入到mychannel中:
peer channel join -b mychannel.block

更新 mychannel 中 org2 的 anchor peer 的資訊:
peer channel update -oorderer.example.com:7050 -c mychannel -f ./channel-artifacts/org2mspanchors.tx --tls --cafile $orderer_ca   
安裝 chaincode_example02 到 peer0.org2.example.com 中:
peer chaincode install -nmycc -v 1.0 -p \
github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02
5. 啟動org2的第二個節點 peer3 ,即啟動 peer1.org2.example.com

進入到 vm4 的 fabric/examples/e2e_cli 目錄下,執行
docker-compose-f docker-compose-cli.yaml up -d

首先進入到cli容器內部:
docker exec -it cli bash
把 peer1.org2.example.com 加入到 mychannel 中:
peer channel join -b mychannel.block
安裝 chaincode_example02 到 peer1.org2.example.com 中:

peer chaincode install -nmycc -v 1.0 -p \
github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02

2.5 執行chaincode

透過前面的步驟,整個 多節點fabric 網路已經執行起來了,每個peer都加入到了標識為 mychannel 的 channel 中,並且都安裝了一個簡單的 chaincode (該 chaincode 在安裝時被標識為 mycc ) 。下面步驟執行和維護 chaincode。

1. 例項化chaincode

chaincode 的例項化可在任意 peer 上進行,並且 chaincode 只能被例項化一次,下面以在 peer0.org2.example.com 上例項化 chaincode 為例。

首先登入vm3並進入到cli容器內部執行:
peer chaincode instantiate -o orderer.example.com:7050 --tls --cafile $orderer_ca -c mychannel-nmycc -v 1.0 -c '{"args":["init","a","100","b","200"]}' -p "or     ('org1msp.member','org2msp.member')"

這時候會構建一個新的容器來執行chaincode,透過docker ps -a 命令可以看到新容器:

dev-peer0.org2.example.com-mycc-1.0
上述例項化中,我們對兩個變數‘a’和‘b’分別賦予初值100和200,透過 channel 它們的值被同步到了其他peer的賬本上,即使其他peer還沒有構建執行 chaincode 的容器。
2.    執行 chaincode 的 query 交易

由於 chaincode 已經被 peer0.org2.example.com 例項化了,因此其他 peer 不需要再次例項化它了,但是 chaincode 的狀態(world state)卻是已經記錄在各個peer的賬本上的。

 接下來我們在peer0.org1.example.com上檢視chaincode的狀態,登入到vm1上並進入cli容器內部執行:
peer chaincode query -c mychannel -nmycc -c '{"args":["query","a"]}'

上面的命令檢視 mycc 中變數 a 的值,由於在 peer 跟 chaincode 發生互動之前還不存在執行 chaincode 的容器,因此第一次互動的時候需要先構建執行 chaincode 的容器,等待一段時間後返回結果:100 。

此時透過 docker ps -a 命令能看到新容器:

dev-peer0.org1.example.com-mycc-1.0

該值與例項化時的賦值一致,說明 peer0.org1 和 peer0.org2 兩個 peer 可以相互通訊。
3. 執行chaincode的invoke交易

接下來,我們執行一個 invoke 交易,使得變數 a 向變數 b 轉帳 20,得到最終值為["a":"80","b":"220"]。

登入到vm2並進入到cli容器中中透過以下命令查詢mycc的狀態:
peer chaincode query -c mychannel -n mycc -c '{"args":["query","a"]}'

稍作等待後返回結果為100,下面執行 invoke 交易,改變 a 的值為 80 :
peer chaincode invoke -oorderer.example.com:7050  --tls --cafile $orderer_ca -c mychannel -n mycc -c '{"args":["invoke","a","b","20"]}'
4. 再次執行 chaincode 的 query 交易

在peer1.org1.example.com 上重複以上檢視 chaincode 的步驟,得到返回結果為 80 ,說明測試透過,至此,fabric網路構建完畢,各個部件工作正常。

2.6  更新chaincode

透過 channel upgrade 命令可以使得 chaincode 更新到最新的版本,而低版本 chaincode 將不能再使用。

登入到vm1的 cli 容器中再次安裝 chaincode_example02 ,但賦予它更高的版本號 2.0:
peer chaincode install -n mycc -v 2.0 -p \
github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02

在 vm1 的 cli 容器升級 chaincode ,新增兩個變數 ‘c’和‘d’:

peer chaincode upgrade -o  orderer.example.com:7050 --tls --cafile $orderer_ca -n mycc -v 2.0 -c '{"args":["init","c", "10","d","20"]}'

等待一段時間後,可以透過docker ps -a 來檢視新容器構建的容器,該容器的名稱為:
dev-peer0.org1.example.com-mycc-2.0

透過以下命令查詢c的變數:
peer chaincode -n mycc -c mychannel -v 2.0 -c '{"args":["query","c"]}'
返回結果為10

再次查詢a的變數:
 peer chaincode -n mycc -c mychannel -v 2.0 -c'{"args":["query","a"]}'

返回結果為80,說明更新 chaincode 成功。

這時候對賬本的修改會透過 orderer 同步到其他 peer 上,但是在其他 peer 上將無法檢視或更改 chaincode 的狀態,因為它們還在使用舊版的 chaincode ,所以其他 pee r要想正常訪問還需再次安裝 chaincode ,並且設定相同的版本號 ( chaincode 程式碼沒發生改變,只是安裝時版本號更新為 2.0 ),命令如下:

peerchaincode install -n mycc -v 2.0 –p \
github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02
結束語
本連載介紹瞭如何構建多節點fabric叢集的基本方法。為說明原理,安裝配置過程是全手動的,因此比較繁瑣。今後我們將介紹如何使用容器平臺k8s等部署fabric,敬請關注。

全文下載:http://8btc.com/doc-view-1376.html

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;