天天看點

Hyperledger Fabric筆記2--運作fabric測試網絡

Hyperledger Fabric筆記2--運作fabric測試網絡

1、擷取fabric相關源代碼

首先,需要在/opt/gopath中建立目錄,  mkdir -p /opt/gopath/src/github.com/hyperledger/

其次,下載下傳fabric源碼,git clone https://github.com/hyperledger/fabric.git                                                                      

或者 git clone https://gerrit.hyperledger.org/r/fabric

下載下傳fabric-samples,git clone -b master https://github.com/hyperledger/fabric-samples.git

2、運作first-network 測試網絡

1)先停止并删除所有運作的相關docker 容器,以免端口或服務被占用

docker ps -a 檢視所有容器

docker stop name(name為docker ps -a中的name列)

docker rm $(docker ps -a -q) #删除所有容器

2)cd fabric-samples

git tag #檢視有哪幾個版本,筆者目前有如下tag

v1.0.2
v1.0.6
v1.1.0
v1.1.0-alpha
v1.1.0-preview
v1.1.0-rc1      

git checkout  -b  v1.1.0-alpha #該指令會在本地建立一個v1.1.0-alpha的分支,該分支内容即為tag為v1.1.0-alpha的版本内容 ,此處需要注意的是初次clone fabric-sample後,需要使用git checkout  -b  v1.1.0-alpha,否則本地檔案沒有改變;第一次成功後就可以直接使用 git checkout  v1.1.0-alpha來切換版本了                 

注:筆者使用預設git clone 的v1.1.0-rc1 出問題了,問題如下:

ERROR! Local Fabric binary version of 1.0.0 does not match this newer version of BYFN and is unsupported. Either move to a later version of Fabric or checkout an earlier version of fabric-samples.

即:v1.0.0的fabri bin檔案夾下的程式和v1.1.0-rc1不比對,是以可選擇使用新版本的fabric或者回退fabric-samples,筆者向前回退發現使用alpha成功了,是以可優先使用v1.1.0-alpha 

3)執行fabric/scripts下的bootstrap-1.0.0.sh腳本,以擷取一個包含configtxgen、cryptogen和peer等檔案的bin目錄

cd到fabric/scripts下,執行./bootstrap-1.0.0.sh,該指令不僅會下載下傳bin目錄,還會從docker hub中拉取必要的fabric網絡運作所需的docker鏡像                   

如果fabric/scripts下沒有對應的sh檔案,則需要 git checkout -b v1.0.0 #該指令在本地建立一個v1.0.0的分支,v1.0.0的scripts目錄下包含多種sh檔案,我們隻需使用bootstrap-1.0.0.sh檔案,生成bin指令後,将fabric/scripts/bin目錄拷貝到fabric-samples/下

需要注意的是,初次切換到新分支或者tag的時候需要使用git checkout -b v1.0.0來建立tag對應的分支,否則本地script腳本下檔案沒有改變,後續可以直接使用git checkout v1.0.0 切換到對應的分支

注意:筆者也測試過bootstrap-1.0.0-rc1.sh,其下載下傳的bin檔案夾也可以供v1.1.0-alpha 版的fabric-samples使用

4)cd /fabric-samples/first-network

執行./byfn.sh -m generate 産生必要的檔案

執行./byfn.sh -m up啟動網絡,選項為y,成功啟動後如下圖所示:

Hyperledger Fabric筆記2--運作fabric測試網絡

執行./byfn.sh -m down 關閉網絡

注意:若執行失敗,則檢查一下是否拷貝了bin檔案夾,是否關閉了相關的容器

​​官方參考文檔​​:http://hyperledger-fabric.readthedocs.io/en/release-1.0/build_network.html

3、運作fabric下e2e_cli 測試網絡

1)先停止并删除所有運作的相關docker 容器,以免端口或服務被占用

docker ps -a 檢視所有容器

docker stop name(name為docker ps -a中的name列)

docker rm $(docker ps -a -q) #删除所有容器

2)git checkout  -b v1.0.0

cd fabric/scripts

./bootstrap-1.0.0.sh

該操作會生成fabric 1.0所需的docker images和包含configtxgen、cryptogen和peer等檔案的bin目錄,在運作fabric-samples的時候需要将其拷貝到fabric-samples目錄下

3) cd fabric/examples/e2e_cli

執行./network_setup.sh up 啟動網絡,啟動後界面同first-network一樣

執行./network_setup.sh down 關閉網絡

若執行失敗,則檢查一下是否拷貝了bin檔案夾,是否關閉了相關的容器

4、注意事項

(1) clearContainers函數删除所有容器的解決方法

在運作./byfn.sh -m down的時候回執行clearContainers() 函數中的CONTAINER_IDS=$(docker ps -aq),這會把所有的容器都删除,偷懶的方法是使用的時候需要確定主控端上沒有重要的容器,或者将容器資料備份一下!

比較靠譜的方法是更改一下byfn.sh腳本,使指令行隻删除除了需要儲存的容器之外的所有容器,為此筆者做了如下改進腳本如下:

