天天看點

在Ubuntu 18.04的Hyperledger Fabric1.4中手動部署first-network

在Ubuntu 18.04的Hyperledger Fabric1.4中手動部署first-network

這篇文章上接:ubuntu18.04 快速搭建 Hyperledger Fabric超級賬本架構,為了更好的了解Fabric1.4運作時的工作原理,下面自己動手部署first-network。

文章目錄

    • 在Ubuntu 18.04的Hyperledger Fabric1.4中手動部署first-network
      • 1. 準備工作
      • 2. 手動部署
        • 1. 生成MSP證書
        • 2. 自己動手修改生成MSP證書的代碼
        • 3. 生成配置交易
        • 4. 啟動測試網絡
        • 5. 參考文獻
        • 6. 後記

1. 準備工作

首先在

fabric-samples/first-network

檔案夾下運作

./byfn.sh up

指令,若成功運作才可進行手動部署的操作,運作成功後輸入

./byfn.sh down

指令關閉網絡。每次修改源代碼且運作後,下次運作之前都要 運作

./byfn.sh down

關閉之前的網絡

2. 手動部署

1. 生成MSP證書

終端進入

fabric-samples/first-network

檔案下,運作以下指令:

../bin/cryptogen generate --config=./crypto-config.yaml
           

執行成功出現以下結果:

在Ubuntu 18.04的Hyperledger Fabric1.4中手動部署first-network

這個步驟的是使用

cryptogen工具

,根據

crypto-config.yaml

配置生成MSP證書,同時目前目錄中會生成

crypto-config

檔案夾,檔案夾中包括

ordererOrganizations

peerOrganizations

兩個檔案夾,其中包含了排序服務組織機構的證書和Peer節點的證書。

cryptogen

的作用是為各種網絡實體材料生成加密材料(x509證書和簽名秘鑰),網絡實體進行通信和交易時,使用加密材料進行簽名和認證。和其他區塊鍊網絡一樣,fabric中的交易和通信也是通過實體的私鑰(keystore)進行簽名,通過公鑰(signcerts)進行驗證。

cryptogen

使用

crypto-config.yaml

作為參數配置,這個檔案裡面包含網絡拓撲,并為組織和屬于這個組織的實體(orderer和peer)生成證書庫。每個組織被配置設定一個唯一根證書(ca-cert),該證書講指定的實體與組織綁定。

​ 下面我們看一下

crypto-config.yaml

中的代碼片段:

​ 這部分為orderer節點的代碼

在Ubuntu 18.04的Hyperledger Fabric1.4中手動部署first-network

​ 網絡實體的命名約定為{{.Hostname}}.{{.Domain}}。此order節點使用Space方式

​ 這部分為peer節點的代碼

在Ubuntu 18.04的Hyperledger Fabric1.4中手動部署first-network

​ 對檔案不做任何修改,使用

tree crypto-config -L 4

檢視

crypto-config

檔案下的目錄結構如圖所示:

在Ubuntu 18.04的Hyperledger Fabric1.4中手動部署first-network

2. 自己動手修改生成MSP證書的代碼

​ 下面我們對

org2.example.com

下的代碼進行修改

在Ubuntu 18.04的Hyperledger Fabric1.4中手動部署first-network

​ 運作:

../bin/cryptogen generate --config=./crypto-config.yaml
           

​ 再次使用tree指令檢視

crypto-config

下的檔案結構。

[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-JQs21z1Y-1590929339687)(/home/jsm/.config/Typora/typora-user-images/image-20200526085704234.png)]

​ 現在修改 orderer節點的代碼,修改之前的目錄結構為:

在Ubuntu 18.04的Hyperledger Fabric1.4中手動部署first-network

​ 修改代碼:

在Ubuntu 18.04的Hyperledger Fabric1.4中手動部署first-network

​ 修改後orderer節點的目錄結構:

在Ubuntu 18.04的Hyperledger Fabric1.4中手動部署first-network

​ 可見

Space``Template

參數可以混合用,也可随便單獨用一個,修改orderer節點的

Users

參數貌似沒用 現在不知道是因為我操作的問題,還是本來就是這樣。

3. 生成配置交易

使用

configtxgen

生成配置交易,它會生成4個配置網絡工件:genesis.block(創世紀區塊)、channel.tx(通道配置交易)、Org1MSPanchors.tx(錨節點交易)、Org2MSPanchors.tx(錨節點交易)。

configtxgen

的配置參數放在

configtx.yaml

檔案中。

​ 首先我們告訴

configtxgen

工作的目錄,友善它查找

configtx.yaml

export FABRIC_CFG_PATH=$PWD
           

​ 然後生成orderer創世紀區塊

../bin/configtxgen -profile TwoOrgsOrdererGenesis -channelID byfn-sys-channel -outputBlock ./channel-artifacts/genesis.block
           
