Native方式運行Fabric(非Docker方式)

官方文檔及網上的文章通常都是介紹如何使用Docker搭建第一個Fabric網絡,並且搭建的第一個網絡就有四個Peer節點,這樣過於複雜,並且下載一大堆Docker鏡像,也比較費時間。所以,我這節將首先介紹如何根據fabric源碼編譯出可執行程序,而後介紹如何直接用這些可執行程序搭建單個Peer節點的網絡。node

本節相關操做是在64位 Ubuntu 16.04下進行的,開始本節以前,請確保你已經按照了golang 1.9.2,而且已經配置了GO相關的環境變量,例如,我機器的go環境以下: 
go envgit

編譯Fabric源碼

下載源碼

在$GOPATH下創建目錄結構src/github.com/hyperledger,切換到此目錄後下載fabric 1.1.0-preview版源碼:github

mkdir -p $GOPATH/src/github.com/hyperledger
cd $GOPATH/src/github.com/hyperledger
wget https://github.com/hyperledger/fabric/archive/v1.1.0-preview.tar.gz

而後,解壓文件並將解壓後獲得的目錄重命名爲fabric:golang

tar -zxvf v1.1.0-preview.tar.gz
mv fabric-1.1.0-preview fabric

編譯可執行程序

開始編譯以前,到fabric源碼目錄下執行make test-cmd命令獲取-ldflags選項的取值: 
make test-cmd
接下來,編譯每一個可執行程序時都要帶上-ldflags選項。shell

爲了方即可執行程序的管理及後續編寫相關shell腳本,先在當前用戶的home目錄下創建以下目錄結構數組

fabric-1.1.0-preview-demo(後續全部的例子都放在此目錄下)
----bin(編譯的可執行程序放在此目錄下) ----networks(fabric網絡相關配置在此目錄下) ----chaincodes(鏈碼相關源碼放在此目錄下)

相關腳本以下:bash

mkdir -p ~/fabric-1.1.0-preview-demo/bin
mkdir -p ~/fabric-1.1.0-preview-demo/networks
mkdir -p ~/fabric-1.1.0-preview-demo/chaincodes

cd ~/fabric-1.1.0-preview-demo/bin切換到剛創建的bin目錄下,就能夠開始編譯了。網絡

編譯orderer

Orderer用於處理交易的排隊及共識。編譯命令以下:測試

go build -gcflags "-N -l" -ldflags "-X github.com/hyperledger/fabric/common/metadata.Version=1.1.0-preview -X github.com/hyperledger/fabric/common/metadata.BaseVersion=0.4.2 -X github.com/hyperledger/fabric/common/metadata.BaseDockerLabel=org.hyperledger.fabric -X github.com/hyperledger/fabric/common/metadata.DockerNamespace=hyperledger -X github.com/hyperledger/fabric/common/metadata.BaseDockerNamespace=hyperledger -X github.com/hyperledger/fabric/common/metadata.Experimental=false" github.com/hyperledger/fabric/orderer

編譯時加入-gcflags可讓編譯器忽略一些優化,方便後面在調試可執行程序時觀察變量及對應代碼行號。優化

編譯peer

go build -gcflags "-N -l" -ldflags "-X github.com/hyperledger/fabric/common/metadata.Version=1.1.0-preview -X github.com/hyperledger/fabric/common/metadata.BaseVersion=0.4.2 -X github.com/hyperledger/fabric/common/metadata.BaseDockerLabel=org.hyperledger.fabric -X github.com/hyperledger/fabric/common/metadata.DockerNamespace=hyperledger -X github.com/hyperledger/fabric/common/metadata.BaseDockerNamespace=hyperledger -X github.com/hyperledger/fabric/common/metadata.Experimental=false" github.com/hyperledger/fabric/peer

編譯cryptogen

cryptogen用於生成交易簽名及SSL通訊用到證書及私鑰對,能夠使用fabric-ca或者其餘ca頒發的證書,但測試環境使用crytogen更簡單。編譯命令以下:

go build -gcflags "-N -l" -ldflags "-X github.com/hyperledger/fabric/common/metadata.Version=1.1.0-preview -X github.com/hyperledger/fabric/common/metadata.BaseVersion=0.4.2 -X github.com/hyperledger/fabric/common/metadata.BaseDockerLabel=org.hyperledger.fabric -X github.com/hyperledger/fabric/common/metadata.DockerNamespace=hyperledger -X github.com/hyperledger/fabric/common/metadata.BaseDockerNamespace=hyperledger -X github.com/hyperledger/fabric/common/metadata.Experimental=false" github.com/hyperledger/fabric/common/tools/cryptogen

