文章目录

前言

本文按照《Faric2.0学习进阶--自定义网络部署》、《Fabric2.0--链码管理》相关教程学习,按照教程的步骤进行部署,在部署过程中会遇到错误,本文按照在部署过程中的步骤以及出现的错位进行详细记录。相比于原教程,会有详细的执行过程与执行结果的指令与结果图片,仅以次作为补充,希望对初入Fabric2.0部署的同学有所帮助。下面是所看博客的链接:
http://javatech.wang/index.php/archives/152/   作者:xiaohui249


1.前期工作

根据原博客提示,所有操作均在/usr/local/src/hyperleger/fabric/scripts/fabric-samples/first-network目录执行。

1.1 添加环境变量,并将使环境变量生效。

# 设置环境变量
sudo vim /etc/profile
# 将以下内容追加到文件末尾
export PATH=${PWD}/../bin:${PWD}:$PATH
export FABRIC_CFG_PATH=${PWD}
# 使环境变量生效
source /etc/profile

1.2.获取root权限。

在虚拟机中获取输入sudo -i 获取 root权限,拿到对文件修改的权限,方便后续的文件修改、备份。如果不获取root权限在修改文件时候仅仅会显示只读选项。获得root权限之后,只读选项会变为保存。

2.生成证书

按照前面给的教程进行手动部署Fabric2.0。规划Fabric平台由3个order节点,2个组织,4个peer节点组成,每个组织两个peer节点。Fabric2.0的共识机制只支持raft协议,该协议实现的共识必须至少3个节点,节点数最好为奇数。

Fabric平台是许可区块链平台,通过数字证书实现平台参与者对平台资源的访问操作权限,使网络具备更高的安全性。

证书生成需要使用cryptogen工具以及配置文件crypto-config.yaml。

crypto-config.yaml存在于/usr/local/src/hyperleger/fabric/scripts/fabric-samples/first-network目录下。

根据平台的节点规划,修改crypto-config.yaml,修改之前先将crypto-config.yaml 备份。

2.1输入指令

vim  crypto-config.yaml

 修改如下:

上图中,Order组织定义了三个节点:orderer,orderer2,orderer3,peer组织包括Org1和Org2两个组织,每个组织包括2个节点,包括Admin用户和1个普通用户。

配置文件修改完成之后,直接运行如下命令完成order节点、peer节点、管理员和用户的证书生成。

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

执行过程:

2.2 查看目录结构

成功执行之后,当前目录下将生成crypto-config目录,输入指令查看目录结构:

tree -L 3 crypto-config

目录结构如下图所示:

 

 3.创世区块

创世区块的生成需要使用configtxgen工具以及配置文件configtx.yaml。

根据平台的节点规划将orderer4和orderer5相关的配置注释,因为本文规划的fabric网络只包含3个order节点,修改(记得备份)内容如下:

3.1 输入指令

vim configtx.yaml

修改如下:

 配置文件修改完成之后,执行如下命令:

configtxgen -profile SampleMultiNodeEtcdRaft -channelID byfn-sys-channel -outputBlock ./channel-artifacts/genesis.block

执行命令之后会报错:

3.2解决方法:

出现此类错误的原因在于没有将环境变量生效,输入命令使得环境变量生效之后再执行.

# 使环境变量生效
source /etc/profile

再次执行: 

执行成功之后,channel-artifacts目录下将生成创世区块文件genesis.block。

4.生成通道配置文件

4.1.输入指令

configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID mychannel

执行过程如下: 

执行成功后会在channel-artifact目录下生成channel.tx文件

所生成的文件如下:

5.生成锚节点配置文件

执行如下命令,完成Org1和Org2两个组织锚节点配置文件的创建。

# 生成Org1的锚节点配置文件
configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID mychannel -asOrg Org1MSP

# 生成Org2的锚节点配置文件
configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID mychannel -asOrg Org2MSP

成功执行之后,channel-artifacts目录下将生成两个锚节点配置文件Org1MSPanchors.tx和Org2MSPanchors.tx。

 6.启动&停止网络

 Fabric网络服务以docker方式启动,涉及命令docker-compose和配置文件docker-compose-cli.yaml、docker-compose-etcdraft2.yaml、docker-compose-ca.yaml。

本文规划的fabric网络包括10个docker服务:4个peer节点服务,3个order节点服务,2个CA服务,1个cli服务。

修改配置文件docker-compose-etcdraft2.yaml,注释掉orderer4和orderer5的相关配置。

 执行如下命令,将启动3个order节点服务,1个cli节点服务,4个peer节点服务。

