天天看點

hyperledger fabric 源碼調試(orderer)環境搭建教程

緻背景稽核:有什麼問題嗎這篇文?

前言

​ 接觸hyperledger fabric有一段時間了,看文檔搭叢集寫鍊碼都做過,但要深入了解還是通過源碼比較直覺,遂決定部署起來。同多機器部署一樣,官文對源碼調試的描述較少,網上有些前輩已經寫過但少有明确每一步的原因,本系列文嘗試依據個人了解來描述建構fabric源碼調試環境的步驟,去掉docker這層障礙,并給出思考過程。

​ 之前有寫過一篇hyperledger fabric 多機部署的教程,基于first-network示例,這次也是以它為基準,以便在遇到問題的時候更容易從官方文檔找到解決方案。需要先走通first-network的搭建,有些配置項需要參考它。

官文連結:https://hyperledger-fabric.readthedocs.io/en/release-1.4/build_network.html
           

分析

fabric子產品劃分比較細,采用docker是為了簡化部署,同時在官方提供的文檔中也大量采用shell腳本來引導,需要先大緻明确幾個概念:

docker:

​ 應用容器工具,可以将應用運作所需要的一些環境打包進去,友善移植。

docker-compose:

​ 用來運作一組docker執行個體,在first-network中,有一個orderer和4個peer,還有一個cli,在dockker-compose-cli.yaml中配置了各執行個體的環境變量,它又依賴./base/peer-base.yaml和./base/docker-compose-base.yaml,後續配置過程将主要圍繞這幾個檔案展開。

shell腳本:

​ byfn.sh 中包含了整個first-network的啟動和測試,有興趣可以閱讀一下,啟動debug調試的過程中可能會從中參考運作參數。

工具 & 環境 & 前提

系統:mac OS 。windows最好弄個虛拟機或雙系統。

IDE: goland2019.2 下載下傳位址

https://www.jetbrains.com/go/

我用的

假設您已經調試好官方文檔裡的first-netwotk,下述描述到“cd fabric-samples“都是指該示例相關的路徑,不是在fabric源碼中。

代碼拉取

采用release-1.4的代碼(如果使用其他版本代碼,可能目錄結構有差異,但本文重在了解解決思路,可參照着探索)

# 提前需確定gopath已經配置好,go的安裝配置這裡不贅述
cd <gopath>/src/github.com/hyperledger/

git clone https://github.com/hyperledger/fabric.git
cd fabric
git checkout release-1.4
git pull           

拉取完成後,用Goland -> file -> Open ->選中fabric目錄打開結構如下:

image-20191218143827726.png

hyperledger fabric 源碼調試(orderer)環境搭建教程

工作目錄準備

在工程目錄下建立目錄

cd fabric
mkdir work_dir && cd work_dir  # 類似于fabric-samples目錄,以下都參考fabric-samples的目錄結構
mkdir bin                      # 用來放源碼編譯可執行程式
mkdir orderer                                     # 放置orderer程式運作産生的檔案

