参考教程(主):https://www.cnblogs.com/cbkj-xd/p/11067814.html 作者触不可及,出处 https://www.cnblogs.com/cbkj-xd/
非常推荐!
其他参考教程:
https://segmentfault.com/a/1190000021387316
https://www.cnblogs.com/studyzy/p/7237287.html

本文根据上述参考教程的步骤进行实验操作,蓝色部分是自己的修改和问题解决,截图是自己的操作截图,有问题和我自己修改的部分用蓝色标注。
内容如有不妥之处联系我修改/删除。

目录

1. 搭建环境

2. 多机环境搭建

2.1 准备配置文件

2.2 生成相关配置文件

2.3 修改节点配置文件

2.3.1 base/docker-compose-base.yaml

2.3.2 docker-compose-cli.yaml

2.3.3 docker-compose-couch.yaml

4. 创建通道

4.1 创建通道

4.2 加入通道

4.3 更新锚节点

5. 链码的安装测试

5.1 安装链码

5.2 实例化链码

5.3 调用链码

几个很有用的命令:


1. 搭建环境

本文使用的是Fabric 1.4版本,搭建solo模式的4+1的架构:1Order,4Peer,数据库使用CouchDb,所以这里需要五台机器。同时,五台机器的网络需要互通,这里使用的是五台虚拟机。系统使用Ubuntu18.04。并保证五台机子上的Fabric网络可以正常运行。

域名

ip

orderer.example.com 172.18.4.49
peer0.org1.example.com 172.18.4.33
peer1.org1.example.com 172.18.4.34
peer0.org2.example.com 172.18.4.35
peer1.org2.example.com 172.18.4.36

Fabric 的环境搭建过程不再详解

2. 多机环境搭建

这里本文只在Orderer节点的机子上修改配置文件,最后通过scp命令将配置文件复制到其余四台机子,保证所有的节点所使用的配置文件都是相同的。
在官方的例子中,已经有很多模板可以拿来进行修改,这里本文使用 first-network 这个文件夹内的配置文件来修改为自己所需要的配置文件。

2.1 准备配置文件

#step1 进入到first-network文件夹的上一级目录
cd ~/go/src/github.com/hyperledger/fabric/scripts/fabric-samples/
#step2 拷贝first-network文件夹,并命名为first
cp -r first-network/ first
#step3 进入到first文件夹内
cd first
#step4 删除此次多机环境搭建使用不到的文件,文件夹内剩余的文件有
.
├── base
│   ├── docker-compose-base.yaml
│   └── peer-base.yaml
├── channel-artifacts
├── configtx.yaml
├── crypto-config.yaml
├── docker-compose-cli.yaml
├── docker-compose-couch.yaml

本文就对以上文件进行修改搭建自己的Fabric多机网络
由于官方的 first-network 中的配置文件中使用的就是4+1的架构,所以我们可以直接生成所需要的证书文件,创世区块,通道配置文件。

2.2 生成相关配置文件

#step1 生成证书文件
cryptogen generate --config=./crypto-config.yaml
#step2 生成创世区块  首先要确保channel-artifacts文件夹存在,如果不存在需要手动创建,不然会报错
configtxgen -profile TwoOrgsOrdererGenesis -channelID byfn-sys-channel -outputBlock ./channel-artifacts/genesis.block
#step3 生成通道配置文件  其中通道名mychannel可以修改为自己的
configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID mychannel
#step4 生成锚节点配置文件
#========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 中应该有以下几个文件。

2.3 修改节点配置文件

2.3.1 base/docker-compose-base.yaml

这个文件中配置了所有节点的一些基本信息,我们需要修改的地方有(我的文件与教程中如下内容不太一样,我在此未做修改)