# 配置环境变量,CA节点必需
export BYFN_CA1_PRIVATE_KEY=$(cd crypto-config/peerOrganizations/org1.example.com/ca && ls \*_sk)
export BYFN_CA2_PRIVATE_KEY=$(cd crypto-config/peerOrganizations/org2.example.com/ca && ls \*_sk)

# 根据指定配置文件启动容器服务
docker-compose -f docker-compose-cli.yaml -f docker-compose-etcdraft2.yaml -f docker-compose-ca.yaml up -d

 执行过程如下:

 输入docker ps 查看当前的docker情况

停止网络

docker-compose -f docker-compose-cli.yaml -f docker-compose-etcdraft2.yaml -f docker-compose-ca.yaml  down

Fabric平台所有节点服务均正常启动,后续的操作均需进入cli容器执行相关命令。 

7.创建通道

进入cli容器:

#连接cli服务
docker exec -it cli bash
​
#定义CA文件路径
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 mychannel -f ./channel-artifacts/channel.tx --tls true --cafile $ORDERER_CA
​
#将生成的文件移动到channel-artifacts文件夹中
mv mychannel.block channel-artifacts/

创建通道信息

将生成的文件移动到channel-artifacts文件夹中 

8.peer节点加入通道

上一步我们创建了一个名称为mychannel的通道,但该通道还没有任何peer节点加入,则无法进行交易操作,本节将2个组织的4个节点都加入到mychannel通道。

通过查看环境变量,当前cli容器使用的org1.peer0的配置。

输入 env |grep CORE 查看当前的环境变量

按照当前的配置,我们执行如下命令,先将org1.peer0节点加入mychannel通道。 

peer channel join -b channel-artifacts/mychannel.block

执行过程: 

 切换节点,将org1.peer1加入mychannel通道:

#切换节点org1.peer1
source scripts/utils.sh
setGlobals 1 1
# 将当前节点加入通道
peer channel join -b channel-artifacts/mychannel.block

执行过程:

切换节点,将org2组织的两个节点也加入通道:

#切换节点org2.peer0
source scripts/utils.sh
setGlobals 0 2
# 将当前节点加入通道
peer channel join -b channel-artifacts/mychannel.block
​
#切换节点org2.peer1
setGlobals 1 2
# 将当前节点加入通道
peer channel join -b channel-artifacts/mychannel.block

执行过程:

9.更新锚节点

锚节点是组织内的一种特殊peer节点,通过锚节点可以实现不同组织内节点间的通信。通常每次组织都要设置一个锚节点,下面分别对org1和org2两个组织设置锚节点,本文假设将组织中的peer0节点设置为锚节点。

#切换到org1.peer0节点
setGlobals 0 1
#设置环境变量ORDERER_CA
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 update -o orderer.example.com:7050 -c mychannel -f ./channel-artifacts/Org2MSPanchors.tx --tls true --cafile $ORDERER_CA
​
#切换到org2.peer0节点
setGlobals 0 2
#设置环境变量ORDERER_CA
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 update -o orderer.example.com:7050 -c mychannel -f ./channel-artifacts/Org2MSPanchors.tx --tls true --cafile $ORDERER_CA

执行过程: 

手动配置并启动了一个fabric网络,包含3个orderer节点,2个组织4个peer节点,2个ca节点,1个cli节点,1个通道mychannel,后续文章

10. 链码安装

10.1 启动docker

启动docker 

docker-compose -f docker-compose-cli.yaml -f docker-compose-etcdraft2.yaml -f docker-compose-ca.yaml up -d

启动成功如下图所示:

10.2 进入cli

安装链码的所有操作均需要先进入cli容器,执行如下命令:

docker exec -it cli bash

11. 链码打包

11.1 命令如下

链码打包执行如下命令:

peer lifecycle chaincode package abs.tar.gz --path github.com/hyperledger/fabric-samples/chaincode/abstore/go/ --lang golang --label abs_1

abs.tar.gz:打包合约包文件名

--path:智能合约路径

--lang:智能合约语言,支持golang、Java、node

--label:智能合约标签,起描述作用

执行成功之后,当前目录下将生成文件abs.tar.gz。



11.2 链码安装

查看安装结果:

peer lifecycle chaincode queryinstalled

接下来为org2.peer0安装智能合约代码,执行如下命令切换环境变量:

source scripts/utils.sh
setGlobals 0 2

