Fabric v1.4.3的First-network默认是单机版本,采用solo模式。下面介绍其多机版本的部署方法,即4 peer+1 order 它们都在不同的机器上运行。
1、节点描述
节点 | IP | 说明 | 所在组织 |
---|---|---|---|
order | 192.168.30.11 | 排序节点 | 独立 |
peer0.org1 | 192.168.30.22 | 普通节点 | org1 |
peer1.org1 | 192.168.30.33 | 普通节点 | org1 |
peer0.org2 | 192.168.30.44 | 普通节点 | org2 |
peer1.org2 | 192.168.30.55 | 普通节点 | org2 |
2、软件环境
fabric-samples v1.4.3
fabric v1.4.3
fabric ca v1.4.3
Ubuntu 16.04
3、将First-network复制一份,重命名为one,然后精简one文件夹
3.1 精简first-network
cd $GOPATH/src/github.com/hyperledger/fabric-samples
cp -r first-network one
cd one
在order节点,对one/文件夹进行精简,得到2个文件夹+7个文件,如图(2)所示:
下面的创世区块、身份证书、通道配置文件,都是通过工具,在$GOPATH/src/github.com/hyperledger/fabric-samples/one里生成的。
3.2 修改端口
a) 修改one/configtx.yaml里org2的锚节点peer0.org2,将其端口改为7051,如下所示:
AnchorPeers:
# AnchorPeers defines the location of peers which can be used
# for cross org gossip communication. Note, this value is only
# encoded in the genesis block in the Application section context
- Host: peer0.org2.example.com
Port: 7051 ##修改此处
b) 修改one/base/docker-compose-base.yaml里4个peer节点的端口,如下:
order节点,使用7050端口。
4个peer节点,除了CHAINCODEADDRESS=7052,CHAINCODELISTENADDRESS=7052以外,其他端口统一使用7051。
# Copyright IBM Corp. All Rights Reserved.
#
# SPDX-License-Identifier: Apache-2.0
#
version: '2'
services:
orderer.example.com:
container_name: orderer.example.com
extends:
file: peer-base.yaml
service: orderer-base
volumes:
- ../channel-artifacts/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
peer0.org1.example.com:
container_name: peer0.org1.example.com
extends:
file: peer-base.yaml
service: peer-base
environment:
- 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:7051
- CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer0.org1.example.com:7051
- CORE_PEER_LOCALMSPID=Org1MSP
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
- peer0.org1.example.com:/var/hyperledger/production
ports:
- 7051:7051
peer1.org1.example.com:
container_name: peer1.org1.example.com
extends:
file: peer-base.yaml
service: peer-base
environment:
- CORE_PEER_ID=peer1.org1.example.com
- CORE_PEER_ADDRESS=peer1.org1.example.com:7051
- CORE_PEER_LISTENADDRESS=0.0.0.0:7051
- CORE_PEER_CHAINCODEADDRESS=peer1.org1.example.com:7052
- CORE_PEER_CHAINCODELISTENADDRESS=0.0.0.0:7052
- CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer1.org1.example.com:7051
- CORE_PEER_GOSSIP_BOOTSTRAP=peer0.org1.example.com:7051
- CORE_PEER_LOCALMSPID=Org1MSP
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:
- 7051:7051
peer0.org2.example.com:
container_name: peer0.org2.example.com
extends:
file: peer-base.yaml
service: peer-base
environment:
- CORE_PEER_ID=peer0.org2.example.com
- CORE_PEER_ADDRESS=peer0.org2.example.com:7051
- CORE_PEER_LISTENADDRESS=0.0.0.0:7051
- CORE_PEER_CHAINCODEADDRESS=peer0.org2.example.com:7052
- CORE_PEER_CHAINCODELISTENADDRESS=0.0.0.0:7052
- CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer0.org2.example.com:7051
- CORE_PEER_GOSSIP_BOOTSTRAP=peer1.org2.example.com:7051
- CORE_PEER_LOCALMSPID=Org2MSP
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:
- 7051:7051
peer1.org2.example.com:
container_name: peer1.org2.example.com
extends:
file: peer-base.yaml
service: peer-base
environment:
- CORE_PEER_ID=peer1.org2.example.com
- CORE_PEER_ADDRESS=peer1.org2.example.com:7051
- CORE_PEER_LISTENADDRESS=0.0.0.0:7051
- CORE_PEER_CHAINCODEADDRESS=peer1.org2.example.com:7052
- CORE_PEER_CHAINCODELISTENADDRESS=0.0.0.0:7052
- CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer1.org2.example.com:7051
- CORE_PEER_GOSSIP_BOOTSTRAP=peer0.org2.example.com:7051
- CORE_PEER_LOCALMSPID=Org2MSP
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:
- 7051:7051
3.3 制作身份证书
cryptogen工具通过读取crypto-config.yaml配置文件,来生成组织结构与身份证书
cd ./fabric-sample/one
../bin/cryptogen generate --config=./crypto-config.yaml
3.4 生成创世区块
configtxgen 工具通过读取 configtx.yaml 配置文件,来生成网络启动的配置文件
## 使能FABRIC_CFG_PATH 变量
export FABRIC_CFG_PATH=$PWD
## 生成创世区块
cd $GOPATH/src/github.com/hyperledger/fabric-samples/one
../bin/configtxgen -profile TwoOrgsOrdererGenesis -outputBlock ./channel-artifacts/genesis.block
3.5 生成通道配置文件
创建一个mychannel的通道,并生成通道配置文件channel.tx,其保存在one/channel-artifacts目录下。
export CHANNEL_NAME=mychannel && ../bin/configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID $CHANNEL_NAME
3.6 生成2个组织的锚节点文件
../bin/configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org1MSP
../bin/configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org2MSP
把这个one文件夹,使用scp命令,或者ftp拷贝其他4个节点。
4、设置/etc/hosts
order、peer0.org1、peer1.org1、peer0.org2、peer1.org2这5台主机都需要配置/etc/hosts,如下所示。
a)打开/etc/hosts
sudo vim /etc/hosts
b) 添加5个域名解析
192.168.30.11 orderer.example.com
192.168.30.22 peer0.org1.example.com
192.168.30.33 peer1.org1.example.com
192.168.30.44 peer0.org2.example.com
192.168.30.55 peer1.org2.example.com
c) 重启网络
sudo /etc/init.d/networking restart
5、设置配置文件
5.1 order节点配置
a) 复制docker-compose-cli.yaml,并重命名为docker-compose-orderer.yaml
cd $GOPATH/src/github.com/hyperledger/fabric-samples/one
cp docker-compose-cli.yaml docker-compose-orderer.yaml
b) 精简docker-compose-orderer.yaml文件,如下:
//docker-compose-orderer.yaml
# Copyright IBM Corp. All Rights Reserved.
#
# SPDX-License-Identifier: Apache-2.0
#
version: '2'
volumes:
orderer.example.com:
networks:
byfn:
services:
orderer.example.com:
extends:
file: base/docker-compose-base.yaml
service: orderer.example.com
container_name: orderer.example.com
networks:
- byfn
5.2 peer0.org1节点配置
a) 复制docker-compose-cli.yaml,并重命名为docker-compose-peer0-Org1.yaml
cd $GOPATH/src/github.com/hyperledger/fabric-samples/one
cp docker-compose-cli.yaml docker-compose-peer0-Org1.yaml
b) 精简docker-compose-peer0-Org1.yaml文件,如下:
//docker-compose-peer0-Org1.yaml
# Copyright IBM Corp. All Rights Reserved.
#
# SPDX-License-Identifier: Apache-2.0
#
version: '2'
volumes:
peer0.org1.example.com:
networks:
byfn:
services:
peer0.org1.example.com:
container_name: peer0.org1.example.com
extends:
file: base/docker-compose-base.yaml
service: peer0.org1.example.com
networks:
- byfn
extra_hosts: ##填写与该结点相连的其他节点IP
- "orderer.example.com:192.168.30.11"
- "peer1.org1.example.com:192.168.30.33"
- "peer0.org2.example.com:192.168.30.44"
- "peer1.org2.example.com:192.168.30.55"
cli:
container_name: cli
image: hyperledger/fabric-tools:$IMAGE_TAG
tty: true
stdin_open: true
environment:
- SYS_CHANNEL=$SYS_CHANNEL
- GOPATH=/opt/gopath
- CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
#- FABRIC_LOGGING_SPEC=DEBUG
- FABRIC_LOGGING_SPEC=INFO
- 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/msp
working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
command: /bin/bash
volumes:
- /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-artifacts
depends_on:
- peer0.org1.example.com
networks:
- byfn
extra_hosts: ##填写所有的节点IP
- "orderer.example.com:192.168.30.11"
- "peer0.org1.example.com:192.168.30.22"
- "peer1.org1.example.com:192.168.30.33"
- "peer0.org2.example.com:192.168.30.44"
- "peer1.org2.example.com:192.168.30.55"
5.3 peer1.org1节点配置
a) 复制docker-compose-cli.yaml,并重命名为docker-compose-peer1-Org1.yaml
cd $GOPATH/src/github.com/hyperledger/fabric-samples/one
cp docker-compose-cli.yaml docker-compose-peer1-Org1.yaml
b) 精简docker-compose-peer11-Org1.yaml文件,如下:
//docker-compose-peer1-Org1.yaml
# Copyright IBM Corp. All Rights Reserved.
#
# SPDX-License-Identifier: Apache-2.0
#
version: '2'
volumes:
peer1.org1.example.com:
networks:
byfn:
services:
peer1.org1.example.com:
container_name: peer1.org1.example.com
extends:
file: base/docker-compose-base.yaml
service: peer1.org1.example.com
networks:
- byfn
extra_hosts: ##填写与该结点相连的其他节点IP
- "orderer.example.com:192.168.30.11"
- "peer0.org1.example.com:192.168.30.22"
- "peer0.org2.example.com:192.168.30.44"
- "peer1.org2.example.com:192.168.30.55"
cli:
container_name: cli
image: hyperledger/fabric-tools:$IMAGE_TAG
tty: true
stdin_open: true
environment:
- SYS_CHANNEL=$SYS_CHANNEL
- GOPATH=/opt/gopath
- CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
#- FABRIC_LOGGING_SPEC=DEBUG
- FABRIC_LOGGING_SPEC=INFO
- CORE_PEER_ID=cli
- CORE_PEER_ADDRESS=peer1.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/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
working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
command: /bin/bash
volumes:
- /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-artifacts
depends_on:
- peer1.org1.example.com
networks:
- byfn
extra_hosts: ##填写所有的节点IP
- "orderer.example.com:192.168.30.11"
- "peer0.org1.example.com:192.168.30.22"
- "peer1.org1.example.com:192.168.30.33"
- "peer0.org2.example.com:192.168.30.44"
- "peer1.org2.example.com:192.168.30.55"
5.4 peer0.org2节点配置
a) 复制docker-compose-cli.yaml,并重命名为docker-compose-peer0-Org2.yaml
cd $GOPATH/src/github.com/hyperledger/fabric-samples/one
cp docker-compose-cli.yaml docker-compose-peer0-Org2.yaml
b) 精简docker-compose-peer0-Org2.yaml文件,如下:
//docker-compose-peer0-Org2.yaml
# Copyright IBM Corp. All Rights Reserved.
#
# SPDX-License-Identifier: Apache-2.0
#
version: '2'
volumes:
peer0.org2.example.com:
networks:
byfn:
services:
peer0.org2.example.com:
container_name: peer0.org2.example.com
extends:
file: base/docker-compose-base.yaml
service: peer0.org2.example.com
networks:
- byfn
extra_hosts:
- "orderer.example.com:192.168.30.11"
- "peer0.org1.example.com:192.168.30.22"
- "peer1.org1.example.com:192.168.30.33"
- "peer1.org2.example.com:192.168.30.55"
cli:
container_name: cli
image: hyperledger/fabric-tools:$IMAGE_TAG
tty: true
stdin_open: true
environment:
- SYS_CHANNEL=$SYS_CHANNEL
- GOPATH=/opt/gopath
- CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
#- FABRIC_LOGGING_SPEC=DEBUG
- FABRIC_LOGGING_SPEC=INFO
- CORE_PEER_ID=cli
- CORE_PEER_ADDRESS=peer0.org2.example.com:7051
- CORE_PEER_LOCALMSPID=Org2MSP
- CORE_PEER_TLS_ENABLED=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
working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
command: /bin/bash
volumes:
- /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-artifacts
depends_on:
- peer0.org2.example.com
networks:
- byfn
extra_hosts:
- "orderer.example.com:192.168.30.11"
- "peer0.org1.example.com:192.168.30.22"
- "peer1.org1.example.com:192.168.30.33"
- "peer0.org2.example.com:192.168.30.44"
- "peer1.org2.example.com:192.168.30.55"
5.5 peer1.org2节点配置
a) 复制docker-compose-cli.yaml,并重命名为docker-compose-peer1-Org2.yaml
cd $GOPATH/src/github.com/hyperledger/fabric-samples/one
cp docker-compose-cli.yaml docker-compose-peer1-Org2.yaml
b) 精简docker-compose-peer1-Org2.yaml文件,如下:
//docker-compose-peer1-Org2.yaml
# Copyright IBM Corp. All Rights Reserved.
#
# SPDX-License-Identifier: Apache-2.0
#
version: '2'
volumes:
peer1.org2.example.com:
networks:
byfn:
services:
peer1.org2.example.com:
container_name: peer1.org2.example.com
extends:
file: base/docker-compose-base.yaml
service: peer1.org2.example.com
networks:
- byfn
extra_hosts:
- "orderer.example.com:192.168.30.11"
- "peer0.org1.example.com:192.168.30.22"
- "peer1.org1.example.com:192.168.30.33"
- "peer0.org2.example.com:192.168.30.44"
cli:
container_name: cli
image: hyperledger/fabric-tools:$IMAGE_TAG
tty: true
stdin_open: true
environment:
- SYS_CHANNEL=$SYS_CHANNEL
- GOPATH=/opt/gopath
- CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
#- FABRIC_LOGGING_SPEC=DEBUG
- FABRIC_LOGGING_SPEC=INFO
- CORE_PEER_ID=cli
- CORE_PEER_ADDRESS=peer1.org2.example.com:7051
- CORE_PEER_LOCALMSPID=Org2MSP
- CORE_PEER_TLS_ENABLED=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
working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
command: /bin/bash
volumes:
- /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-artifacts
depends_on:
- peer1.org2.example.com
networks:
- byfn
extra_hosts:
- "orderer.example.com:192.168.30.11"
- "peer0.org1.example.com:192.168.30.22"
- "peer1.org1.example.com:192.168.30.33"
- "peer0.org2.example.com:192.168.30.44"
- "peer1.org2.example.com:192.168.30.55"
5.6 peer0.org1的CouchDB配置
a) 复制docker-compose-couch.yaml,并重命名为docker-compose-peer0-Org1-couch.yaml
cd $GOPATH/src/github.com/hyperledger/fabric-samples/one
cp docker-compose-couch.yaml docker-compose-peer0-Org1-couch.yaml
b) 精简docker-compose-peer0-Org1-couch.yaml文件,如下:
//docker-compose-peer0-Org1-couch.yaml
# Copyright IBM Corp. All Rights Reserved.
#
# SPDX-License-Identifier: Apache-2.0
#
version: '2'
networks:
byfn:
services:
couchdb0:
container_name: couchdb0
image: 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:
- byfn
peer0.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
5.7 peer1.org1的CouchDB配置
a) 复制docker-compose-couch.yaml,并重命名为docker-compose-peer1-Org1-couch.yaml
cd $GOPATH/src/github.com/hyperledger/fabric-samples/one
cp docker-compose-couch.yaml docker-compose-peer1-Org1-couch.yaml
b) 精简docker-compose-peer1-Org1-couch.yaml文件,如下:
//docker-compose-peer1-Org1-couch.yaml
# Copyright IBM Corp. All Rights Reserved.
#
# SPDX-License-Identifier: Apache-2.0
#
version: '2'
networks:
byfn:
services:
couchdb0:
container_name: couchdb0
image: 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:
- byfn
peer1.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
5.8 peer0.org2的CouchDB配置
a) 复制docker-compose-couch.yaml,并重命名为docker-compose-peer0-Org2-couch.yaml
cd $GOPATH/src/github.com/hyperledger/fabric-samples/one
cp docker-compose-couch.yaml docker-compose-peer0-Org2-couch.yaml
b) 精简docker-compose-peer0-Org2-couch.yaml文件,如下:
//docker-compose-peer0-Org2-couch.yaml
# Copyright IBM Corp. All Rights Reserved.
#
# SPDX-License-Identifier: Apache-2.0
#
version: '2'
networks:
byfn:
services:
couchdb0:
container_name: couchdb0
image: 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:
- byfn
peer0.org2.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
5.9 peer1.org2的CouchDB配置
a) 复制docker-compose-couch.yaml,并重命名为docker-compose-peer1-Org2-couch.yaml
cd $GOPATH/src/github.com/hyperledger/fabric-samples/one
cp docker-compose-couch.yaml docker-compose-peer1-Org2-couch.yaml
b) 精简docker-compose-peer1-Org2-couch.yaml文件,如下:
//docker-compose-peer1-Org2-couch.yaml
# Copyright IBM Corp. All Rights Reserved.
#
# SPDX-License-Identifier: Apache-2.0
#
version: '2'
networks:
byfn:
services:
couchdb0:
container_name: couchdb0
image: 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:
- byfn
peer1.org2.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
5.10 节点的目录结构
a) order节点的目录结构
b) peer0.org1节点的目录结构
c) peer1.org1节点的目录结构
d) peer0.org2节点的目录结构
f) peer1.org2节点的目录结构
6、启动order和peer节点
6.1 启动order
cd /usr/local/gocode/src/github.com/hyperledger/fabric-samples/one
sudo docker-compose -f docker-compose-orderer.yaml up
6.2 启动peer0.org1
sudo docker-compose -f docker-compose-peer0-Org1.yaml -f docker-compose-peer0-Org1-couch.yaml up
6.3 启动peer1.org1
sudo docker-compose -f docker-compose-peer1-Org1.yaml -f docker-compose-peer1-Org1-couch.yaml up
6.4 启动peer0.org2
sudo docker-compose -f docker-compose-peer0-Org2.yaml -f docker-compose-peer0-Org2-couch.yaml up
6.5 启动peer1.org2
sudo docker-compose -f docker-compose-peer1-Org2.yaml -f docker-compose-peer1-Org2-couch.yaml up
7、创建通道文件,并拷贝到其他3个peer节点
通道文件,保存了通道里的组织个数,它只需要创建一次,把拷贝到各个peer节点即可。这里从peer0.org1节点创建通道文件mychannel.block,然后把它拷贝到peer0.org2、peer1.org1、peer1.org2节点里。具体如下:
7.1 进入peer0.org1的cli容器
docker exec -it cli bash
7.2 设置环境,并创建通道文件
export CHANNEL_NAME=mychannel
export 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 $CHANNEL_NAME -f ./channel-artifacts/channel.tx --tls --cafile $ORDERER_CA
得到mychannel.block,将这个mychannel.block文件,拷贝peer0.org2、peer1.org1、peer.org2的peer目录里,方法如下:
a)另外打开一个终端2,将mychannel.block从peer0.org 的cli容器拷贝到 one/myblcok文件夹
## 创建myblock文件夹
cd /usr/local/gocode/src/github.com/hyperledger/fabric-samples/one
mkdir myblock
## 将mychannel.block文件拷贝出来
sudo docker cp cli:/opt/gopath/src/github.com/hyperledger/fabric/peer/mychannel.block /usr/local/gocode/src/github.com/hyperledger/fabric-samples/one
b) 然后,用ftp工具把mychannel.block拷贝其他3个peer节点的/usr/local/gocode/src/github.com/hyperledger/fabric-samples/one/myblock目录,
再使用sudo docker cp命令,将其拷贝到peer0.org2、peer1.org1、peer.org2的cli容器里如下所示:
sudo docker cp /usr/local/gocode/src/github.com/hyperledger/fabric-samples/one/myblock/mychannel.block cli:/opt/gopath/src/github.com/hyperledger/fabric/peer/
8、加入通道,并设置锚节点
8.1 将4个peer节点加入通道
下面这3条命令,分别在4个peer的cli容器,都运行一遍即可。
export CHANNEL_NAME=mychannel
export 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 join -b mychannel.block
8.2 设置锚节点,并安装链码
a) 将peer0.org1设为组织org1的锚节点,同时安装链码
peer channel update -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/Org1MSPanchors.tx --tls --cafile $ORDERER_CA
peer chaincode install -n mycc -v 1.0 -p github.com/chaincode/chaincode_example02/go/
b) 将peer0.org2设为组织org2的锚节点,同时安装链码
peer channel update -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/Org2MSPanchors.tx --tls --cafile $ORDERER_CA
peer chaincode install -n mycc -v 1.0 -p github.com/chaincode/chaincode_example02/go/
9、实例化链码,并测试
9.1 实例化
peer chaincode instantiate -o orderer.example.com:7050 --tls --cafile $ORDERER_CA -C $CHANNEL_NAME -n mycc -v 1.0 -c '{"Args":["init","a", "100", "b","200"]}' -P "AND ('Org1MSP.peer','Org2MSP.peer')"
9.2 查询
peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}'
9.3 调用
peer chaincode invoke -o orderer.example.com:7050 --tls --cafile $ORDERER_CA -C $CHANNEL_NAME -n mycc --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:7051 --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"]}'
效果如下:
10、关闭并清空fabric网络
当不需要使用fabric时,请关闭fabric网络,如下:
10.1 关闭并清空order
sudo docker-compose -f docker-compose-orderer.yaml down
sudo docker-compose -f docker-compose-orderer.yaml down --volumes
10.2 关闭并清空peer0-Org1
sudo docker-compose -f docker-compose-peer0-Org1.yaml -f docker-compose-peer0-Org1-couch.yaml down
sudo docker-compose -f docker-compose-peer0-Org1.yaml -f docker-compose-peer0-Org1-couch.yaml down --volumes
10.3 关闭并清空peer1-Org1
sudo docker-compose -f docker-compose-peer1-Org1.yaml -f docker-compose-peer1-Org1-couch.yaml down
sudo docker-compose -f docker-compose-peer1-Org1.yaml -f docker-compose-peer1-Org1-couch.yaml down --volumes
10.4 关闭并清空peer0-Org2
sudo docker-compose -f docker-compose-peer0-Org2.yaml -f docker-compose-peer0-Org2-couch.yaml down
sudo docker-compose -f docker-compose-peer0-Org2.yaml -f docker-compose-peer0-Org2-couch.yaml down --volumes
10.5 关闭并清空peer1-Org2
sudo docker-compose -f docker-compose-peer1-Org2.yaml -f docker-compose-peer1-Org2-couch.yaml down
sudo docker-compose -f docker-compose-peer1-Org2.yaml -f docker-compose-peer1-Org2-couch.yaml down --volumes