peer0.org1.example.com:container_name: peer0.org1.example.comextends:file: peer-base.yamlservice: peer-baseenvironment:- CORE_PEER_ID=peer0.org1.example.com- CORE_PEER_ADDRESS=peer0.org1.example.com:7051- CORE_PEER_LISTENADDRESS=0.0.0.0:7051- CORE_PEER_CHAINCODEADDRESS=peer0.org1.example.com:7052- CORE_PEER_CHAINCODELISTENADDRESS=0.0.0.0:7052- CORE_PEER_GOSSIP_BOOTSTRAP=peer1.org1.example.com:8051  #这里更改为7051,因为我们是多机环境,不存在端口冲突问题- CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer0.org1.example.com:7051- CORE_PEER_LOCALMSPID=Org1MSPvolumes:- /var/run/:/host/var/run/- ../crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/msp:/etc/hyperledger/fabric/msp- ../crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls:/etc/hyperledger/fabric/tls- peer0.org1.example.com:/var/hyperledger/productionports:- 7051:7051peer1.org1.example.com:container_name: peer1.org1.example.comextends:file: peer-base.yamlservice: peer-baseenvironment:- CORE_PEER_ID=peer1.org1.example.com- CORE_PEER_ADDRESS=peer1.org1.example.com:8051   #  7051- CORE_PEER_LISTENADDRESS=0.0.0.0:8051    #7051- CORE_PEER_CHAINCODEADDRESS=peer1.org1.example.com:8052  #7052- CORE_PEER_CHAINCODELISTENADDRESS=0.0.0.0:8052   #7052- CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer1.org1.example.com:8051  #7051- CORE_PEER_GOSSIP_BOOTSTRAP=peer0.org1.example.com:7051- CORE_PEER_LOCALMSPID=Org1MSPvolumes:- /var/run/:/host/var/run/- ../crypto-config/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/msp:/etc/hyperledger/fabric/msp- ../crypto-config/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/tls:/etc/hyperledger/fabric/tls- peer1.org1.example.com:/var/hyperledger/productionports:- 8051:8051   #这里不要忘记修改为   7051:7051
...
#只需要修改当前主机上需要启动的节点的端口就可以,比如当前主机节点为peer0.org1.example.com,那么只需要修改peer0.org1...的端口信息

2.3.2 docker-compose-cli.yaml

本文需要使用该文件启动节点,我们将该文件复制一份,以orderer节点为例

#复制该文件,并命名为docker-compose-orderer.yaml
cp docker-compose-cli.yaml docker-compose-orderer.yaml
#用编辑器打开该文件
sudo vim docker-compose-orderer.yaml

我们只在这台电脑上启动orderer节点,所以关于peer节点的信息用不到,我们将配置文件中多余的字段删除,只留下这些内容:

version: '2'volumes:orderer.example.com:networks:byfn:services:orderer.example.com:extends:file:   base/docker-compose-base.yamlservice: orderer.example.comcontainer_name: orderer.example.comnetworks:- byfn

执行以下命令启动Orderer节点

sudo docker-compose -f docker-compose-orderer.yaml up

出现问题:no such image: hyperledger/fabric-ordered::invalid reference format

我的解决:打开 base/docker-compose-base.yaml,删掉这里的冒号

不知道现在这算不算启动成功

对于Order节点,关闭网络的命令:

sudo docker-compose -f docker-compose-orderer.yaml down --volumes

建议在每一次启动网络之前都执行一次关闭网络的命令。

orderer 节点启动成功后,我们使用 scp 命令将 first 文件夹传输到 peer0.org1节点服务器。(也可直接拷贝到本地弄过去)

#step1 进入到上级目录
cd ..
#step2 传输文件
sudo scp -r first/ [peer0.org1节点主机名]@10.65.26.64:/home/[用户名]/

比如对我来说,我运行以下指令
sudo scp -r first/ lyj1@172.18.4.33:/home/lyj1/

然后,我们登陆 172.18.4.33 主机,对 peer0.org1节点进行配置,同样,我们复制一份 docker-compose-cli.yaml 文件:

#step1:进入传输到的first文件夹
cd ~/first
#step2:复制docker-compose-cli.yaml文件 并命名为docker-compose-peer0-Org1.yaml
cp docker-compose-cli.yaml docker-compose-peer0-Org1.yaml
#step3:用编辑器打开该文件
vim docker-compose-peer0-Org1.yaml

对于peer0.Org1节点,同样,首先删除多余的部分,添加一些字段,记得根据自己的情况修改cli 部分的路径!如果你和默认一样就不用改了。如果不同一定要修改!!否则后面会出现问题。最终文件内容为:

version: '2'volumes:               #=========需要进行删除peer0.org1.example.com:networks:byfn:services:peer0.org1.example.com:container_name: peer0.org1.example.comextends:file:  base/docker-compose-base.yamlservice: peer0.org1.example.comnetworks:- byfnextra_hosts:       #=========需要添加的额外字段,这里不写当前节点- "orderer.example.com:172.18.4.49"- "peer1.org1.example.com:172.18.4.34"- "peer0.org2.example.com:172.18.4.35"- "peer1.org2.example.com:172.18.4.36"cli:container_name: cliimage: hyperledger/fabric-tools:$IMAGE_TAGtty: truestdin_open: trueenvironment:- GOPATH=/opt/gopath- CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock- FABRIC_LOGGING_SPEC=DEBUG    #这里改为DEBUG- CORE_PEER_ID=cli- CORE_PEER_ADDRESS=peer0.org1.example.com:7051- CORE_PEER_LOCALMSPID=Org1MSP- CORE_PEER_TLS_ENABLED=true- CORE_PEER_TLS_CERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/server.crt- CORE_PEER_TLS_KEY_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/server.key- CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt- CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/mspworking_dir: /opt/gopath/src/github.com/hyperledger/fabric/peercommand: /bin/bashvolumes:- /var/run/:/host/var/run/- ./../chaincode/:/opt/gopath/src/github.com/chaincode- ./crypto-config:/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/- ./scripts:/opt/gopath/src/github.com/hyperledger/fabric/peer/scripts/- ./channel-artifacts:/opt/gopath/src/github.com/hyperledger/fabric/peer/channel-artifactsdepends_on:       #=========需要进行删除- peer0.org1.example.comnetworks:- byfnextra_hosts:       #=========需要添加的额外字段.- "orderer.example.com:172.18.4.49"- "peer0.org1.example.com:172.18.4.33"     #这里需要写当前节点,因为cli容器需要与peer0.org1节点进行通信- "peer1.org1.example.com:172.18.4.34"- "peer0.org2.example.com:172.18.4.35"- "peer1.org2.example.com:172.18.4.36"

此外,因为本文中Fabric数据库使用了CouchDb,所以需要对CouchDb进行相关配置,CouchDb配置文件为 docker-compose-couch.yaml

2.3.3 docker-compose-couch.yaml

同样,我们复制一份该文件

cp docker-compose-couch.yaml docker-compose-peer0-Org1-couch.yaml
#使用编辑器打开该文件
vim docker-compose-peer0-Org1-couch.yaml

在这个配置文件中,我们需要删除其他节点的配置信息,只保留peer0.org1的配置文件,最后完整的配置文件内容为:

version: '2'networks:byfn:services:couchdb0:container_name: couchdb0image: hyperledger/fabric-couchdb# Populate the COUCHDB_USER and COUCHDB_PASSWORD to set an admin user and password# for CouchDB.  This will prevent CouchDB from operating in an "Admin Party" mode.environment:- COUCHDB_USER=- COUCHDB_PASSWORD=# Comment/Uncomment the port mapping if you want to hide/expose the CouchDB service,# for example map it to utilize Fauxton User Interface in dev environments.ports:- "5984:5984"networks:- byfnpeer0.org1.example.com:environment:- CORE_LEDGER_STATE_STATEDATABASE=CouchDB- CORE_LEDGER_STATE_COUCHDBCONFIG_COUCHDBADDRESS=couchdb0:5984# The CORE_LEDGER_STATE_COUCHDBCONFIG_USERNAME and CORE_LEDGER_STATE_COUCHDBCONFIG_PASSWORD# provide the credentials for ledger to connect to CouchDB.  The username and password must# match the username and password set for the associated CouchDB.- CORE_LEDGER_STATE_COUCHDBCONFIG_USERNAME=- CORE_LEDGER_STATE_COUCHDBCONFIG_PASSWORD=depends_on:- couchdb0

至于peer0.org1的配置文件已经修改完毕,接下来我们启动该节点:

sudo docker-compose -f docker-compose-peer0-Org1.yaml -f docker-compose-peer0-Org1-couch.yaml up