输入如下命令查看切换结果,如下图所示:

env | grep CORE

 结果如下:

执行链码安装命令,则可以把上述打包的合约代码安装到org2.peer0节点上。

peer lifecycle chaincode install abs.tar.gz

执行结果: 

11.3 链码认证

链码安装完成之后需要被组织认证,认证通过之后才能将链码提交并运行,该过程又可以称为合约定义,定义了合约的名称、版本、序列号,后续合约升级即修改版本或序列号,重新定义合约。

执行如下代码,完成当前节点所在组织对上述安装链码的认证。

peer lifecycle chaincode approveformyorg --tls true --cafile $ORDERER_CA --channelID mychannel --name abs --version 1 --init-required --package-id abs_1:90786e8a73dbee43adfebeb316407387173f598a5f7e3cef7ddc754fe25e2ad6 --sequence 1 --waitForEvent

切换环境,实现org1组织对上述安装链码的认证。

切换环境:

source scripts/utils.sh
setGlobals 0 1

查看当前环境:

env | grep CORE

结果显示如下:

安装链码认证:

peer lifecycle chaincode approveformyorg --tls true --cafile $ORDERER_CA --channelID mychannel --name abs --version 1 --init-required --package-id abs_1:90786e8a73dbee43adfebeb316407387173f598a5f7e3cef7ddc754fe25e2ad6 --sequence 1 --waitForEvent

执行过程如下: 

最后查看链码认证结果,执行如下命令:

peer lifecycle chaincode checkcommitreadiness --channelID mychannel --name abs --version 1 --sequence 1 --output json --init-required

上图结果表示:通道mychannel中的两个组织Org1和Org2均已对智能合约链码abs认证通过。

11.4 链码提交

只有通过组织认证的链码才能被提交。执行如下命令提交链码:

peer lifecycle chaincode commit -o orderer.example.com:7050 --tls true --cafile $ORDERER_CA --channelID mychannel --name abs --peerAddresses peer0.org1.example.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses peer0.org2.example.com:9051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt --version 1 --sequence 1 --init-required

执行过程:

查看提交结果,执行如下命令:

peer lifecycle chaincode querycommitted --channelID mychannel --name abs

12 调用链码

链码调用主要包括invoke和query两个操作,本节将演示智能链码数据初始化、数据查询以及数据更新。

12.1 链码初始化

执行如下命令调用链码初始化方法,并指定初始化参数和值。

peer chaincode invoke -o orderer.example.com:7050 --tls true --cafile $ORDERER_CA -C mychannel -n abs --peerAddresses peer0.org1.example.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses peer0.org2.example.com:9051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt --isInit -c '{"Args":["Init","a","100","b","100"]}'

执行过程如下:

12.2 数据查询

执行如下命令查询参数a的值。

peer chaincode query -C mychannel -n abs -c '{"Args":["query","a"]}'

执行过程如下: 

12.3 数据更新

执行如下命令调用合约的invoke方法,实现参数a的值减少10,参数b的值增加10。

peer chaincode invoke -o orderer.example.com:7050 --tls true --cafile $ORDERER_CA -C mychannel -n abs --peerAddresses peer0.org1.example.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses peer0.org2.example.com:9051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt -c '{"Args":["invoke","a","b","10"]}'

执行如下命令查询参数a的值:

peer chaincode query -C mychannel -n abs -c '{"Args":["query","a"]}'

 执行如下命令查询参数b的值:

peer chaincode query -C mychannel -n abs -c '{"Args":["query","b"]}'

执行结果如下图所示:

 

13 升级链码

链码(合约)升级的关键之处在于合约定义,即链码认证。升级链码之后将重新定义合约,修改合约的版本号或者序列号。

13.1 获取合约代码

升级链码的第一步应该是获取合约代码,获取合约代码有两种方式:

  • 根据11.1节链码打包命令参数--path指定的路径获取代码;

  • 通过peer脚本获取已安装的合约代码包,执行如下命令:

    #查看已安装的合约代码包,获取对应包的package-id值
    peer lifecycle chaincode queryinstalled
    

    执行结果如下图所示:

    可以看到安装的合约代码 Package ID :abs_1:90786....ad6.分别执行以下指令:

 查看链码之后,将此链码包下载:

#下载指定合约代码包
peer lifecycle chaincode getinstalledpackage --package-id abs_1:90786e8a73dbee43adfebeb316407387173f598a5f7e3cef7ddc754fe25e2ad6

 将链码包重命名为abs.tar.gz

 查看目录:

 ls