# 拷貝first-network必要的配置
cp <fabric-samples path>/config/* ./config/
cp <fabric-samples path>/first-network ./
cp -r <fabric-samples path>/chaincode ./

# 運作一下驗證拷貝過來的配置是能用的
cp <fabric-samples path>/bin/* ./bin/     # 先用下載下傳下來的bin測試,待源碼編譯的時候會自動将其替換掉
cd first-network
./byfn down
./byfn up

# 結果列印應該提示成功,略           

接下來的工作就是一步步将first-network中提供的配置移植到goland中實作源碼調試。

orderer

一、Run/Debug Configuration,添加一個Go build 配置,具體如下:

name: orderer
Run kind: Package
Package path: <Project Dir>/work_dir/bin              #最好都使用絕對路徑
Output directory: <Project Dir>/work_dir/bin  
Working directory: <Project Dir>/work_dir/orderer           

二、環境變量(還是Run/Debug Configuration)

在first-network的示例中有如下三個yaml檔案:

cd fabric-samples/first-network
tree             
# 列印結果省略其他檔案 
├── docker-compose-cli.yaml
└── base
    ├── docker-compose-base.yaml
    └── peer-base.yaml           

這三個檔案配置了orderer,peer,cli執行個體的環境變量,現在隻關注其中orderer的部分,它的環境變量配置都在base/peer-base.yaml中,将其environment部分全拷貝出來放到一個文本文檔裡:

orderer-base:
    image: hyperledger/fabric-orderer:$IMAGE_TAG
    environment:
      - FABRIC_LOGGING_SPEC=INFO
      - ORDERER_GENERAL_LISTENADDRESS=0.0.0.0
      - ORDERER_GENERAL_GENESISMETHOD=file
      - ORDERER_GENERAL_GENESISFILE=/var/hyperledger/orderer/orderer.genesis.block
      - ORDERER_GENERAL_LOCALMSPID=OrdererMSP
      - ORDERER_GENERAL_LOCALMSPDIR=/var/hyperledger/orderer/msp
      # enabled TLS
      - ORDERER_GENERAL_TLS_ENABLED=true
      - ORDERER_GENERAL_TLS_PRIVATEKEY=/var/hyperledger/orderer/tls/server.key
      - ORDERER_GENERAL_TLS_CERTIFICATE=/var/hyperledger/orderer/tls/server.crt
      - ORDERER_GENERAL_TLS_ROOTCAS=[/var/hyperledger/orderer/tls/ca.crt]
      - ORDERER_KAFKA_TOPIC_REPLICATIONFACTOR=1
      - ORDERER_KAFKA_VERBOSE=true
      - ORDERER_GENERAL_CLUSTER_CLIENTCERTIFICATE=/var/hyperledger/orderer/tls/server.crt
      - ORDERER_GENERAL_CLUSTER_CLIENTPRIVATEKEY=/var/hyperledger/orderer/tls/server.key
      - ORDERER_GENERAL_CLUSTER_ROOTCAS=[/var/hyperledger/orderer/tls/ca.crt]
    working_dir: /opt/gopath/src/github.com/hyperledger/fabric
    command: orderer
           

docker有自己的檔案目錄結構,通過volumes配置映射到本地,我們要抛開docker直接在ide裡運作就需要上述涉及到路徑的都替換成本地路徑,先找到orderer相關的volumes配置項(在base/docker-compose-base.yaml中):

- ../channel-artifacts/genesis.block:/var/hyperledger/orderer/orderer.genesis.block
- ../crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp:/var/hyperledger/orderer/msp
- ../crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/tls/:/var/hyperledger/orderer/tls
- orderer.example.com:/var/hyperledger/production/orderer           

其中,冒号左邊是本地路徑,右邊是docker路徑,對照這幾項把前邊的環境變量替換過來,另外注意稍微有一點改動(加上了first-network字首,這是因為可能用腳本啟動時的目前路徑不一樣,需要做些修正,或者也可以直接補全絕對路徑):

FABRIC_LOGGING_SPEC=INFO
ORDERER_GENERAL_LISTENADDRESS=0.0.0.0
ORDERER_GENERAL_GENESISMETHOD=file
ORDERER_GENERAL_GENESISFILE=../first-network/channel-artifacts/genesis.block
ORDERER_GENERAL_LOCALMSPID=OrdererMSP
ORDERER_GENERAL_LOCALMSPDIR=../first-network/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp
ORDERER_GENERAL_TLS_ENABLED=true
ORDERER_GENERAL_TLS_PRIVATEKEY=../first-network/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/tls/server.key
ORDERER_GENERAL_TLS_CERTIFICATE=../first-network/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/tls/server.crt
ORDERER_GENERAL_TLS_ROOTCAS=[../first-network/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/tls/ca.crt]
ORDERER_KAFKA_TOPIC_REPLICATIONFACTOR=1
ORDERER_KAFKA_VERBOSE=true
ORDERER_GENERAL_CLUSTER_CLIENTCERTIFICATE=../first-network/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/tls/server.crt
ORDERER_GENERAL_CLUSTER_CLIENTPRIVATEKEY=../first-network/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/tls/server.key
ORDERER_GENERAL_CLUSTER_ROOTCAS=[../first-network/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/tls/ca.crt]
FABRIC_CFG_PATH=../config/           

注意最後一行,這是加上的,yaml檔案中沒有:

FABRIC_CFG_PATH=../config/           

這是告訴程式啟動的時候去./config找orderer.yaml檔案(在官方文檔裡隻在使用configtxgen生成初始資料的時候提到要配置這個環境變量,可能該工具内部又做了處理并設定進了docker容器中)。這一行如果不加會報錯:

failed to parse config: Error reading configuration: Unsupported Config Type ""

複制上述配置好的環境變量,打開Run/Debug Configuration -> Environment, 點選文本框右側按鈕後粘貼進去(若直接站在文本框裡需要手動用;号隔開):

image-20191218171625107.png

hyperledger fabric 源碼調試(orderer)環境搭建教程

三、config配置修改

vi work_dir/config/orderer.yaml

#找到FileLedger -> Location, 修改
Location: /var/hyperledger/production/orderer 修改為
Location: <fabric path>/work_dir/orderer           

不改的話程式啟動時會嘗試建立/var/hyperledger/production/orderer,可能報Permission denied。

四、啟動debug

1.因為一會要配合網絡調試,先清理掉之前啟動的網絡并重新準備資料(否則可能出錯):

cd work_dir/first-network
./byfn.sh down

# 清理orderer的FileLedger目錄,以後每次網絡重置都需要做這步,./byfn.sh down腳本無法照顧到IDE啟動的
# orderer
rm -rf ../orderer/*     

./byfn generate

           

2.在源碼目錄 fabric/orderer/main.go中 打個斷點,确認debug configuration為之前設定的orderer,然後點選debug标志,編譯完成後可以看到斷點生效:

image-20191218173424308.png

hyperledger fabric 源碼調試(orderer)環境搭建教程

五、配合網絡調試

fabric隻啟動一個orderer沒法調試,因為整個區塊鍊需要多個子產品共同協作,是以還需要啟動first-network的其他幾個orderer和子產品,為了簡單起見這幾個子產品就用docker啟動,需要做些修改,在docker-compose-cli.yaml中禁掉orderer.example.com:

# docker-compose-cli.yaml

...
volumes:
#  orderer.example.com:
...

services:

#  orderer.example.com:
#    extends:
#      file:   base/docker-compose-base.yaml
#      service: orderer.example.com
#    container_name: orderer.example.com
#    networks:
#      - byfn
...
           

然後需要在剩下的各容器配置中都添加orderer外部ip映射

...
        networks:
      - byfn
    # 注意與networks平級 
    extra_hosts:
      - "orderer.example.com:< 注意是host ip不是127.0.0.1 >"
...           

最後啟動這幾個容器(如果對docker-compose熟悉就會知道,不熟悉可以從byfn.sh或build your fist network的手動調試說明中中找到):

cd work_dir/first-network
#啟動網絡,加-d參數背景運作
docker-compose -f docker-compose-cli.yaml up -d
           

測試

現在Goland中的orderer和docker管理的其他幾個子產品都起來了,可以在源碼中打斷點調試互動過程,簡單起見,選用官文build your first network中的[Create & Join Channel]來測。

先在fabric/orderer/common/server/server.go的 func (dmt *deliverMsgTracer) Recv()第一行打上斷點,然後F9讓程式跳過之前Main函數處的斷點,等待接收消息。

然後利用cli容器發送channel建立消息:

cd work_dir/first-network
docker exec -it cli bash

# 發送channel建立請求
export CHANNEL_NAME=mychannel

peer channel create -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/channel.tx --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

           

可以看到程式在斷點處停下來:

image-20191219111722411.png

hyperledger fabric 源碼調試(orderer)環境搭建教程

成功!

後續其他節點的調試也可以照葫蘆畫瓢來做。

(完)

繼續閱讀