在Ubuntu 18.04的Hyperledger Fabric1.4中手動部署first-network

​ 建立通道配置交易

export CHANNEL_NAME=mychannel
../bin/configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID $CHANNEL_NAME
           
在Ubuntu 18.04的Hyperledger Fabric1.4中手動部署first-network

​ 定義通道中Org1的錨節點

../bin/configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org1MSP
           

​ 定義通道中Org2錨節點

../bin/configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org2MSP
           

​ 終端輸出:

在Ubuntu 18.04的Hyperledger Fabric1.4中手動部署first-network

​ 上述4個工件儲存在

channel-artifacts

目錄下 若都運作成功會看到

在Ubuntu 18.04的Hyperledger Fabric1.4中手動部署first-network

​ 錨節點是一個peer節點,在一個網絡中,有多個組織,每個組織有多個peer節點組織群組織之間需要通信,那麼每個組織中選取一個peer節點作為代表進行通信,我們就稱這個peer節點為錨節點,錨節點的職責就是代表目前這個組織和其他的組織進行通信,我們可以在配置檔案中指定錨節點,任意的peer節點都有資格成為錨節點,但是一個組織最多有一個錨節點。 創世紀區塊是排序服務的創世區塊;通道配置交易在通道建立時廣播給orderer;錨節點交易指定通道上每個組織的錨節點。

​ 下面我們看一下

configtx.yaml

配置檔案中的内容

​ 定義peer節點的參數

在Ubuntu 18.04的Hyperledger Fabric1.4中手動部署first-network

​ 定義orderer節點共識機制相關參數

在Ubuntu 18.04的Hyperledger Fabric1.4中手動部署first-network

​ 滿足

BatchTimeout

MaxMessageCount

AbsoluteMaxBytes

PerferredMaxBytes

中的任何一個條件orderer都會打塊。并且這4個參數還影響fabric網絡的性能,如何最優都需要根據環境的不同進行調參。