执行过程: 

 

输入以下指令查看链码包中的文件:

 

tar -tvf abs.tar.gz

 执行过程如下:

总的过程如下:

当前目录下多了一个以package-id值命名的压缩文件,重命名该文件为abs.tar.gz,通过tar命令查看该压缩包包含一个json文件和一个压缩包。Json文件是对压缩包的描述,code.tar.gz则是合约源码,是我们本次的修改目标,将该包解压之后我们继续接下来的操作。

14 修改合约代码

通过以下命令进行解压:

tar -zxvf abs.tar.gz

执行过程如下

接下来开始修改合约代码。

本次修改目标文件为:abstore.go,增加一个Add函数,

输入以下命令进入到abstore.go所在的目录:

usr/local/src/hyperleger/fabric/scripts/fabric-samples/chaincode/abstore/go

 

通过如下命令进入到abstore.go文件中进行文件的修改:

vim abstore.go

具体内容如下:

func (t *ABstore) Add(ctx contractapi.TransactionContextInterface, A string, X int) error {
        var err error
        //Get the state from the leger
        Avalbytes, err := ctx.GetStub().GetState(A)
        if err != nil {
                return fmt.Errorf("Failed to get state for " + A)
        }

        if Avalbytes == nil {
                return fmt.Errorf("Nil amount for " + A)
        }

        var Aval int
        Aval, _ = strconv.Atoi(string(Avalbytes))
        Aval = Aval + X

        // Write the state back to the ledger
        err = ctx.GetStub().PutState(A, []byte(strconv.Itoa(Aval)))
        if err != nil {
                return err
        }

        return nil
}

执行过程如下:

14 重新打包合约

代码修改完成之后,重新打包。

执行如下指令:

docker exec -it cli bash
peer lifecycle chaincode package abs.tar.gz --path github.com/hyperledger/fabric-samples/chaincode/abstore/go/ --lang golang --label abs_1

15 重新安装合约

# 安装链码
peer lifecycle chaincode install abs.tar.gz
# 查询链码安装结果
peer lifecycle chaincode queryinstalled

执行结果如下图所示:

上图标红的内容为新打包安装成功的合约代码包。

查询发现目前是在Org1,还需要切换到另一个节点重新进行链码安装。

切换节点:org2.peer0安装智能合约代码,执行如下命令切换环境变量:

source scripts/utils.sh
setGlobals 0 2

依次执行如下命令:

env |grep CORE

输出结果中有Org2MSP则证明切换成功:

 打包修改后的合约:

peer lifecycle chaincode package abs.tar.gz --path github.com/hyperledger/fabric-samples/chaincode/abstore/go/ --lang golang --label abs_1

 重新安装合约:

peer lifecycle chaincode install abs.tar.gz

查看安装结果:

peer lifecycle chaincode queryinstalled

命令行以及执行过程如下图所示:

16 修改合约定义

package-id为最新合约包的Package ID,红框中的内容需要保持一致。sequence参数设置为2,因为这是该合约相同版本的第2次安装。

具体执行命令如下:

peer lifecycle chaincode approveformyorg --tls true --cafile $ORDERER_CA --channelID mychannel --name abs --version 1 --init-required --package-id abs_1:013a79f868db17429c3195acacc08ae376994c5a9fb32d2302bef7f49f0354f7 --sequence 2 --waitForEvent

执行过程如下:

切换到另外的组织节点,进行新打包合约代码的定义。

source scripts/utils.sh
setGlobals 0 1

执行过程如下: 

最后查看新合约的定义(认证)结果,执行如下命令:

peer lifecycle chaincode checkcommitreadiness --channelID mychannel --name abs --version 1 --sequence 2 --output json --init-required

上图结果表示:通道mychannel中的两个组织Org1和Org2对新打包的智能合约认证通过。

17 重新提交合约

重新提交合约需要将sequence参数值改为2。

peer lifecycle chaincode commit -o orderer.example.com:7050 --tls true --cafile $ORDERER_CA --channelID mychannel --name abs --peerAddresses peer0.org1.example.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses peer0.org2.example.com:9051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt --version 1 --sequence 1 --init-required

 如果senquence的值为1的话就会报如下错误

正确指令:

peer lifecycle chaincode commit -o orderer.example.com:7050 --tls true --cafile $ORDERER_CA --channelID mychannel --name abs --peerAddresses peer0.org1.example.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses peer0.org2.example.com:9051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt --version 1 --sequence 2 --init-required

 执行结果如下图所示:

查看提交结果,如下图所示:

输入:

peer lifecycle chaincode querycommitted --channelID mychannel --name abs

执行结果:

上图显示合约abs已经提交到通道mychannel,并展示了对应的版本、序列、背书插件、校验插件等信息。

18 检验新合约

本次校验步骤分为三步:

(1) 调用合约的query方法,查询参数a的值;

peer chaincode query -C mychannel -n abs -c '{"Args":["query","a"]}'

(2) 调用合约新增的add方法,将a的值增加30;

peer chaincode invoke -o orderer.example.com:7050 --tls true --cafile $ORDERER_CA -C mychannel -n abs --peerAddresses peer0.org1.example.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses peer0.org2.example.com:9051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt -c '{"Args":["add","a","30"]}'

(3) 再次调用合约的query方法,查询参数a的值,判断上一步是否正确执行;

peer chaincode query -C mychannel -n abs -c '{"Args":["query","a"]}'

上述过程的执行结果如下图所示:

 

从上图的执行结果来看,a的原值为90,调用add方法给a值增加30,再次查询a的值为120,说明合约更新成功,新增的方法也调用成功。

19 其他节点补充安装链码

之前的操作仅在org1.peer0和org2.peer0两个节点上安装并升级了链码,org1.peer1和org2.peer1两个节点未安装链码。当运行基于Fabric SDK编写的Java代码时,调用查询方法失败,报错“abs链码未安装”,应该是客户端把请求发到了未安装链码的两个节点,基于此原因,补充本节内容。

补充安装链码的步骤如下:

(1) 从已安装的peer节点获取安装包。注意此时的abs_1:后面的id一定是与自己配置是生成的链码的id值一致。id值的查看可以在重新安装好合约之后的执行结果中查看,本文重新安装后的id值为:“c8ec3ae5e561e2b5d3f3752d231c021d2233606910e12cab3c3e23cb67bde2c9
”由于配置机器不一致,此id会有不同,各位请注意查看

#下载链码包
peer lifecycle chaincode getinstalledpackage --package-id abs_1:c8ec3ae5e561e2b5d3f3752d231c021d2233606910e12cab3c3e23cb67bde2c9
#重命名此链码包
mv abs_1\:c8ec3ae5e561e2b5d3f3752d231c021d2233606910e12cab3c3e23cb67bde2c9.tar.gz abs.tar.gz

执行过程如下: 

(2)在org1.peer1和org2.peer1节点上安装链码

# 切换环境到org1.peer1
source scripts/utils.sh
setGlobals 1 1
# 执行安装命令
peer lifecycle chaincode queryinstalled
setGlobals 1 2
# 执行安装命令
peer lifecycle chaincode queryinstalled

执行过程如下: 

 s

(3) 获得org1和org2两个组织的认证

本过程最重要的是注意sequence参数值,该值必须在sequence最新值上增加1,查询该链码最新的sequence值,执行如下命令:

peer lifecycle chaincode querycommitted --channelID mychannel --name abs

假如链码abs的sequence最新值为2,则获取组织认证命令如下:

peer lifecycle chaincode approveformyorg --tls true --cafile $ORDERER_CA --channelID mychannel --name abs --version 1 --init-required --package-id abs_1:013a79f868db17429c3195acacc08ae376994c5a9fb32d2302bef7f49f0354f7 --sequence 3 --waitForEvent

认证过程: 

切换到另外1个组织的任意节点,执行上述相同的命令。

最后查看认证结果,必须两个组织都认证通过才行。

peer lifecycle chaincode checkcommitreadiness --channelID mychannel --name abs --version 1 --sequence 3 --output json --init-required

认证通过的结果: 

(4) 提交链码

提交代码同样需要注意修改sequence参数即可,命令如下:

peer lifecycle chaincode commit -o orderer.example.com:7050 --tls true --cafile $ORDERER_CA --channelID mychannel --name abs --peerAddresses peer0.org1.example.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses peer0.org2.example.com:9051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt --version 1 --sequence 3 --init-required

当org1.peer1和org2.peer1两个节点成功安装链码之后,ContractAPI的样例代码才能运行成功,如果还是有问题,则需要检查证书文件。


总结

按照教程手动进行Fabric的部署,完成按照教程走下来,从中学习到了如何手工进行Fabric的部署,如何修改链代码完成交易等。教程较为详细有执行代码与执行过程以及执行过程中的出错以及解决过程。希望对初学Fabric的同学有所帮助。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