3 部署docker节点
编写docker-compose.yaml
文件
创建docker文件夹mkdir dacker
在docker文件夹内创建docker-compose.yaml文件vim docker-compose.yaml
(注意文件结构)
version: '2'
volumes:
orderer.example.com:
peer0.org1.example.com:
peer1.org1.example.com:
peer0.org2.example.com:
peer1.org2.example.com:
services:
orderer.example.com:
container_name: orderer.example.com
image: hyperledger/fabric-orderer:2.2
environment:
- FABRIC_LOGGING_SPEC=INFO
- ORDERER_GENERAL_LISTENADDRESS=0.0.0.0
- ORDERER_GENERAL_LISTENPORT=7050
- ORDERER_GENERAL_GENESISMETHOD=file
- ORDERER_GENERAL_GENESISFILE=/var/hyperledger/orderer/orderer.genesis.block
- ORDERER_GENERAL_LOCALMSPID=OrdererMSP
- ORDERER_GENERAL_LOCALMSPDIR=/var/hyperledger/orderer/msp
#- ORDERER_OPERATIONS_LISTENADDRESS=orderer.example.com:9443
# enabled TLS
- ORDERER_GENERAL_TLS_ENABLED=true
- ORDERER_GENERAL_TLS_PRIVATEKEY=/var/hyperledger/orderer/tls/server.key
- ORDERER_GENERAL_TLS_CERTIFICATE=/var/hyperledger/orderer/tls/server.crt
- ORDERER_GENERAL_TLS_ROOTCAS=[/var/hyperledger/orderer/tls/ca.crt]
- ORDERER_KAFKA_TOPIC_REPLICATIONFACTOR=1
- ORDERER_KAFKA_VERBOSE=true
- ORDERER_GENERAL_CLUSTER_CLIENTCERTIFICATE=/var/hyperledger/orderer/tls/server.crt
- ORDERER_GENERAL_CLUSTER_CLIENTPRIVATEKEY=/var/hyperledger/orderer/tls/server.key
- ORDERER_GENERAL_CLUSTER_ROOTCAS=[/var/hyperledger/orderer/tls/ca.crt]
working_dir: /opt/gopath/src/github.com/hyperledger/fabric
command: orderer
volumes:
- ../channel-artifacts/orderer.genesis.block:/var/hyperledger/orderer/orderer.genesis.block
- ../crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp:/var/hyperledger/orderer/msp
- ../crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/tls:/var/hyperledger/orderer/tls
- orderer.example.com:/var/hyperledger/production/orderer
ports:
- 7050:7050
#- 9443:9443
#networks:
# - testwork
peer0.org1.example.com:
image: hyperledger/fabric-peer:2.2.10
container_name: peer0.org1.example.com
environment:
#- CORE_PEER_ADDRESSAUTODETECT=false
- CORE_VM_ENDPOINT=unix///host/var/docker.sock
- 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_CHAINCODELISTENADDRESS=0.0.0.0:7052
- CORE_PEER_CHAINCODEADDRESS=peer0.org1.example.com:7052
- CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer0.org1.example.com:7061
- CORE_PEER_GOSSIP_BOOTSTRAP=peer0.org1.example.com:7051
- CORE_PEER_LOCALMSPID=Org1MSP
- FABRIC_LOGGING_SPEC=INFO
#- FABRIC_LOGGING_SPEC=INFO # info:core.chaincode=debug
- CORE_PEER_TLS_ENABLED=true
- CORE_PEER_GOSSIP_USELEADERELECTION=true
- CORE_PEER_GOSSIP_ORGLEADER=false # whether this node is the org leader, default to false
- CORE_PEER_PROFILE_ENABLED=true
- CORE_PEER_TLS_CERT_FILE=/var/hyperledger/fabric/tls/server.crt
- CORE_PEER_TLS_KEY_FILE=/var/hyperledger/fabric/tls/server.key
- CORE_PEER_TLS_ROOTCERT_FILE=/var/hyperledger/fabric/tls/ca.crt
- core_CHAINCODE_EXECUTETIMEOUT=300ms
working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
command: peer node start
volumes:
- /var/run/:/host/var/run/
- ../crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/msp:/var/hyperledger/fabric/msp
- ../crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls:/var/hyperledger/fabric/tls
- peer0.org1.example.com:/var/hyperledger/production
ports:
- 7051:7051
- 7052:7052
- 7053:7053
peer1.org1.example.com:
image: hyperledger/fabric-peer:2.2.10
container_name: peer1.org1.example.com
environment:
#- CORE_PEER_ADDRESSAUTODETECT=false
- CORE_VM_ENDPOINT=unix///host/var/docker.sock
- CORE_PEER_ID=peer1.org1.example.com
- CORE_PEER_ADDRESS=peer1.org1.example.com:7061
- CORE_PEER_LISTENADDRESS=0.0.0.0:7061
- CORE_PEER_CHAINCODELISTENADDRESS=0.0.0.0:7062
- CORE_PEER_CHAINCODEADDRESS=peer1.org1.example.com:7062
- CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer1.org1.example.com:70561
- CORE_PEER_GOSSIP_BOOTSTRAP=peer1.org1.example.com:7051
- CORE_PEER_LOCALMSPID=Org1MSP
- FABRIC_LOGGING_SPEC=INFO
#- FABRIC_LOGGING_SPEC=INFO # info:core.chaincode=debug
- CORE_PEER_TLS_ENABLED=true
- CORE_PEER_GOSSIP_USELEADERELECTION=true
- CORE_PEER_GOSSIP_ORGLEADER=false # whether this node is the org leader, default to false
- CORE_PEER_PROFILE_ENABLED=true
- 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
- core_CHAINCODE_EXECUTETIMEOUT=300ms
working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
command: peer node start
volumes:
- /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/production
ports:
- 7061:7061
- 7062:7062
- 7063:7063
peer0.org2.example.com:
image: hyperledger/fabric-peer:2.2.10
container_name: peer0.org2.example.com
environment:
#- CORE_PEER_ADDRESSAUTODETECT=false
- CORE_VM_ENDPOINT=unix///host/var/docker.sock
- CORE_PEER_ID=peer0.org2.example.com
- CORE_PEER_ADDRESS=peer0.org2.example.com:8051
- CORE_PEER_LISTENADDRESS=0.0.0.0:8051
- CORE_PEER_CHAINCODELISTENADDRESS=0.0.0.0:8052
- CORE_PEER_CHAINCODEADDRESS=peer0.org2.example.com:8052
- CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer0.org2.example.com:8061
- CORE_PEER_GOSSIP_BOOTSTRAP=peer0.org2.example.com:8051
- CORE_PEER_LOCALMSPID=Org2MSP
- FABRIC_LOGGING_SPEC=INFO
#- FABRIC_LOGGING_SPEC=INFO # info:core.chaincode=debug
- CORE_PEER_TLS_ENABLED=true
- CORE_PEER_GOSSIP_USELEADERELECTION=true
- CORE_PEER_GOSSIP_ORGLEADER=false # whether this node is the org leader, default to false
- CORE_PEER_PROFILE_ENABLED=true
- 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
- core_CHAINCODE_EXECUTETIMEOUT=300ms
working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
command: peer node start
volumes:
- /var/run/:/host/var/run/
- ../crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/msp:/etc/hyperledger/fabric/msp
- ../crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls:/etc/hyperledger/fabric/tls
- peer0.org2.example.com:/var/hyperledger/production
ports:
- 8051:8051
- 8052:8052
- 8053:8053
peer1.org2.example.com:
image: hyperledger/fabric-peer:2.2.10
container_name: peer1.org2.example.com
environment:
#- CORE_PEER_ADDRESSAUTODETECT=false
- CORE_VM_ENDPOINT=unix///host/var/docker.sock
- CORE_PEER_ID=peer1.org2.example.com
- CORE_PEER_ADDRESS=peer1.org2.example.com:8061
- CORE_PEER_LISTENADDRESS=0.0.0.0:8061
- CORE_PEER_CHAINCODELISTENADDRESS=0.0.0.0:8062
- CORE_PEER_CHAINCODEADDRESS=peer1.org2.example.com:8062
- CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer1.org2.example.com:8051
- CORE_PEER_GOSSIP_BOOTSTRAP=peer1.org2.example.com:8051
- CORE_PEER_LOCALMSPID=Org2MSP
- FABRIC_LOGGING_SPEC=INFO
#- FABRIC_LOGGING_SPEC=INFO # info:core.chaincode=debug
- CORE_PEER_TLS_ENABLED=true
- CORE_PEER_GOSSIP_USELEADERELECTION=true
- CORE_PEER_GOSSIP_ORGLEADER=false # whether this node is the org leader, default to false
- CORE_PEER_PROFILE_ENABLED=true
- 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
- core_CHAINCODE_EXECUTETIMEOUT=300ms
working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
command: peer node start
volumes:
- /var/run/:/host/var/run/
- ../crypto-config/peerOrganizations/org2.example.com/peers/peer1.org2.example.com/msp:/etc/hyperledger/fabric/msp
- ../crypto-config/peerOrganizations/org2.example.com/peers/peer1.org2.example.com/tls:/etc/hyperledger/fabric/tls
- peer1.org2.example.com:/var/hyperledger/production
ports:
- 8061:8061
- 8062:8062
- 8063:8063
cli1:
image: hyperledger/fabric-tools:2.2.10
stdin_open: true
container_name: cli
tty: true
depends_on:
- peer0.org1.example.com
- peer1.org1.example.com
- peer0.org2.example.com
- peer1.org2.example.com
environment:
- GOPATH=/opt/gopath
- CORE_VM_ENDPOINT=unix///host/var/docker.sock
- FABRIC_LOGGING_SPEC=INFO
- CORE_PEER_ID=cli
- CORE_PEER_ADDRESS=peer0.org1.example.com:7051 # default to operate on peer0.org1
- CORE_PEER_LOCALMSPID=Org1MSP
- CORE_PEER_TLS_ENABLED=true # to enable TLS, change to 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/msp
volumes:
- /var/run/:/host/var/run/
- ../chaincode/go/:/opt/gopath/src/github.com/hyperledger/multiple-deployment/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
working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
command: /bin/bash
cli2:
image: hyperledger/fabric-tools:2.2.10
stdin_open: true
container_name: cli2
tty: true
depends_on:
- peer0.org1.example.com
- peer1.org1.example.com
- peer0.org2.example.com
- peer1.org2.example.com
environment:
- GOPATH=/opt/gopath
- CORE_VM_ENDPOINT=unix///host/var/docker.sock
- FABRIC_LOGGING_SPEC=INFO
- CORE_PEER_ID=cli
- CORE_PEER_ADDRESS=peer1.org1.example.com:7061 # default to operate on peer0.org1
- CORE_PEER_LOCALMSPID=Org1MSP
- CORE_PEER_TLS_ENABLED=true # to enable TLS, change to true
- CORE_PEER_TLS_CERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer1.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/peer1.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/peer1.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
volumes:
- /var/run/:/host/var/run/
- ../chaincode/go/:/opt/gopath/src/github.com/hyperledger/multiple-deployment/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
working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
command: /bin/bash
cli3:
image: hyperledger/fabric-tools:2.2.10
stdin_open: true
container_name: cli3
tty: true
depends_on:
- peer0.org1.example.com
- peer1.org1.example.com
- peer0.org2.example.com
- peer1.org2.example.com
environment:
- GOPATH=/opt/gopath
- CORE_VM_ENDPOINT=unix///host/var/docker.sock
- FABRIC_LOGGING_SPEC=INFO
- CORE_PEER_ID=cli
- CORE_PEER_ADDRESS=peer0.org2.example.com:8051 # default to operate on peer0.org1
- CORE_PEER_LOCALMSPID=Org2MSP
- CORE_PEER_TLS_ENABLED=true # to enable TLS, change to true
- CORE_PEER_TLS_CERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/server.crt
- CORE_PEER_TLS_KEY_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/server.key
- 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
volumes:
- /var/run/:/host/var/run/
- ../chaincode/go/:/opt/gopath/src/github.com/hyperledger/multiple-deployment/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
working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
command: /bin/bash
cli14:
image: hyperledger/fabric-tools:2.2.10
stdin_open: true
container_name: cli4
tty: true
depends_on:
- peer0.org1.example.com
- peer1.org1.example.com
- peer0.org2.example.com
- peer1.org2.example.com
environment:
- GOPATH=/opt/gopath
- CORE_VM_ENDPOINT=unix///host/var/docker.sock
- FABRIC_LOGGING_SPEC=INFO
- CORE_PEER_ID=cli4
- CORE_PEER_ADDRESS=peer1.org2.example.com:8061 # default to operate on peer0.org1
- CORE_PEER_LOCALMSPID=Org2MSP
- CORE_PEER_TLS_ENABLED=true # to enable TLS, change to true
- CORE_PEER_TLS_CERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer1.org2.example.com/tls/server.crt
- CORE_PEER_TLS_KEY_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer1.org2.example.com/tls/server.key
- CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer1.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
volumes:
- /var/run/:/host/var/run/
- ../chaincode/go/:/opt/gopath/src/github.com/hyperledger/multiple-deployment/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
working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
command: /bin/bash
4 启动docker节点。不同的组织按照预置角色分别启动Peer节点
docker-compose up -d
5 创建通道。
查看peer 命令的用法
peer --help
配置本地host文件进行域名解析,否则节点间无法进行通信
gedit /etc/hosts
127.0.0.1 peer0.org1.example.com
127.0.0.1 peer1.org1.example.com
127.0.0.1 peer0.org2.example.com
127.0.0.1 peer1.org2.example.com
进入 cli1 容器
docker exec -it cli1 /bash/bin
测试网络通断
ping orderer.example.com
生成通道文件
peer channel create
-o orderer.example.com:7050
-c mychannel
-f "/tmp/channel-artifacts/$APP_CHANNEL.tx"
--timeout "${TIMEOUT}s"
--tls
--cafile /etc/hyperledger/fabric/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
创建成功后会在当前路径下生成 XXX.block
文件。
注:通过查看日志来处理bug
查看容器信息:
docker ps -a
查看日志:docker logs -f 容器ID
6 将节点加入通道。
Peer节点利用初始区块加入所创建的应用通道
peer channel join -b mychannel.block
更新锚节点
peer channel update
-o orderer.example.com:7050
-c mychannel
-f ./channel-artifacts/Org1MSPanchors.tx
--tls
--cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
将剩余节点加入通道
将生成的通道文件复制到所有peer对应的客户端
docker cp cli1:/opt/gopath/src/github.com/hyperledger/fabric/peer/mychannel.block ./
docker cp mychannel.block cli2:/opt/gopath/src/github.com/hyperledger/fabric/peer/
docker cp mychannel.block cli3:/opt/gopath/src/github.com/hyperledger/fabric/peer/
docker cp mychannel.block cli4:/opt/gopath/src/github.com/hyperledger/fabric/peer/
进入 cli2 容器:org1-peer1 加入通道:
docker exec -it cli2 /bash/bin
peer channel join -b mychannel.block
exit
进入 cli3 容器
docker exec -it cli2 /bash/bin
peer channel join -b mychannel.block
#更新锚节点
peer channel update
-o orderer.example.com:7050
-c mychannel
-f ./channel-artifacts/Org2MSPanchors.tx
--tls
--cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
exit
进入 cli4 容器
docker exec -it cli4 bash
peer channel join -b mychannel.block
exit
查看通道上的区块信息
回到容器1
docker exec -it cli1 bash
查看通道信息
peer channel getinfo -c mychannel
查看加入的通道
peer channel list
7 链码的部署与调用
安装链码
将合约代码复制到宿主机和 docker cli 容器挂载的 chaincodes 目录 ~testwork/chaincode/go/下:
git clone https://XXXXX.git
cp -r XXXXX xxxxx
进入 cli 容器:
docker exec -it cli1 bash
查看该路径在容器映射的文件夹下有无该链码文件
设置代理拉取依赖包
在chaincode/go目录下,将新增的依赖包自动写入当前项目中的vender目录中
cd /etc/hyperledger/fabric/chaincodes/go
go env -w GOPROXY=https://goproxy.cn,direct
go mod vendor
打包链码
peer lifecycle chaincode package smallbank.tar.gz
--path /opt/gopath/pkg/ src/github.com/hyperledger/..../chaincode/go/smallbank
--label smallbank
在 peer 节点安装链码
org1-peer0 节点:
docker exec -it cli2 bash
peer lifecycle chaincode install xxx.tar.gz
查看安装情况
peer lifecycle chaincode queryinstalled
在 其他peer 节点安装链码
docker cp cli1:/opt/gopath/src/github.com/hyperledger/fabric/peer/sacc.tar.gz ./
docker cp sacc.tar.gz cli2:/opt/gopath/src/github.com/hyperledger/fabric/peer/
docker cp sacc.tar.gz cli3:/opt/gopath/src/github.com/hyperledger/fabric/peer/
docker cp sacc.tar.gz cli4:/opt/gopath/src/github.com/hyperledger/fabric/peer/
cli2
docker exec -it cli2 bash
peer lifecycle chaincode install xxx.tar.gz
peer lifecycle chaincode queryinstalled #查看安装情况
exit
cli3
docker exec -it cli2 bash
peer lifecycle chaincode install xxx.tar.gz
peer lifecycle chaincode queryinstalled #查看安装情况
exit
cli4
docker exec -it cli4 bash
peer lifecycle chaincode install xxx.tar.gz
peer lifecycle chaincode queryinstalled #查看安装情况
exit
批准链码定义
通道中的成员需要对链码的参数投票,决定是否通过该链码,一个通道中每个想要使用该链码的成员都需要为他的组织批准这个链码定义,那么第一步,他将批准提交给排序节点,第二步,分发给所有peer节点,这项批准是由组织管理员提交的,提交一个批准交易即可。
org1 批准链码定义:。
docker exec -it cli1 bash
peer lifecycle chaincode approveformyorg
-o orderer0.example.com:7050
--ordererTLSHostnameOverride orderer0.example.com
--channelID businesschannel
--name hyperledger-fabric-contract-java-demo
--version 1.0
--package-id $CC_PACKAGE_ID
--sequence 1
--tls true
--cafile /etc/hyperledger/fabric/crypto-config/ordererOrganizations/example.com/orderers/orderer0.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
查看链码批准状态:
peer lifecycle chaincode checkcommitreadiness
--channelID mychannel
--name
--version
--init-required
--sequence 1
-- tls
--cafile
--output json
exit
org2 批准链码定义:
docker exec -it cli3 bash
peer lifecycle chaincode approveformyorg -o orderer0.example.com:7050 --ordererTLSHostnameOverride orderer0.example.com --channelID businesschannel --name hyperledger-fabric-contract-java-demo --version 1.0 --package-id $CC_PACKAGE_ID --sequence 1 --tls --cafile /etc/hyperledger/fabric/crypto-config/ordererOrganizations/example.com/orderers/orderer0.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
检查通道成员是否已批准相同的链码定义:
peer lifecycle chaincode checkcommitreadiness --channelID businesschannel --name hyperledger-fabric-contract-java-demo --version 1.0 --sequence 1 --tls --cafile /etc/hyperledger/fabric/crypto-config/ordererOrganizations/example.com/orderers/orderer0.example.com/msp/tlscacerts/tlsca.example.com-cert.pem --output json
输出结果如下:
{
"approvals": {
"Org1MSP": true,
"Org2MSP": true
}
}
将链码提交到通道:
peer lifecycle chaincode commit -
o orderer0.example.com:7050
--ordererTLSHostnameOverride orderer0.example.com
--channelID businesschannel
--name hyperledger-fabric-contract-java-demo
--version 1.0
--sequence 1
--tls
--cafile /etc/hyperledger/fabric/crypto-config/ordererOrganizations/example.com/orderers/orderer0.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
--peerAddresses peer0.org1.example.com:7051
--tlsRootCertFiles /etc/hyperledger/fabric/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses peer0.org2.example.com:7051 --tlsRootCertFiles /etc/hyperledger/fabric/crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt
用 peer lifecycle chaincode querycommitted 命令来确认链码定义已提交给通道:
peer lifecycle chaincode querycommitted --channelID businesschannel --name hyperledger-fabric-contract-java-demo --cafile /etc/hyperledger/fabric/crypto-config/ordererOrganizations/example.com/orderers/orderer0.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
调用链码
链码实例化
其实链码实例化,就是一笔特殊的交易,链码在某个节点实例化后,实例化的信息就被广播到通道内的所有节点。如果其它节点再次实例化,自然就会冲突。
# 调用 createCat 函数对链码初始化
#根据链码中的初始函数进行传入相应的参数进行初始化,进行实例化
peer chaincode invoke
-o orderer0.example.com:7050
--ordererTLSHostnameOverride orderer0.example.com
--tls
--cafile /etc/hyperledger/fabric/crypto-config/ordererOrganizations/example.com/orderers/orderer0.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
-C businesschannel
-n hyperledger-fabric-contract-java-demo
--peerAddresses peer0.org1.example.com:7051
--tlsRootCertFiles /etc/hyperledger/fabric/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
--peerAddresses peer0.org2.example.com:7051
--tlsRootCertFiles /etc/hyperledger/fabric/crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt
-c '{"function":"createCat","Args":["cat-0" , "tom" , "3" , "蓝色" , "大懒猫"]}'
# 调用 queryCat 函数
peer chaincode query -C businesschannel -n hyperledger-fabric-contract-java-demo -c '{"Args":["queryCat" , "cat-0"]}'