編譯configtxgen

configtxgen用於生成Orderer的創世紀塊及通道配置交易等內容。編譯命令以下:

go build -gcflags "-N -l" -ldflags "-X github.com/hyperledger/fabric/common/metadata.Version=1.1.0-preview -X github.com/hyperledger/fabric/common/metadata.BaseVersion=0.4.2 -X github.com/hyperledger/fabric/common/metadata.BaseDockerLabel=org.hyperledger.fabric -X github.com/hyperledger/fabric/common/metadata.DockerNamespace=hyperledger -X github.com/hyperledger/fabric/common/metadata.BaseDockerNamespace=hyperledger -X github.com/hyperledger/fabric/common/metadata.Experimental=false" github.com/hyperledger/fabric/common/tools/configtxgen

上述編譯都結束後,bin目錄下就有了四個可執行程序: 
編譯結果

能夠使用chmod命令給這些程序加上可執行權限,而後能夠使用version子命令查看相應程序的版本: 
version

搭建單個Peer節點網絡

本節將演示如何搭建一個Peer節點和一個Orderer節點的網絡。開始以前,先在~/fabric-1.1.0-preview-demo/networks下創建以下結構的目錄:

single-dev-env
--config(存放配置文件) ----channel-artifacts(存放後面要生成的通道配置交易等文件)

shell命令:

mkdir -p ~/fabric-1.1.0-preview-demo/networks/single-dev-env/config/channel-artifacts

Fabric中搭建一個網絡須要以下步驟: 
1. 使用cryptogen生成網絡須要的證書。 
2. 使用configtxgen生成Orderer的創世紀塊 
3. 使用configtxgen建立通道配置交易 
4. 使用peer cli建立及加入通道

注意:若是沒有特殊說明,接下來的命令均是在~/fabric-1.1.0-preview-demo目錄下執行的。

生成證書

使用cryptogen生成網絡須要的證書,需指定配置文件,參考官方fabric-samples的first-network的crypto-config.yaml文件,編寫只有一個orderer和一個peer的配置文件crypto-config.yaml(放在single-dev-env/config目錄下):

OrdererOrgs:
  - Name: Orderer     Domain: example.com
    Specs:
      - Hostname: orderer PeerOrgs:
  - Name: Org     Domain: example.com
    Template:
      Count: 1
      Hostname: peer
    Users:
      Count: 1
export PATH=$(pwd)/bin:$PATH
cryptogen generate --config=networks/single-dev-env/config/crypto-config.yaml --output=networks/single-dev-env/config/crypto-config

fabric編譯成的二進制文件均可以使用<命令> <命令> –help查看幫助。

命令執行成功後,networks/single-dev-env/config/crypto-config目錄下生成了以下結構的證書目錄: 
證書結構

orderer.example.com目錄存放的是Orderer節點須要的證書,等會啓動Orderer節點時須要指定msp目錄: 
orderer證書

peer.example.com目錄存放的是Peer節點須要的證書,等會啓動Peer節點時須要指定msp目錄: 
peer證書

Admin@example.com目錄下的證書是Peer節點管理員證書,建立、加入通道、發送交易等操做都是用此目錄下的證書進行簽名,所以,咱們使用peer cli時須要指定msp目錄: 
admin證書

使用configtxgen生成Orderer的創世紀塊

參考官方fabric-samples的first-network的configtx.yaml文件編寫一個configtx.yaml文件(放在single-dev-env/config目錄下):

Profiles:
    SingleSoloOrdererGenesis:
        Orderer:
            <<: *OrdererDefaults
            Organizations:
                - *OrdererOrg         Consortiums:
            SampleConsortium:
                Organizations:
                    - *Org     SingleSoloChannel:
        Consortium: SampleConsortium
        Application:
            <<: *ApplicationDefaults
            Organizations:
                - *Org 
Organizations:
    - &OrdererOrg         Name: OrdererOrg
        ID: OrdererMSP
        MSPDir: crypto-config/ordererOrganizations/example.com/msp

    - &Org         Name: OrgMSP
        ID: OrgMSP
        MSPDir: crypto-config/peerOrganizations/example.com/msp
        AnchorPeers:
            - Host: peer.example.com               Port: 7051

Orderer: &OrdererDefaults
    OrdererType: solo
    Addresses:
        - orderer.example.com:7050     BatchTimeout: 2s
    BatchSize:
        MaxMessageCount: 10
        AbsoluteMaxBytes: 99 MB
        PreferredMaxBytes: 512 KB
    Organizations:

Application: &ApplicationDefaults
    Organizations:

sudo gedit /etc/hosts修改/etc/hosts,追加上以下內容並保存:

127.0.0.1       example.com
127.0.0.1       orderer.example.com
127.0.0.1       peer.example.com

Fabric使用X.509證書做爲節點及用戶的身份,而證書通常優於域名管理,所以,這裏作了域名映射。

設置FABRIC_CFG_PATH環境變量告訴configtxgen去哪一個目錄尋找configtx.yaml文件,使用「生成證書」一節用到終端執行以下命令:

export FABRIC_CFG_PATH=$(pwd)/networks/single-dev-env/config/

使用上一小節用到終端執行以下命令:

configtxgen -outputBlock networks/single-dev-env/config/genesis.block -profile SingleSoloOrdererGenesis

本步驟及下一步中的-profile選項的取值均是與configtx.yaml文件內容對應。

命令執行成功後,networks/single-dev-env/config目錄下就多了一個genesis.block文件: 
genesis.block文件

使用configtxgen建立通道配置交易

使用上一小節用到終端執行以下命令::

export CHANNEL_NAME=mychannel
configtxgen -outputCreateChannelTx  networks/single-dev-env/config/channel-artifacts/channel.tx -profile SingleSoloChannel -channelID $CHANNEL_NAME

命令執行成功後,networks/single-dev-env/config/channel-artifacts目錄下多了一個channel.tx文件。

啓動Orderer和Peer節點

本小節是使用環境變量配置Orderer和Peer節點,其實也能夠使用yaml文件配置,後面再介紹。

新打開一個終端,切換到~/fabric-1.1.0-preview-demo目錄並設環境變量配置Orderer節點:

export rootDir=$(pwd)
export PATH=$rootDir/bin:$PATH
export ORDERER_GENERAL_LOGLEVEL=DEBUG
export ORDERER_GENERAL_TLS_ENABLED=false
export ORDERER_GENERAL_PROFILE_ENABLED=false
export ORDERER_GENERAL_LISTENADDRESS=0.0.0.0
export ORDERER_GENERAL_LISTENPORT=7050
export ORDERER_GENERAL_GENESISMETHOD=file
export ORDERER_GENERAL_GENESISFILE=$rootDir/networks/single-dev-env/config/genesis.block
export ORDERER_GENERAL_LOCALMSPDIR=$rootDir/networks/single-dev-env/config/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp
export ORDERER_GENERAL_LOCALMSPID=OrdererMSP
export ORDERER_FILELEDGER_LOCATION=$rootDir/networks/single-dev-env/data/orderer

啓動Orderer節點:

orderer

爲了方便,能夠把環境變量的設置及orderer啓動的命令寫在shell腳本中。

Orderer啓動成功後,控制檯輸出以下: 
Orderer啓動後輸出

再打開一個終端,切換到~/fabric-1.1.0-preview-demo目錄並設環境變量配置Peer節點:

export rootDir=$(pwd)
export PATH=$rootDir/bin:$PATH
export CORE_PEER_ID=example_org
export CORE_CHAINCODE_MODE=dev
export CORE_PEER_CHAINCODELISTENADDRESS=0.0.0.0:7052
export CORE_PEER_NETWORKID=dev
export CORE_LOGGING_LEVEL=INFO
export CORE_PEER_TLS_ENABLED=false
export CORE_PEER_PROFILE_ENABLED=false
export CORE_PEER_ADDRESS=0.0.0.0:7051
export CORE_PEER_LISTENADDRESS=0.0.0.0:7051
export CORE_PEER_GOSSIP_ENDPOINT=0.0.0.0:7051
export CORE_PEER_EVENTS_ADDRESS=0.0.0.0:7053
export CORE_PEER_LOCALMSPID=OrgMSP
export CORE_LEDGER_STATE_STATEDATABASE=goleveldb
export CORE_PEER_MSPCONFIGPATH=$rootDir/networks/single-dev-env/config/crypto-config/peerOrganizations/example.com/peers/peer.example.com/msp
export CORE_PEER_FILESYSTEMPATH=$rootDir/networks/single-dev-env/data/peer

啓動:

peer node start -o 127.0.0.1:7050 --peer-chaincodedev=true

Peer啓動成功後,控制檯輸出以下: 
Peer啓動輸出日誌

建立通道

新打開一個終端,切換到~/fabric-1.1.0-preview-demo目錄並設環境變量:

export rootDir=$(pwd)
export PATH=$rootDir/bin:$PATH
export CHANNEL_NAME=mychannel
export CORE_CHAINCODE_MODE=dev
export CORE_PEER_ID=peer-cli
export CORE_PEER_ADDRESS=peer.example.com:7051
export CORE_PEER_LOCALMSPID=OrgMSP
export CORE_PEER_MSPCONFIGPATH=$rootDir/networks/single-dev-env/config/crypto-config/peerOrganizations/example.com/users/Admin@example.com/msp