4. 啟動測試網絡

  • 進入網絡

    fabric網絡需要進入Docker中啟動,引用

    docker-compose-cli.yaml

    檔案啟動docker
    # 不看網絡啟動日志
    docker-compose -f docker-compose-cli.yaml up -d
    # 看網絡啟動日志、
    docker-compose -f docker-compose-cli.yaml up
               
    docker exec -it cli bash
               
    若成功顯示:
    在Ubuntu 18.04的Hyperledger Fabric1.4中手動部署first-network
  • 建立通道
    export CHANNEL_NAME=mychannel
    export ORDERER_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
    peer channel create -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/channel.tx --tls --cafile $ORDERER_CA
               
    出現下圖表示成功
    在Ubuntu 18.04的Hyperledger Fabric1.4中手動部署first-network

    peer channel create

    會傳回一個創世紀區塊,區塊名為

    通道名.block

    ,因為我們的通道名稱為

    mychannel

    , 是以傳回的區塊名為

    mychannel.block

    -c

    表示通道名稱為

    $CHANNEL_NAME

    通道名稱必須全為小寫;

    -f

    表示通道配置交易

    channel.tx

    ,其包含了指定的配置資訊,

    channel.tx

    檔案被挂載到

    CLI

    容器中的

    channel-artifacts

    目錄中;

    --tls --cafile

    指定

    ORDERER_CA

    的根證書路徑,要求節點驗證TLS握手。
  • peer0.org1

    加入通道
    peer channel join -b mychannel.block
               
    在Ubuntu 18.04的Hyperledger Fabric1.4中手動部署first-network
    更新通道,将

    peer0.org1

    設為錨節點
    peer channel update -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/Org1MSPanchors.tx --tls --cafile $ORDERER_CA 
               
    在Ubuntu 18.04的Hyperledger Fabric1.4中手動部署first-network

    peer0.org1

    安裝鍊碼
    peer chaincode install -n mycc -v 1.0 -p github.com/chaincode/chaincode_example02/go/
               
    在Ubuntu 18.04的Hyperledger Fabric1.4中手動部署first-network
  • 執行個體化鍊碼
    peer chaincode instantiate -o orderer.example.com:7050 --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C $CHANNEL_NAME -n mycc -v 1.0 -c '{"Args":["init","a", "100", "b","200"]}' -P "OR('Org1MSP.peer','Org2MSP.peer')"
               
    出現:
    在Ubuntu 18.04的Hyperledger Fabric1.4中手動部署first-network

    -P

    是我們指定的政策為

    "OR('Org1MSP.peer','Org2MSP.peer')"

    ,表示我們隻需要一個屬于Org1或Org2的”背書“,若将

    OR

    改為

    AND

    則意味着我們需要兩個”背書“。

    ​ 我們在執行個體化鍊碼時也進行了初始化,即将

    a

    指派為

    100

    b

    指派為

    200

    ,可以通過下列指令對

    a

    的值進行查詢:
    peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}'
               
    ​ 結果為

    100

    ,将指令後面的參數由

    a

    改為

    b

    ,可以對

    b

    的值進行查詢。

    ​ 另外由于我們是在

    peer0.org1

    的環境中将鍊碼執行個體化的,是以在另外的終端輸入

    docker ps

    指令,會看到

    NAME

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

    的容器,鍊碼會在這個容器中運作,任何安裝(

    peer chaincode install

    )鍊碼的peer,在被調用時都會檢查是否生成了鍊碼容器,若沒有就會首先生成。且不不管鍊碼在那個

    peer

    中被執行個體化,都隻能執行個體化一次。且執行個體化節點必須為

    Admin

  • peer0.org2

    加入通道

    ​ 将通道中的環境改為

    peer0.org2

    (之前是

    peer0.org1

    ),具體操作就是設定

    peer0.org2

    環境變量,
    CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/[email protected]/msp
    CORE_PEER_ADDRESS=peer0.org2.example.com:7051
    CORE_PEER_LOCALMSPID="Org2MSP"
    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
               
    然後輸入以下指令:
    # 加入通道
    peer channel join -b mychannel.block
    # 更新通道,定義錨節點
     peer channel update -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/Org2MSPanchors.tx --tls --cafile $ORDERER_CA
     # 安裝鍊碼
     peer chaincode install -n mycc -v 1.0 -p github.com/chaincode/chaincode_example02/go/
               
    然後查詢

    a

    的值,測試是否加入成功,指令同上。成功後開始進行轉賬交易:将a移動10個到b。
    # 配置環境變量,聲明peer0.org1的MSP位址
    PEER0_ORG1_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
    # 轉賬将a移動10個到b
    peer chaincode invoke -o orderer.example.com:7050 --tls --cafile $ORDERER_CA -C $CHANNEL_NAME -nmycc --peerAddresses peer0.org1.example.com:7051 --tlsRootCertFiles $PEER0_ORG1_CA -c '{"Args":["invoke", "a", "b", "10"]}'
               
    因為在執行個體化鍊碼時我們聲明指定的政策是

    "OR('Org1MSP.peer','Org2MSP.peer')"

    隻需要一個節點MSP(背書),是以此次轉賬交易我們隻用到了

    peer0.org1

    這一個節點的背書。若聲明為

    "AND('Org1MSP.peer','Org2MSP.peer')"

    則需要兩個節點MSP(背書),則首先指定

    peer0.org2

    的MSP位址,然後使用

    --peerAddresses

    指令指定多個背書,轉賬指令改為:
    # 配置環境變量,聲明peer0.org1的MSP位址
    PEER0_ORG2_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt
    peer chaincode invoke -o orderer.example.com:7050 --tls --cafile $ORDERER_CA -C $CHANNEL_NAME -nmycc --peerAddresses peer0.org1.example.com:7051 --tlsRootCertFiles $PEER0_ORG1_CA --peerAddresses peer0.org2.example.com:7051 --tlsRootCertFiles $PEER0_ORG2_CA -c '{"Args":["invoke", "a", "b", "10"]}'
               
    再次查詢a、b的值:
    # 查詢a
    peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}'
    # 結果應為90
    # 查詢b
    peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","b"]}'
    # 結果應為210
               

5. 參考文獻

  • https://blog.csdn.net/zxc87545586/article/details/89400941
  • Hyperledger Fabric核心技術 第三章
  • Fabric 的官方概念 https://www.jianshu.com/p/8d775a1c76e0
  • peer和orderer的作用:https://blog.csdn.net/qq_36336522/article/details/85216240

6. 後記

​ 恭喜你,一路看到這裡,如果以上步驟都順利完成的話,一個簡單的fabric網絡就算搭建成功了。但是細心的網友可能會發現,在生成MSP證書時,共定義了兩個組織,每個組織有定義了兩個peer節點時如圖:

在Ubuntu 18.04的Hyperledger Fabric1.4中手動部署first-network

​ 現在我們隻是将

peer0.org1

peer0.org2

加入了通道,還有

peer1.org1

peer1.org2

沒有加入,這個兩個peer節點就請讀者自己完成。需要注意的是每一次将一個新的peer節點加入通道時都需要将環境變量更改為這個新的peer節點。

​ 這篇文章斷斷續續寫了一周快兩周的時間,在此過程中付出了很多的時間,往往一個小的章節結就需要查很多的資料,唯恐自己描述的有誤,贻笑大方,但是付出總是有回報的,自己也學到了很多知識。

奮鬥吧,少年!!!

​ 最後如果你覺得我寫的還可以的話,請鼓勵一下下吧!!!

支付寶 微信
在Ubuntu 18.04的Hyperledger Fabric1.4中手動部署first-network
在Ubuntu 18.04的Hyperledger Fabric1.4中手動部署first-network

繼續閱讀