出现问题:no such image: hyperledger/fabric-peer::invalid reference format

我的解决:与之前类似,打开 base/peer-base.yaml,删掉这里的冒号

出现问题:no such image: hyperledger/fabric-tools::invalid reference format

我的解决:与之前类似,打开 docker-compose-peer0-Org1-couch.yaml,删掉这里的冒号

出现问题:Error: for peer0.org1.example.com  Cannot create container for service peer0.org1.example.com: Conflict. The container name "/peer0.org1.example.com" is already in use by container "fd3d13a8bb792dfc709e64398ccf2a3c6684dcbc4e56ed49ce36790f8ae9781d". You have to remove (or rename) that container to be  You have to remove (or rename) that container to be able to reuse that name.

我的解决:参考教程:https://blog.csdn.net/weixin_34364071/article/details/86004385
运行

docker ps -a

去检查你是否有以 peer0.org1.example.compeer0.org1.example.com and etc...命名的 container ,然后可以试试运行

docker ps -qa | xargs docker stop
docker ps -qa | xargs docker rm

然后再次启动网络。

对于Peer节点,关闭网络的命令:

sudo docker-compose -f docker-compose-peer0-Org1.yaml -f docker-compose-peer0-Org1-couch.yaml down --volumes

如果没有报错的话,peer0.org1节点成功启动。至于其他peer节点,只需要将 first 文件夹使用 scp 命令复制到各个服务器上,按照该模板对配置文件进行修改,主要是docker-compose-cli.yamldocker-compose-couch.yaml两个文件。

4. 创建通道

4.1 创建通道

创建通道需要进入cli容器:(以peer0.org1节点为例)

sudo docker exec -it cli bash
#看到光标前的信息变为
root@17d79586b1b7:/opt/gopath/src/github.com/hyperledger/fabric/peer#
#则成功进入容器

这里因人而异,信息大致是上面那样。

首先配置环境变量:

#当前cli容器默认配置是节点peer0,所以不需要其他配置信息
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
#看到如下信息说明创建通道成功
2019-06-20 13:05:55.829 UTC [channelCmd] InitCmdFactory -> INFO 001 Endorser and orderer connections initialized
2019-06-20 13:05:55.926 UTC [cli.common] readBlock -> INFO 002 Received block: 0
#将生成的文件移动到channel-artifacts文件夹中
mv mychannel.block channel-artifacts/

我的路径根据以上代码进行了更改。因此我的ORDERER_CA部分的路径是以下内容。(为自己方便而已,仅供参考)

ORDERER_CA=/opt/gopath/src/github.com/hyperledger/fabric-samples/first/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem

4.2 加入通道

#因为当前cli容器使用的是peer0的配置,所以可以直接将peer0加入通道
peer channel join -b channel-artifacts/mychannel.block
#更新环境变量使其他节点也加入通道
#=========peer1.org1===========  注意这里端口要与上面文件中配置的端口号相同
CORE_PEER_ADDRESS=peer1.org1.example.com:8051
#=========peer0.org2============
CORE_PEER_LOCALMSPID="Org2MSP"
CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp
CORE_PEER_ADDRESS=peer0.org2.example.com:9051
peer channel join -b channel-artifacts/mychannel.block
#=========peer1.org2=============
CORE_PEER_ADDRESS=peer1.org2.example.com:10051
peer channel join -b channel-artifacts/mychannel.block
#退出容器
exit

由于我的路径不同,于是这里我也对路径进行了修改。

#=========我的peer0.org2修改============
CORE_PEER_LOCALMSPID="Org2MSP"
CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric-samples/first/crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric-samples/first/crypto-config/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp
CORE_PEER_ADDRESS=peer0.org2.example.com:9051
peer channel join -b channel-artifacts/mychannel.block 

出现的问题Error: proposal failed (err: bad proposal response 500: cannot create ledger from genesis block: LedgerID already exists)
原因:在大多数情况下,因为LedgerID已经存在,这表明已经加入了通道。
参考教程:https://stackoverflow.com/questions/47887886/fabric-sample-cannot-create-ledger-from-genesis-block-due-to-ledgerid-already

