HyperLedger Fabric v1.1.0-alpha 版本源码编译及单节点网络搭建

本文主要参考:https://blog.csdn.net/honganboy/article/details/78714578 的介绍,十分感谢作者。但是安装版本和环境不同,安装过程也遇到了一些小问题,因此也再写一篇供大家参考。

安装环境:操作系统-64位Centos7.2,Fabric版本-v1.1.0-alpha,Go语言版本-1.9.4

安装Go后,使用go env命令查看GOPATH,本且在本地尝试echo $GOPATH查看路径(如果不是同一个安装用户,可能为空)

一.编译Fabric源码

首先构建测试文件夹,在当前用户目录下创建如下文件结构:

fabric-1.1-release
----bin(放置所有编译后的二进制文件)
----networks(放置但节点网络所需的配置文件和区块链账本数据)
----chaincodes(放置链码相关,本篇暂不涉及)

下载Fabric v1.1.0-alpha 版本源码至GOPATH

wget https://codeload.github.com/hyperledger/fabric/tar.gz/v1.1.0-alpha
tar -xvf v1.1.0-alpha

mkdir -p $GOPATH/src/github.com/hyperledger
mv fabric-1.1.0-alpha $GOPATH/src/github.com/hyperledger/fabric

获取编译常量值,在farbic源码目录下运行make test-cmd命令获取-ldflags选项的取值:


之后编译源码时,都需要带着-ldflags指定。切换fabric-1.1-release/bin,开始进行编译

编译Orderer

Orderer节点是用于对交易进行排序和共识,生产环境可以支持Kafka模式。

go build -gcflags "-N -l" -ldflags "-X github.com/hyperledger/fabric/common/metadata.Version=1.1.1-snapshot-38c190f -X github.com/hyperledger/fabric/common/metadata.BaseVersion=0.4.6 -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=true" github.com/hyperledger/fabric/orderer

编译Peer

Peer节点功能包含两部分,一部分是服务端用于交易的背书,提交等;另一部分是作为peer cli,支持命令行指令去配置channel、chaincode等。

go build -gcflags "-N -l" -ldflags "-X github.com/hyperledger/fabric/common/metadata.Version=1.1.1-snapshot-38c190f -X github.com/hyperledger/fabric/common/metadata.BaseVersion=0.4.6 -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=true" 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.1-snapshot-38c190f -X github.com/hyperledger/fabric/common/metadata.BaseVersion=0.4.6 -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=true" github.com/hyperledger/fabric/common/tools/cryptogen

编译configtxgen

configtxgen为区块链配置工具,用于生成orderer节点的创世区块、channel的配置、锚节点的配置等。

go build -gcflags "-N -l" -ldflags "-X github.com/hyperledger/fabric/common/metadata.Version=1.1.1-snapshot-38c190f -X github.com/hyperledger/fabric/common/metadata.BaseVersion=0.4.6 -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=true" github.com/hyperledger/fabric/common/tools/configtxgen

验证编译结果

使用orderer version和peer version可以验证编译结果


二.生成配置文件

启动网络前,需要生三个配置文件:(1)使用cryptogen生成网络需要的安全证书;(2)使用configtxgen生成Orderer的创世纪区块;(3)使用configtxgen创建channel配置文件。在networks目录下,新建single-dev-env/config文件夹,用于存放配置文件。下面默认命令执行目录是~/fabric-1.1-release

生成安全证书

使用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
cryptogen generate --config=networks/single-dev-env/config/crypto-config.yaml --output=networks/single-dev-env/config/crypto-config

可以使用tree命令查看生成证书文件,如下图所示。搭建Fabric运行环境,Peer节点、Orderder节点和Peer Client节点(命令行部署chaincode、调用合约)都需要msp和tls证书,msp用于网络的成员关系管理,认证了参与者的身份;tls是用于安全通信,本次测试环境暂不开启。

生成创世纪区块

参考官方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:

直接修改host文件,增加域名和LocalIP的映射。sudo vi /etc/hosts

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

直接使用上一小节终端,配置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
执行完成后,可以在config文件夹下看到genesis.block文件。

生成channel配置文件

继续使用上一小节终端,在networks/single-dev-env/config下,创建channel-artifacts目录,生成mychannel的配置文件:

mkdir networks/single-dev-env/config/channel-artifacts
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源码里的sampleconfig文件下core.yaml(peer节点使用)和orderer.yaml文件。

启动Orderer节点

新打开一个终端,切换到~/fabric-1.1-release目录并设环境变量(可写如文件,再执行source命令),配置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命令,看到如下输出即证明启动成功:

启动Peer节点

新打开一个终端,切换到~/fabric-1.1-release目录并设环境变量(可写如文件,再执行source命令),配置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启动成功后,控制台输出如下: 


四.创建并加入通道

创建通道

新打开一个终端,切换到~/fabric-1.1-release目录并设环境变量:

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/[email protected]/msp

执行创建命令:

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

执行成功后终端输出:


peer节点服务输出,在mychannel的通道上部署了系统链码:


五.部署链码及示例调用

$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是读操作,不写账本,也不生成块。

启动链码

新打开一个终端,配置环境变量并启动,链码会自动连接peer节点:

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

成功启动后,控制台输出如下:


部署链码

新打开一个终端,配置环境变量并启动:

export rootDir=$(pwd)
export PATH=$rootDir/bin:$PATH
export CHANNEL_NAME=mychannel
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/[email protected]/msp

注:环境变量与创建通道类似,但不能配置CORE_CHAINCODE_MODE=dev,否则会install时,链码部署文件(CDS)会包含空的codepacke,peer服务校验不通过。

第1步:install链码

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

安装成功后,控制台输出如下:

第2步:instantiate链码

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

实例化成功后,Alice和Bob账户均初始化100,控制台输出如下:


调用链码

继续使用上一小节终端,运行调用合约命令,从Bob账户转20到Alice账户:

peer chaincode invoke -o orderer.example.com:7050 -C $CHANNEL_NAME -n mycc -c  "{\"Args\":[\"invoke\",\"Bob\",\"Alice\",\"20\"]}"
运行成功,控制台输出如下:

查询Alice账户余额:

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

至此已成功完成当节点网络搭建,可以成功进行合约的部署和调用。







猜你喜欢

转载自blog.csdn.net/cx351864995/article/details/80484673