function specialClearContainer(){
  arrName=(mygerrit mynginx myjenkins) #此處更改為自己需要保留的容器名稱
  arrID=()
  i=0
  for var in ${arrName[@]} #将mygerrit mynginx myjenkins的containerID放到數組arrID中
  do 
    arrID[$i]=$(docker ps -a|grep ${arrName[$i]}|cut -c1-12)
    i=$i+1
  done
  echo '需保留容器:'${arrID[*]} 
  containerIDs=$(docker ps -aq)
  arrContainerIDs=($containerIDs)
  echo '所有的容器:'${arrContainerIDs[*]}
  for var1 in ${arrContainerIDs[@]}
  do
    var=0 #預設var1和var2不相同,相同則設var為1
    for var2 in ${arrID[@]}
    do
      if [ $var1 = $var2 ]
      then
        var=1
        break
      fi
    done
    if [ $var = 0 ] #如果var1不在var2中,那麼可以删除var1對應的容器
    then
      echo '已删除容器:'$var1
      docker rm -f $var1
    fi
  done
  echo '存活的容器:'$(docker ps -aq)
}
#注意此處是byfn.sh腳本中的原版函數,筆者對clearContainers做了一些修改
# Obtain CONTAINER_IDS and remove them
# TODO Might want to make this optional - could clear other containers
function clearContainers () {
    CONTAINER_IDS=$(docker ps -aq)
        if [ -z "$CONTAINER_IDS" -o "$CONTAINER_IDS" == " " ]; then
            echo "---- No containers available for deletion ----"
              else
                specialClearContainer #使用自己的函數
                #docker rm -f $CONTAINER_IDS #原有的方法會删除所有的鏡像,不推薦使用
                      fi
}
clearContainers      

筆者有伺服器上同時啟動了mygerrit、mynginx、myjenkins、hello-world等4個容器,需要删掉除了mygerrit mynginx myjenkins之外的容器,運作腳本結果如下所示:

Hyperledger Fabric筆記2--運作fabric測試網絡

很明顯,隻删除了hello對應容器,其它容器正常存活,将删除更改添加到fabric各個啟動腳本中就可以避免關閉fabric網絡的時候删除所有容器的問題

(2)bin檔案夾的說明

bin檔案夾中包括6個檔案: configtxgen  configtxlator  cryptogen  get-byfn.sh  get-docker-images.sh  peer ;其中configtxgen  用于生成排序服務的創世區塊和相關的配置檔案,生成的檔案在 channel-artifacts 中;cryptogen  用于生成工具證書,其生成的檔案在 crypto-config中。

bin檔案夾的擷取方式:

方法一:執行fabric/scripts下的bootstrap-1.0.0.sh或./bootstrap-1.0.0.-rc1.sh腳本,腳本中有如下下載下傳指令;

echo "===> Downloading platform binaries"
curl https://nexus.hyperledger.org/content/repositories/releases/org/hyperledger/fabric/hyperledger-fabric/${ARCH}-${VERSION}/hyperledger-fabric-${ARCH}-${VERSION}.tar.gz | tar xz      

bin檔案夾通常下載下傳速度很慢,若下載下傳不出來可以用方法二編譯生成相關檔案

方法二:屏蔽bootstrap-1.0.0***.sh中的curl下載下傳功能,直接去pull 相關的docker鏡像,使用fabric/examples/e2e_cli/generateArtifacts.sh 編譯生成bin檔案,generateArtifacts.sh腳本中有如下函數,該函數會判斷$FABRIC_ROOT/release/$OS_ARCH/bin/下是否存在configtxgen檔案,若不存在就make - C $FABRIC_ROOT release生成對應的bin檔案夾,後續生成創世塊和相應配置檔案也使用該bin目錄下的檔案

function generateChannelArtifacts() {

  CONFIGTXGEN=$FABRIC_ROOT/release/$OS_ARCH/bin/configtxgen
  if [ -f "$CONFIGTXGEN" ]; then
            echo "Using configtxgen -> $CONFIGTXGEN"
  else
      echo "Building configtxgen"
      make -C $FABRIC_ROOT release
  fi

  echo "##########################################################"
  echo "#########  Generating Orderer Genesis block ##############"
  echo "##########################################################"
  # Note: For some unknown reason (at least for now) the block file can't be
  # named orderer.genesis.block or the orderer will fail to launch!
  $CONFIGTXGENCONFIGTXGEN=$FABRIC_ROOT/release/$OS_ARCH/bin/configtxgen
  if [ -f "$CONFIGTXGEN" ]; then
            echo "Using configtxgen -> $CONFIGTXGEN"
  else
      echo "Building configtxgen"
      make -C $FABRIC_ROOT release
  fi

  echo "##########################################################"
  echo "#########  Generating Orderer Genesis block ##############"
  echo "##########################################################"
  # Note: For some unknown reason (at least for now) the block file can't be
  # named orderer.genesis.block or the orderer will fail to launch!
  $CONFIGTXGEN      

由于e2e_cli中使用編譯生成的bin檔案夾内的檔案,是以在運作通過network_setup.sh腳本運作e2e_cli時候不需要将生成的bin檔案夾拷貝到其它目錄,若通過手動指令行運作時最好将其拷貝到同級或上級目錄中;而byfn中預設是沒有bin檔案夾的,且byfn.sh腳本通過export PATH=${PWD}/../bin:${PWD}:$PATH 将bin檔案夾導入到臨時環境變量中,是以需要通過fabric項目生成相應的bin檔案,并将其拷貝到fabric-samples項目目錄中。

5、說明