成功加入:

4.3 更新锚节点

#重新进入容器
sudo docker exec -it cli bash
#更新环境变量
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
#========Org1================
peer channel update -o orderer.example.com:7050 -c mychannel -f ./channel-artifacts/Org1MSPanchors.tx --tls true --cafile $ORDERER_CA
#========Org2================
#更新环境变量
CORE_PEER_LOCALMSPID="Org2MSP"
CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp
CORE_PEER_ADDRESS=peer0.org2.example.com:9051
peer channel update -o orderer.example.com:7050 -c mychannel -f ./channel-artifacts/Org2MSPanchors.tx --tls true --cafile $ORDERER_CA
#退出容器
exit

这里与上面一样,也要对路径进行修改。

5. 链码的安装测试

参考教程:https://www.cnblogs.com/cbkj-xd/p/11067810.html

https://segmentfault.com/a/1190000021387316

保持网络是开着的,打开新的终端

5.1 安装链码

这里直接用官方github.com/chaincode/chaincode_example02作为示例链码安装,安链需要安装在各个相关的 peer 上

#链码的安装仍然需要在所有节点上进行操作
#进入容器
sudo docker exec -it cli bash
#更新环境变量
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
#=========peer0.org1===========
#这里很有可能会出现路径不存在的错误,解决方法是在容器内找到对应的链码所在位置,然后替换当前链码路径
##比如本文中链码路径为/opt/gopath/src/github.com/hyperledger/fabric-samples/chaincode/chaincode_example02/go
##则将下面命令的路径进行替换github.com/hyperledger/fabric-samples/chaincode/chaincode_example02/go/chaincode_example02peer chaincode install -n mycc -v 1.0 -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02
#实例化链码 该步骤创建了a,b两个账户,其中a账户余额定义为100,b账户余额定义为200
peer chaincode instantiate -o orderer.example.com:7050 --tls true --cafile $ORDERER_CA -C mychannel -n mycc -v 1.0 -c '{"Args":["init","a","100","b","200"]}' -P "OR      ('Org1MSP.member','Org2MSP.member')"
#这一步执行完毕后可以在其他节点上也安装链码

我的路径根据以上代码进行了更改

ORDERER_CA=/opt/gopath/src/github.com/hyperledger/fabric-samples/first/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pempeer chaincode install -n mycc -v 1.0 -p github.com/hyperledger/fabric-samples/chaincode/chaincode_example02/go/

之前的 docker-compose-peer0-Org1.yaml 及其他peer节点的该文件中的 cli 部分的路径我也进行了修改。修改如下:

在我执行链码安装后出现问题:Error: error getting chaincode code mycc: path to chaincode does not exist
解决:主要还是再订正一遍 docker-compose-peer0-Org1.yaml 中的路径有没有问题,把之前启动的网络关闭,在重启。
参考教程:https://stackoverflow.com/questions/54455891/error-getting-chaincode-code-mycc-path-to-chaincode-does-not-exist

l另外三台机器上出现的问题:Error: Bad response: 500 - error installing chaincode code mycc :1.0(chaincode /var/hyperledger/production/chaincodes/mycc.1.0 exists)
(不用)解决:执行以下三条,重启网络进行尝试。(但其实这说明已经存在,并不用再次下载)

docker stop $(docker ps -a -q)
docker rm $(docker ps -a -q)
docker rmi -f $(docker images |grep "dev-" |awk '{print $3}')

参考教程:https://www.cnblogs.com/llongst/p/9571363.html,顺便推荐这个博客。

5.2 实例化链码

在通道上实例化链码。这会在通道上初始化链码,为链码指定背书策略,然后为目标节点启动链码容器。同时指定 -P "OR ('Org1MSP.member','Org2MSP.member')" 作为策略。

ORDERER_CA=/opt/gopath/src/github.com/hyperledger/fabric-samples/first/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem #实例化链码 该步骤创建了a,b两个账户,其中a账户余额定义为100,b账户余额定义为200
peer chaincode instantiate -o orderer.example.com:7050 --tls true --cafile $ORDERER_CA -C mychannel -n mycc -v 1.0 -c '{"Args":["init","a","100","b","200"]}' -P "OR ('Org1MSP.member','Org2MSP.member')"
#这一步执行完毕后可以在其他节点上也安装链码