這些環境變量之後操做時常常用到,能夠保存在一個文本文件中,新開終端就使用source <文件名>使其生效。

peer channel create -o orderer.example.com:7050 -c $CHANNEL_NAME -f  $rootDir/networks/single-dev-env/config/channel-artifacts/channel.tx

執行成功後,當前目錄生成了一個mychannel.block文件: 
通道建立成功

加入通道

在上一小節使用到終端執行以下命令:

peer channel join -b $CHANNEL_NAME.block

執行成功後,終端輸入日誌: 
join

啓動Peer節點的終端打印日誌: 
初始化系統鏈碼
從日誌中能夠看到,節點加入通道後會建立一個通道對應的帳本並在通道上部署系統鏈碼。

部署及調用官方鏈碼示例

$GOPATH/src/github.com/hyperledger/fabric/examples/chaincode目錄下有官方提供的各類語言的鏈碼示例,本節將演示如何部署及調用一個簡單的go語言示例——fabric/examples/chaincode/go/chaincode_example02。

鏈碼部署及調用過程以下: 
1. 啓動鏈碼對應的程序; 
2. 部署鏈碼,分install和instantiate兩個階段。其中,install將鏈碼源碼打包成鏈碼部署文件(CDS)並上傳到Peer節點,instantiate將根據CDS生成鏈碼對應的Docker容器,啓動容器並執行鏈碼的實例化操做,通常是調用鏈碼的init方法。這裏描述的instantiate是使用「network」模式運行鏈碼,而咱們這次測試使用的是「dev」模式,由啓動Peer節點時設置的CORE_CHAINCODE_MODE環境變量的值決定的。 
3. 調用鏈碼,分invoke和query兩種操做。invoke是寫操做,可修改帳本,能產生塊,而query是讀操做,不寫帳本,也不生成塊。

啓動鏈碼

打開一個終端,執行以下命令:

export CORE_CHAINCODE_ID_NAME=mycc:1.0
export CORE_PEER_ADDRESS=peer.example.com:7052
go run $GOPATH/src/github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02/chaincode_example02.go

啓動成功後,控制檯輸出以下: 
鏈碼啓動輸出

這裏使用go run命令直接運行的,固然,也能夠先使用go build -gcflags "-N -l" github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02將鏈碼編譯成可執行程序再運行。

部署鏈碼

新打開一個終端,切換到~/fabric-1.1.0-preview-demo目錄,首先參照「建立通道」一節設置環境變量。

第1步:install鏈碼

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

選項說明:

  • -n:指定鏈碼名稱
  • -v:鏈碼版本
  • -p:鏈碼源碼所在目錄

終端輸出: 
終端輸出

peer節點帳本目錄的chaincodes目錄下生成了一個文件,其名稱是由鏈碼名稱和版本號組成的。

第2步:instantiate鏈碼

peer chaincode instantiate -o orderer.example.com:7050 -C $CHANNEL_NAME -n mycc -v 1.0 -c "{\"Args\":[\"init\",\"a\", \"100\", \"b\",\"200\"]}" -P "OR('OrgMSP.member')"

選項說明:

  • -o:orderer節點的地址
  • -C(大寫):通道名稱
  • -n:鏈碼名稱
  • -v:鏈碼版本
  • -c(小寫):鏈碼實例化時調用的方法及參數,JSON字符串,Args數組的第0個元素是調用的方法,實例化時通常都是init方法,其餘元素是方法的參數。
  • -P(大寫):背書策略,即交易由哪些Peer節點簽名後纔是合法的。之後再詳細說明。

當前終端輸出內容以下: 
這裏寫圖片描述

初始化了兩個狀態A和B,其初始值分別爲100和200(啓動鏈碼的終端輸出的內容): 
鏈碼實例化

此外,peer和orderer的終端也有相應的日誌輸出。

調用鏈碼

本節的操做都是使用上一小節部署鏈碼用的終端。

首先,使用invoke操做把A的餘額轉10到B:

peer chaincode invoke -o orderer.example.com:7050 -C $CHANNEL_NAME -n mycc -c  "{\"Args\":[\"invoke\",\"a\",\"b\",\"10\"]}"

這裏寫圖片描述

接下來,再使用query操做查詢A的餘額,發現確實少了10:

peer chaincode query -C $CHANNEL_NAME -n mycc -c "{\"Args\":[\"query\",\"a\"]}"

這裏寫圖片描述

相關文章
相關標籤/搜索