1) docker-ce安装
安装之前最好切换镜像源,阿里云的会比较快,官方的狠龟速,yum源配置请自行完成
yum install docker-ce(可以选择版本 我用的是19.03.14)
2) go 安装
wget https://studygolang.com/dl/golang/go1.15.6.linux-amd64.tar.gz -O /usr/local/
tar -xvf go1.15.6.linux-amd64.tar.gz
配置go环境变量
vim /etc/profile.d/goenv.sh
##########################
export GOROOT=/usr/local/go
export GOPATH=/usr/local/gopath
export PATH=$PATH:$GOROOT/bin
##########################
source /etc/profile
验证:
go version
3) 安装nodejs
cd /usr/local
wget https://npm.taobao.org/mirrors/node/v14.15.1/node-v14.15.1-linux-x64.tar.xz
tar -xvf node-v14.15.1-linux-x64.tar.xz
配置nodejs环境变量
vim /etc/profile.d/nodeenv.sh
##########################
export PATH=$PATH:/usr/local/node-v14.15.1-linux-x64/bin
##########################
验证:
node -v
环境准备好后我们开始一步一步安装
***************************************************************************************************************************************************************************
1, 在gopath下创建目录
install -d /usr/local/gopath/src/github.com/hyperledger/fabric/network001
2, 在network001目录下准备配置生成工具
wget https://github.com/hyperledger/fabric/releases/download/v1.4.3/hyperledger-fabric-linux-amd64-1.4.3.tar.gz
tar -xvf hyperledger-fabric-linux-amd64-1.4.3.tar.gz
执行完毕后在network001目录下,多了一个bin和一个config文件夹。
在config文件夹中,是配置Fabric网络中的常用配置文件,该目录下的文件如下:
本次实验中,并不用下载的配置文件,而是自己新建对应的配置文件。但是,新建的配置文件的格式,都是用.yaml文件来配置。
3,配置证书相关文件 | crypto-config.yaml & configtx.yaml
在network001下分别创建这两个文件
1> crypto-config.yaml 文件配置
依赖配置文件crypto-config.yaml 指定了网络的拓扑结构。该文件的主要作用是:
1,通过配置模板信息,来定义组织成员对应的结构。
2,cryptogen可以快速根据该配置文件自动批量生成所需要的密钥和证书文件。
1 OrdererOrgs: 2 - Name: Orderer 3 Domain: example.com 4 Specs: 5 - Hostname: orderer 6 PeerOrgs: 7 - Name: Org1 8 Domain: org1.example.com 9 Template: 10 Count: 2 11 Users: 12 Count: 1 13 - Name: Org2 14 Domain: org2.example.com 15 Template: 16 Count: 2 17 Users: 18 Count: 1
注:
Template Count=2是说我们要生成2套公私钥和证书,一套是peer0.org2的,还有一套是peer1.org2的。
Users. Count=1是说每个Template下面会有几个普通User(注意,Admin是Admin,不包含在这个计数中)。这里配置了1,也就是说我们只需要一个普通用户。在实际生产环境中,我们可以根据实际需要调整这个配置文件,增删Org Users等。
进入network001目录下执行下面命令
1 ./bin/cryptogen generate --config=./crypto-config.yaml
运行结果:
后面加上
上述命令,生成了一个crypto-config目录。在该目录中,定义了两个组织,org1以及org2.所以该工具对应生成了两套证书文件。
2>configtx.yaml 文件配置
configtx.yaml 包含网络的定义,并给出了网络组件的拓扑结构还指出每个网络实体的加密材料的存储位置。用来编写配置系统通道初始区块文件,新建应用通道配置文件,锚节点配置更新交易文件等。
1 Organizations: 2 - &OrdererOrg 3 Name: OrdererOrg 4 ID: OrdererMSP 5 MSPDir: crypto-config/ordererOrganizations/example.com/msp 6 - &Org1 7 Name: Org1MSP 8 ID: Org1MSP 9 MSPDir: crypto-config/peerOrganizations/org1.example.com/msp 10 AnchorPeers: 11 - Host: peer0.org1.example.com 12 Port: 7051 13 - &Org2 14 Name: Org2MSP 15 ID: Org2MSP 16 MSPDir: crypto-config/peerOrganizations/org2.example.com/msp 17 AnchorPeers: 18 - Host: peer0.org2.example.com 19 Port: 7051 20 Orderer: &OrdererDefaults 21 OrdererType: solo 22 Addresses: 23 - orderer.example.com:7050 24 BatchTimeout: 2s 25 BatchSize: 26 MaxMessageCount: 10 27 AbsoluteMaxBytes: 98 MB 28 PreferredMaxBytes: 512 KB 29 Kafka: 30 Brokers: 31 - 127.0.0.1:9092 32 Organizations: 33 Application: &ApplicationDefaults 34 Organizations: 35 Profiles: 36 TwoOrgsOrdererGenesis: 37 Orderer: 38 <<: *OrdererDefaults 39 Organizations: 40 - *OrdererOrg 41 Consortiums: 42 SampleConsortium: 43 Organizations: 44 - *Org1 45 - *Org2 46 TwoOrgsChannel: 47 Consortium: SampleConsortium 48 Application: 49 <<: *ApplicationDefaults 50 Organizations: 51 - *Org1 52 - *Org2
注意:
以上文件的节点顺序不能变化 一面执行时找不到相应的节点,因为文件的加载是从上到下加载的
进入network001目录下,使用如下命令,来生成创始区块:
1 install -d channel-artifacts 2 ./bin/configtxgen -profile TwoOrgsOrdererGenesis -outputBlock ./channel-artifacts/genesis.block
注意profile参数的名字必须和文件中的对应
运行成功后可以在目录./channel-artifacts/ 发现创世区块文件genesis.block
使用如下命令生成通道配置文件:
1 ./bin/configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/mychannel.tx -channelID mychannel
运行成功后在目录./channel-artifacts/ 下会多出一个文件 mychannel.tx, 该文件会在peer节点加入到通道中用到
4,部署配置Orderer节点
orderer节点的配置,可以用.yaml格式的文件来配置,最后可以用docker-compose来启动
在network001目录下,创建一个docker-orderer.yaml启动文件,文件内容如下:
1 # Copyright IBM Corp. All Rights Reserved. 2 # 3 # SPDX-License-Identifier: Apache-2.0 4 # 5 6 version: '2' 7 8 services: 9 10 orderer.example.com: 11 container_name: orderer.example.com 12 image: hyperledger/fabric-orderer 13 environment: 14 - CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=aberic_default 15 16 - ORDERER_GENERAL_LOGLEVEL=debug 17 - ORDERER_GENERAL_LISTENADDRESS=0.0.0.0 18 - ORDERER_GENERAL_LISTENPORT=7050 19 - ORDERER_GENERAL_GENESISMETHOD=file 20 - ORDERER_GENERAL_GENESISFILE=/var/hyperledger/orderer/orderer.genesis.block 21 - ORDERER_GENERAL_LOCALMSPID=OrdererMSP 22 - ORDERER_GENERAL_LOCALMSPDIR=/var/hyperledger/orderer/msp 23 - ORDERER_GENERAL_TLS_ENABLED=false 24 - ORDERER_GENERAL_TLS_PRIVATEKEY=/var/hyperledger/orderer/tls/server.key 25 - ORDERER_GENERAL_TLS_CERTIFICATE=/var/hyperledger/orderer/tls/server.crt 26 - ORDERER_GENERAL_TLS_ROOTCAS=[/var/hyperledger/orderer/tls/ca.crt] 27 working_dir: /opt/gopath/src/github.com/hyperledger/fabric 28 command: orderer 29 volumes: 30 - ./channel-artifacts/genesis.block:/var/hyperledger/orderer/orderer.genesis.block 31 - ./crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp:/var/hyperledger/orderer/msp 32 - ./crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/tls/:/var/hyperledger/orderer/tls 33 networks: 34 default: 35 aliases: 36 - network001 37 ports: 38 - 7050:7050
5,部署配置peer节点创建文件docker-peer.yaml文件,文件内容如下:
version: '2' services: couchdb: container_name: couchdb image: hyperledger/fabric-couchdb ports: - "5984:5984" ca: container_name: ca image: hyperledger/fabric-ca environment: - FABRIC_CA_HOME=/etc/hyperledger/fabric-ca-server - FABRIC_CA_SERVER_CA_NAME=ca - FABRIC_CA_SERVER_TLS_ENABLED=false - FABRIC_CA_SERVER_TLS_CERTFILE=/etc/hyperledger/fabric-ca-server-config/ca.org1.example.com-cert.pem - FABRIC_CA_SERVER_TLS_KEYFILE=/etc/hyperledger/fabric-ca-server-config/b72437db8957151f949fe90ee2b4a7bf7979c07866cad4baeeb92282214c5aa4_sk ports: - "7054:7054" command: sh -c 'fabric-ca-server start --ca.certfile /etc/hyperledger/fabric-ca-server-config/ca.org1.example.com-cert.pem --ca.keyfile /etc/hyperledger/fabric-ca-server-config/b72437db8957151f949fe90ee2b4a7bf7979c07866cad4baeeb92282214c5aa4_sk -b admin:adminpw -d' volumes: - ./crypto-config/peerOrganizations/org1.example.com/ca/:/etc/hyperledger/fabric-ca-server-config peer0.org1.example.com: container_name: peer0.org1.example.com image: hyperledger/fabric-peer environment: - CORE_LEDGER_STATE_STATEDATABASE=CouchDB - CORE_LEDGER_STATE_COUCHDBCONFIG_COUCHDBADDRESS=couchdb:5984 - CORE_PEER_ID=peer0.org1.example.com - CORE_PEER_NETWORKID=network001 - CORE_PEER_ADDRESS=peer0.org1.example.com:7051 - CORE_PEER_CHAINCODELISTENADDRESS=peer0.org1.example.com:7052 - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer0.org1.example.com:7051 - CORE_PEER_LOCALMSPID=Org1MSP - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock - CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=network001 - CORE_LOGGING_LEVEL=DEBUG - CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=network001_default - CORE_PEER_GOSSIP_SKIPHANDSHAKE=true - CORE_PEER_GOSSIP_USELEADERELECTION=true - CORE_PEER_GOSSIP_ORGLEADER=false - CORE_PEER_PROFILE_ENABLED=false - CORE_PEER_TLS_ENABLED=false - CORE_PEER_TLS_CERT_FILE=/etc/hyperledger/fabric/tls/server.crt - CORE_PEER_TLS_KEY_FILE=/etc/hyperledger/fabric/tls/server.key - CORE_PEER_TLS_ROOTCERT_FILE=/etc/hyperledger/fabric/tls/ca.crt volumes: - /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 working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer command: peer node start ports: - 7051:7051 - 7052:7052 - 7053:7053 depends_on: - couchdb networks: default: aliases: - network001 cli: container_name: cli image: hyperledger/fabric-tools tty: true environment: - GOPATH=/opt/gopath - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock - CORE_LOGGING_LEVEL=DEBUG - CORE_PEER_ID=cli - CORE_PEER_ADDRESS=peer0.org1.example.com:7051 - CORE_PEER_LOCALMSPID=Org1MSP - CORE_PEER_TLS_ENABLED=false - 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/msp working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer volumes: - /var/run/:/host/var/run/ - ./chaincode/go/:/opt/gopath/src/github.com/hyperledger/fabric/network001/chaincode/go - ./crypto-config:/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ - ./channel-artifacts:/opt/gopath/src/github.com/hyperledger/fabric/peer/channel-artifacts depends_on: - peer0.org1.example.com
注意几个关键路径:
FABRIC_CA_SERVER_TLS_KEYFILE 后的sk文件路径
command 后面的所有文件路径必须对应
peer节点的启动文件包含的内容较多,包括了对cli客户端、Couch DB插件以及CA服务端插件的配置。
还有下面几个环境变量需要配置成如下:
- CORE_PEER_NETWORKID=network001
- CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=network001_default
aliases: - network001
至此相关配置文件已经准备好了 我们下面来启动order和peer节点并创建通道,和将peer加入通道,安装合约和实例化合约的相关步骤:
6,启动排序节点的命令
1 docker-compose -f docker-orderer.yaml up -d
停止的话可以用
1 docker-compose -f docker-orderer.yaml down
此命令会执行停止容器和删除容器的操作,但是不会删除容器对应的镜像
7,启动Peer节点的命令
docker-compose -f docker-peer.yaml up -d
停止的话可以用
1 docker-compose -f docker-peer.yaml down
此命令会执行停止容器和删除容器的操作,但是不会删除容器对应的镜像
以上两步如果执行失败 或者容器没有启动起来,可以用以下命令进行排错
docker logs <container name>
如果是配置文件错误需要停止所有相关容器后,删除所对应的镜像,然后重新执行启动命令
直到所有容器都处于up状态
8,启动CLI客户端
当所有的容器启动之后,接下来要做的就是对Channel和ChainCode执行操作了。在本次实践中,是通过对客户端来完成对peer节点的操作。在实际的应用场景中,可以使用第三方的SDK来对peer节点进行操作。但是在环境搭建的过程中,我们使用cli客户端完成对peer节点的操作。可通过以下命令进入cli客户端
1 docker exec -it cli bash
9,通道操作
通道是fabric中的一项重要特性。位于同一通道中的节点,可以共享数据。
在Fabric区块网络的搭建过程中,我们首先需要利用上一节生成的通道配置文件mychannel.tx,来创建通道。然后再将对应的peer节点加入到通道中来。
1>创建一个通道
进入容器cli 执行以下命令
1 peer channel create -o orderer.example.com:7050 -c mychannel -t 50s -f ./channel-artifacts/mychannel.tx
注意:这个是在order节点配置时ORDERER_GENERAL_TLS_ENABLED=false 才可以用以上方式创建,如果是true 请参考以下方式来创建通道
1 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 2 peer channel create -o orderer.example.com:7050 -c mychannel -f ./channel-artifacts/mychannel.tx --tls true --cafile $ORDERER_CA
2>Peer加入通道中
进入容器cli 执行以下命令
1 peer channel join -b mychannel.block
Fabric网络三要素:Orderer节点、Peer节点以及Channel的操作都已经完成。我们首先是启动了Orderer节点以及Peer节点,最后把Peer节点加入到通道中。这样,一个最小单位的Fabric网络已经成功搭建起来了。
10,智能合约(链码)安装和实例化
本节直接使用fabric官网提供的智能合约example02,来进行智能合约的安装和实例化。
退出cli容器 exit
进入宿主机network001目录下
通过Git 命令下载fabric1.4版本源码
执行如下命令
1 git clone -b release-1.4 https://github.com/hyperledger/fabric.git
执行结果:
我用的是本地仓库下载所以名字可能不一样 我的名字叫做fabric-samples
将fabric-samples/chaincode/chaincode_example02/go 下的 文件拷贝到 chaincode/go/chaincode_example02目录下
此时chaincode_example02 目录应该是不存在的 你可以先创建再拷贝
完成之后 再登录cli容器,参考上面的命令
进入后会发现文件已经在容器cli的响应目录底下
此处用到的就是容器目录卷技术
在容器中运行
会看到gopath的环境便令,确定好之后执行如下命令安装链码
1 peer chaincode install -n mycc -p github.com/hyperledger/fabric/network001/chaincode/go/chaincode_example02 -v 1.0
命令参数解释:
-n mycc 安装的链码的名称
-v 1.0 指定链码的版本为1.0
-p ....../examples/chaincode/go/ --path的缩写,表示链码的本地路径。
运行完成之后没有报错说明安装成功,如果报错请根据提示进行修改,一般都是-p参数的问题,和文件找不到的问题
说明在peer0.org1上安装成功,接下来就可以去实例化和安装别的节点
2>实例化链码
执行如下命令进行实例化
进入cli容器
执行命令
1 peer chaincode instantiate -o orderer.example.com:7050 -C mychannel -n mycc -v 1.0 -c '{"Args":["init","a","100","b","200"]}' -P "OR('Org1MSP.member')"
注意:这个是在order节点配置时ORDERER_GENERAL_TLS_ENABLED=false 才可以用以上方式创建,如果是true 请参考以下方式来初始化链码
1 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 2 peer chaincode install -n mycc -p github.com/hyperledger/fabric/network001/chaincode/go/chaincode_example02 -v 1.0
命令参数解释:
-o orderer.example.com:7050--->指定Orderer服务器的地址
--tls true 启用TLS通信
--cafile $ORDERER_CA Order节点的TLS证书,当启动TLS通信是有效。
-C mychannel 所面向的通道为mychannel
-v 1.0 实例化的版本为1.0
-c '{"Args":["init","a","100","b","200"]}',--ctor,链码的具体执行参数,Json格式。表示调用函数init且a账户初始化为100,b账户初始化为200。
-P --policy,指定链码所关联的背书策略。关于背书策略的详细解释请参考:https://blog.csdn.net/weixin_43988498/article/details/109129127
ChainCode要在区块链网络中运行,需要经过链码安装和链码实例化两个步骤。其中,整个部署过程中,针对每个想要调用智能合约的节点,都需要安装一次chaincode.但是只需要实例化一次就可以了。因为安装chaincode的对象是Peer节点,而实例化ChainCode的对象是ChainCode。
在实例化的过程中,实际上是启动了一个运行ChainCode的容器。其中参数
-c '{"Args":["init","a","100","b","200"]}'
表示初始化了两个账户,并给a 和 b 分别赋值100和200.接下来,就通过cli客户端来对智能合约进行调用。
>查询a资产
1 peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'
结果:100
>b转账给a账户50元
1 peer chaincode invoke -o orderer.example.com:7050 -C mychannel -n mycc -c '{"Args":["invoke","b","a","50"]}'
注意:这个是在order节点配置时ORDERER_GENERAL_TLS_ENABLED=false 才可以用以上方式创建,如果是true 请参考以下方式来调用链码
1 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 2 peer chaincode invoke -o orderer.example.com:7050 --tls true --cafile $ORDERER_CA -C mychannel -n mycc -c '{"Args":["invoke","b","a","50"]}'
>查询a余额
1 1 peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'
结果:150
11,部署Peer0.org2节点
在上述的几个步骤中,我们成功的部署了一个Orderer节点以及ORG1组织中的Peer0节点。如果现在需要新增加一个节点,我们该怎么做呢?
其实基本步骤和部署Peer0.org1节点类似。包括:
配置peer0.org2的启动文件,docker-peer1.yaml.
启动peer0.org2节点。
将peer0.org2节点加入到通道中。
将ChainCode安装在peer0.org2节点上。
做完上述步骤,就完成了在一个通道中新增peer节点。
1>准备docker-peer1.yaml文件
进入network001目录
1 version: '2' 2 3 services: 4 5 peer0.org2.example.com: 6 container_name: peer0.org2.example.com 7 image: hyperledger/fabric-peer 8 environment: 9 - CORE_PEER_ID=peer0.org2.example.com 10 - CORE_PEER_NETWORKID=network001 11 - CORE_PEER_ADDRESS=peer0.org2.example.com:7051 12 - CORE_PEER_CHAINCODELISTENADDRESS=peer0.org2.example.com:7052 13 - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer0.org2.example.com:7051 14 - CORE_PEER_LOCALMSPID=Org2MSP 15 - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock 16 - CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=network001 17 - CORE_LOGGING_LEVEL=DEBUG 18 - CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=network001_default 19 - CORE_PEER_GOSSIP_SKIPHANDSHAKE=true 20 - CORE_PEER_GOSSIP_USELEADERELECTION=true 21 - CORE_PEER_GOSSIP_ORGLEADER=false 22 - CORE_PEER_PROFILE_ENABLED=false 23 - CORE_PEER_TLS_ENABLED=false 24 - CORE_PEER_TLS_CERT_FILE=/etc/hyperledger/fabric/tls/server.crt 25 - CORE_PEER_TLS_KEY_FILE=/etc/hyperledger/fabric/tls/server.key 26 - CORE_PEER_TLS_ROOTCERT_FILE=/etc/hyperledger/fabric/tls/ca.crt 27 volumes: 28 - /var/run/:/host/var/run/ 29 - ./crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/msp:/etc/hyperledger/fabric/msp 30 - ./crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls:/etc/hyperledger/fabric/tls 31 working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer 32 command: peer node start 33 ports: 34 - 8051:7051 35 - 8052:7052 36 - 8053:7053 37 networks: 38 default: 39 aliases: 40 - network001
如果你搭建环境的文件夹名称不是network001而是别的,则需要将network001换成你自己的文件夹名称。否则,peer节点无法与Orderer节点等建立联系。
2>启动peer0.org2节点
1 docker-compose -f docker-peer1.yaml up -d
其他排错停止命令请参考上述文章
3>将peer0.org2节点加入通道中
进入cli容器
由于cli 容器之前主要是绑定的Peer0.org1.如果想要使用CLI命令窗口来操作peer0.org2,则需要将CLI容器中的环境变量设置成Peer0.org2的环境变量。直接将如下变量输入命令窗如下:
1 CORE_PEER_ID=peer0.org2.example.com 2 CORE_PEER_ADDRESS=peer0.org2.example.com:7051 3 CORE_PEER_CHAINCODELISTENADDRESS=peer0.org2.example.com:7052 4 CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer0.org2.example.com:7051 5 CORE_PEER_LOCALMSPID=Org2MSP 6 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 7 CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp
输入 export后可以查看环境变量是否变更过来了
随后,将peer0.org2节点加入通道中:
1 peer channel join -b mychannel.block
然后,对该节点安装ChainCode
1 peer chaincode install -n mycc -p github.com/hyperledger/fabric/network001/chaincode/go/chaincode_example02 -v 1.0
在该节点安装好ChainCode之后,就可以从该节点调用ChainCode了。下面来调用ChainCode查询一下用户a的余额。
1 peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'
锚节点介绍
锚节点是一个peer节点,那么锚节点和普通peer节点的区别就是在一个网络中,有多个组织,每个组织有多个peer节点,组织和组织之间需要通信,那么每个组织中选取一个peer节点作为代表,这个peer节点的代表就是锚节点,锚节点的职责就是代表当前这个组织,和其他的组织进行通信,我们可以在配置文件中指定锚节点,任意的peer节点都有资格成为锚节点,一个组织最多有一个锚节点
FQA:
1,错误,在cli中执行peer chaincode query/invoke/update操作是遇到如下错误
Error: Failed sending proposal, got rpc error: code = Unknown desc = access denied: channel [] creator org [Org1MSP]
解决办法:
export 出所有环境变量,仔细查看是否有没有被修改成想要操作的peer,org的 环境变量,修改后重新尝试,问题一般都会解决
2,当通过docker-compose命令停掉peer,order后,链码不可用问题
错误如下:
Error: endorsement failure during query. response: status:500 message:"make sure the chaincode mycc has been successfully instantiated and try again: chaincode mycc not found"
解决办法:
停掉peer和order后,所有的相关peer容器和order容器都会被删除,只留下老的链码容器,当重新通过docker-compose启动order和peer后 ,需要重新安装链码,再初始化,才能正常操作,
还有一个发现是,停掉couchDB 容器后,里面的数据也没了,不知道 是因为没有设置数据卷还是因为别的。
***************************************************************************************************************************************************************************
参考文章:
https://www.cnblogs.com/studyzy/p/7451276.html
/etc/hyperledger/fabric-ca-server-config
docker-peer.yaml