出现问题:Error: error endorsing chaincode: rpc error: code = Unknown desc = access denied: channel [mychannel] creator org [Org1MSP]
原因:没加入mychannel通道。具体可看4.2

出现问题:Error: could not assemble transaction, error proposal response was not successful, error code 500, msg err starting container: error starting container: API error (404): network_byfn not found.

解决:输入 docker network ls 查看网络名字

进入 base/peer-base.yaml 并修改 CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE

清理 docker containers 并重试。

执行完毕

5.3 调用链码

#以peer0.org1为例
#首先进入cli容器
sudo docker exec -it cli bash
#执行以下命令进行查询a账户余额
peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'
#如果命令行输出100说明链码成功调用.#接下来我们发起一笔交易:通过peer0.org1节点将a账户余额转账给b20
peer chaincode invoke -o orderer.example.com:7050  --tls true --cafile $ORDERER_CA -C mychannel -n mycc -c '{"Args":["invoke","a","b","10"]}'
#然后登陆peer1.org1节点进行查询
CORE_PEER_ADDRESS=peer1.org1.example.com:8051
peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'
#如果输出结果为:80
说明Fabric网络手动搭建成功
#退出容器
exit

出现的问题:Error: error getting endorser client for channel: endorser client failed to connect to peer1.org2.example.com:10051: failed to create new connection:  context deadline exceeded
参考教程:https://www.jianshu.com/p/4089ec3713c6
解决方法1:在 docker-compose-cli.yaml 中 cli 容器下,添加环境变量 GODEBUG=netdns=go,在 base/peer-base.yaml 中 peer-base 容器下,添加环境变量 GODEBUG=netdns=go
无效。
解决方法2:修改 /etc/resolv.conf 文件:注释掉 options 行
但网络服务重启以后resolv.conf 会恢复。
尚未找到比较好的解决办法

开启网络后的完整顺序: (为便于我多次打开网络进行尝试。路径是根据我的路径)

开启网络
#进入cli容器
sudo docker exec -it cli bashORDERER_CA=/opt/gopath/src/github.com/hyperledger/fabric-samples/first/crypto-config/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#加入通道
peer channel join -b channel-artifacts/mychannel.blockCORE_PEER_ADDRESS=peer1.org1.example.com:8051  CORE_PEER_LOCALMSPID="Org2MSP"
CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric-samples/first/crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric-samples/first/crypto-config/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp
CORE_PEER_ADDRESS=peer0.org2.example.com:9051
peer channel join -b channel-artifacts/mychannel.blockCORE_PEER_ADDRESS=peer1.org2.example.com:10051
peer channel join -b channel-artifacts/mychannel.block#安装链码
peer chaincode install -n mycc -v 1.0 -p github.com/hyperledger/fabric-samples/chaincode/chaincode_example02/go/#实例化链码
peer chaincode instantiate -o orderer.example.com:7050 --tls true --cafile $ORDERER_CA -C mychannel -n mycc -v 1.0 -c '{"Args":["init","a","100","b","200"]}' -P "OR ('Org1MSP.member','Org2MSP.member')"#调用链码
peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'#接下来我们发起一笔交易:通过peer0.org1节点将a账户余额转账给b20
peer chaincode invoke -o orderer.example.com:7050  --tls true --cafile $ORDERER_CA -C mychannel -n mycc -c '{"Args":["invoke","a","b","10"]}'#然后登陆peer1.org1节点进行查询
CORE_PEER_ADDRESS=peer1.org1.example.com:8051
peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'

几个很有用的命令:

利用 docker ps 命令查看容器是否处于活动状态

$ sudo docker ps

检查当前节点(默认为peer0.example.com)已加入到哪些通道中:

peer channel list

检查环境变量是否正确设置

echo $CHANNEL_NAME

Hyperledger Fabric1.4 多机部署(尚有问题暂未解决)相关推荐

  1. Fabric1.4.1多机部署

    多机部署 1. 搭建环境 本文使用的是Fabric 1.4版本,搭建solo模式的4+1的架构:1Order,4Peer,机器之间的网络需要互通,保证五台机子上的Fabric网络可以正常运行.举例说明 ...

  2. 阿里云多机部署Fabric 1order节点多个peer节点

    多机部署需要有N个固定的IP服务器地址,把order节点和peer节点放在不同的服务器上,如图所示 1.首先,更改配置文件crypto-config.yaml OrdererOrgs:- Name: ...

  3. (Fabric 学习三)Fabric2.2 多机部署 使用fabcar链码

    注:参考博客: Hyperledger Fabric多机及explorer搭建_routiao的博客-CSDN博客 一.准备条件 硬件环境:Ubuntu虚拟机两台,一共两台主机:主机1的IP:192. ...

  4. Fabric实战(四)-多机部署fabric网络-solo

    ####多机部署fabric(solo模式) 本案例为: 一个orderer节点 两个peer节点 三台物理机: orderer:192.168.2.148peer0org1:192.168.2.10 ...

  5. 局域网环境、多机部署Fabric2.x版本(RAFT共识算法)+ 通道创建

    文章目录 多机部署Fabric2.x(RAFT)版本 fabric局域网多机链管理目录 环境 准备工作 配置文件准备 部署fabric网络 创建通道 多机部署Fabric2.x(RAFT)版本 fab ...

  6. Checkly如何借助Terraform实现零宕机部署

    Checkly是一款验证API端点正确性和浏览器点击流的监控工具.Checkly创始人Tim Nolet分享了他们在AWS上基于Docker的基础设施中借助Terraform实现零宕机部署的经验. C ...

  7. Hyperledger fabric1.4.0搭建环境

    Hyperledger fabric1.4.0搭建环境 原创牧竹子 最后发布于2019-05-11 21:10:20 阅读数 630  收藏 展开 Hyperledger fabric1.4.0搭建环 ...

  8. (50)uniGUI 高大上的HyperServer-多机部署一个硬集群

    (同一个世界,同一个梦想,交流学习C++Builder and Delphi XE10,传承c++builder and Delphi的魅力!欢迎各地朋友加入我的QQ群484979943,进群密码&q ...

  9. 超级账本HyperLedger的cello项目的部署和使用

    原文地址:超级账本HyperLedger的cello项目的部署和使用 说明 应用场景 源码 master安装 workder安装(docker) 参考 说明 cello是一个用来部署.管理fabric ...

最新文章

  1. Exchange工具11—性能监视器
  2. python 和php的数据通信_python服务端 和 php客户端通信一
  3. 零基础自学python的建议-如何从零基础自学Python?
  4. Python 类的特性讲解
  5. 更新系统时跳过某个软件包
  6. elementUI使用
  7. linux free 物理内存,Linux free显示系统内存使用
  8. tcpdump: no suitable device found
  9. win10搭建Linux子系统,win10中搭建Linux子系统
  10. 如何科学的使用华为云
  11. QT中ui更改后不能更新的解决方法
  12. 车联网相关知识点整理
  13. 在开放环境的步态识别:一个基准(二)
  14. 天正双击墙体不能编辑_【盘点】CAD、天正、Ps 快捷键最全汇总!
  15. 平板连接远程Linux,如何从Android平板电脑远程控制Ubuntu | MOS86
  16. Linux网络编程(四)
  17. Curator的使用
  18. 怎么防止解决百度转码问题
  19. oracle 判断重复次数,sql 查询 某字段 重复次数 最多的记录
  20. sqlServer服务器名称

热门文章

  1. MODBUS-RTU通讯协议简介
  2. 【硅谷之谜】摘要与感想
  3. ICT基础建设是什么
  4. 诸葛亮的满城计和司马懿的不买房运动-经典啊
  5. KingbaseES V8R6 运维案例 --ksql访问动态库问题
  6. 武汉市第二轻工业学校有没计算机科学与技术,武汉市第二轻工业学校
  7. 用python 画个小猪佩奇
  8. 退役选手的自我修养——《千与千寻》杂感
  9. 产业融合将成为主流——记未来10年的移动互联网
  10. Python 自动读取163邮箱收取的验证码