基于Raft共识算法搭建多机Fabric1.4.1网络
在fabric1.4.1的版本中,提供了基于raft共识的raft排序服务。raft的模型可以容忍奔溃,如果有节点故障掉线可以正常运行。前提是要有大多数存活,也就是要保证1/2以上的节点个数正常运行。raft共识是“主从模型”,主节点通过动态选举决定,从节点是主节点的复制。raft排序服务比kafka排序服务易于设置和管理。并且raft的设计允许不同的组织贡献节点来共同组成排序服务。raft排序是fabric实现拜占庭容错排序服务的第⼀步,如我们所见,开发raft排序服务的决定也是基于此的。raft节点之间通过使⽤用TLS认证身份,如果一个攻击者想要伪造raft节点,就必须要获得⼀个有效的证书和对应的私钥。所以,没有⼀个有效的TLS证书,是不可能运行raft节点的。 要使用raft共识,需要修改两个地⽅:
1. 本地配置:⽤用来控制节点的特性,例例如TLS配置,备份个数和⽂文件存储。
2. 通道配置:⽤用来定义raft集群的成员关系,以及raft协议相关的参数,例例如⼼心跳间隔、leader节点超时时间等。
3. 需要注意的是,每个channel有属于它⾃己的raft集群。因此,在chennel中要指定raft节点,指定的方式是把raft节点的tls证书配置到channel的配置文件中。在系统通道和应用通道中的配置中,每个排序以consenter的形式列出来。下⾯有configtx.yaml中关于raft节点的配置。
4. 必须开启TLS才能使用Raft排序
上文中已经把搭建fabric网络所需要的环境部署工作已经完成。
1、搭建基于Raft共识的多机fabric网络环境的说明与准备
在本次基于Raft共识搭建的fabric1.4.1网络环境中,准备搭建五个orderer节点、一个组织四个peer,未加入CouchDB和fabric-ca.这里要说明一下,raft共识中同步的节点必须为奇数,因为在整个共识环境中每个节点都是follower,当他们感受到网络中没有leader节点向他们发送heartbeat的时候,他们就会变成candidater,这时候需要他们之间相互投票才能将自己由candidater变成leader,达成一致的过程需要整个网络中有n/2+1个节点达成一致,整个网络才会达成一致,所以需要奇数个同步节点,在leader选举出来之后通过leader与客户端交互,将本地的log同步到各个follower,点击这里了解更多的raft算法,。
本文一共用到四台华为云主机,每台主机均是ubuntu18.04.2系统,各个主机的IP以及节点分配情况见下表:
下表中是各个节点分配情况以及对应的主机IP
| 各个主机的节点分配情况 | 对应主机的IP地址 |
|---|---|
| orderer0.example.com,peer0.org1.example.com ,cli | 192.168.1.16 |
| orderer1.example.com,peer1.org1.example.com,cli | 192.168.1.17 |
| orderer2.example.com,peer2.org1.example.com,cli | 192.168.1.173 |
| orderer3.example.com,orderer4.example.com,peer3.org1.example.com,cli | 192.168.1.190 |
2、基于Raft共识搭建多机fabric网络
这一节是对每台华为云主机的各个节点进行网络配置,主要涉及的是配置文件。
- 因为在四台主机的项目目录必须一样,所有在四台主机的家目录下执行相同的命令mkdir lpgsy来创建项目目录,并进入项目目录。
第一台主机 192.168.1.16
-
在项目目录中执行命令vim crypto-config.yaml,并将下列代码块中的内容粘贴到文件中(192.168.1.16),生成yaml文件。
OrdererOrgs: # 排序节点的组织定义 - Name: Orderer # orderer节点的名称 Domain: example.com # orderer节点的根域名 Specs: # orderer节点的主机名 - Hostname: orderer0 - Hostname: orderer1 - Hostname: orderer2 - Hostname: orderer3 - Hostname: orderer4 PeerOrgs: # peer节点的组织定义 - Name: Org1 # 组织1的名称 Domain: org1.example.com # 组织1的根域名 EnableNodeOUs: true # 是否显示节点的详细信息 Template: Count: 4 # 组织1中的节点(peer)数目 Users: Count: 4 # 组织1中的用户数目 -
执行命令cryptogen generate --config ./crypto-config.yaml生成各个节点的证书(192.168.1.16)。
-
执行命令vim configtx.yaml,并将下列代码块中的内容粘贴到文件中(192.168.1.16)。
--- Organizations: - &OrdererOrg # orderer节点配置信息 Name: OrdererOrg # orderer节点名称 ID: OrdererMSP # orderer节点ID MSPDir: crypto-config/ordererOrganizations/example.com/msp # msp文件路径 Policies: Readers: Type: Signature Rule: "OR('OrdererMSP.member')" Writers: Type: Signature Rule: "OR('OrdererMSP.member')" Admins: Type: Signature Rule: "OR('OrdererMSP.admin')" - &Org1 # 组织 Name: Org1MSP # 组织名称 ID: Org1MSP # 组织ID MSPDir: crypto-config/peerOrganizations/org1.example.com/msp # 组织msp文件路径 AnchorPeers: # 访问组织的域名和端口 - Host: peer0.org1.example.com Port: 7051 Policies: Readers: Type: Signature Rule: "OR('Org1MSP.admin','Org1MSP.peer','Org1MSP.client')" Writers: Type: Signature Rule: "OR('Org1MSP.admin','Org1MSP.client')" Admins: Type: Signature Rule: "OR('Org1MSP.admin')" Capabilities: Channel: &ChannelCapabilities V1_3: true Orderer: &OrdererCapabilities V1_1: true Application: &ApplicationCapabilities V1_3: true V1_2: false V1_1: false Application: &ApplicationDefaults Organizations: Policies: Readers: Type: ImplicitMeta Rule: "ANY Readers" Writers: Type: ImplicitMeta Rule: "ANY Writers" Admins: Type: ImplicitMeta Rule: "MAJORITY Admins" Capabilities: <<: *ApplicationCapabilities Orderer: &OrdererDefaults OrdererType: solo Addresses: - orderer0.example.com:7050 BatchTimeout: 2s BatchSize: MaxMessageCount: 200 AbsoluteMaxBytes: 2 MB PreferredMaxBytes: 512 KB Kafka: Brokers: - 127.0.0.1:9092 Organizations: Policies: Readers: Type: ImplicitMeta Rule: "ANY Readers" Writers: Type: ImplicitMeta Rule: "ANY Writers" Admins: Type: ImplicitMeta Rule: "MAJORITY Admins" BlockValidation: Type: ImplicitMeta Rule: "ANY Writers" Channel: &ChannelDefaults Policies: Readers: Type: ImplicitMeta Rule: "ANY Readers" Writers: Type: ImplicitMeta Rule: "ANY Writers" Admins: Type: ImplicitMeta Rule: "MAJORITY Admins" Capabilities: <<: *ChannelCapabilities Profiles: # 定义系统通道和应用通道配置信息,从Profiles获取-profile后边的参数 TwoOrgsOrdererGenesis: #组织定义标识符,可自定义 # 系统通道配置标识符,自定义 <<: *ChannelDefaults # 引用上面 ChannelDefaults 的属性 # 具体通道相关配置信息引用ChannelDefaults Capabilities: <<: *ChannelCapabilities # 引用 ChannelCapabilities 的属性 Orderer: # 配置属性,系统关键字,不能修改 # 系统通道配置信息 <<: *OrdererDefaults # 引用上面 OrdererDefaults 的属性 # 具体配置信息引用OrdererDefaults OrdererType: etcdraft #指定排序共识 EtcdRaft: Consenters: - Host: orderer0.example.com Port: 7050 ClientTLSCert: crypto-config/ordererOrganizations/example.com/orderers/orderer0.example.com/tls/server.crt ServerTLSCert: crypto-config/ordererOrganizations/example.com/orderers/orderer0.example.com/tls/server.crt - Host: orderer1.example.com Port: 7050 ClientTLSCert: crypto-config/ordererOrganizations/example.com/orderers/orderer1.example.com/tls/server.crt ServerTLSCert: crypto-config/ordererOrganizations/example.com/orderers/orderer1.example.com/tls/server.crt - Host: orderer2.example.com Port: 7050 ClientTLSCert: crypto-config/ordererOrganizations/example.com/orderers/orderer2.example.com/tls/server.crt ServerTLSCert: crypto-config/ordererOrganizations/example.com/orderers/orderer2.example.com/tls/server.crt - Host: orderer3.example.com Port: 7050 ClientTLSCert: crypto-config/ordererOrganizations/example.com/orderers/orderer3.example.com/tls/server.crt ServerTLSCert: crypto-config/ordererOrganizations/example.com/orderers/orderer3.example.com/tls/server.crt - Host: orderer4.example.com Port: 8050 ClientTLSCert: crypto-config/ordererOrganizations/example.com/orderers/orderer4.example.com/tls/server.crt ServerTLSCert: crypto-config/ordererOrganizations/example.com/orderers/orderer4.example.com/tls/server.crt Addresses: - orderer0.example.com:7050 - orderer1.example.com:7050 - orderer2.example.com:7050 - orderer3.example.com:7050 - orderer4.example.com:8050 Organizations: # 系统通道组织 - *OrdererOrg # 引用上面为 OrdererOrg 的属性 # 具体配置信息引用OrdererOrg Capabilities: # 定义系统通道全局功能特性 <<: *OrdererCapabilities #引用上面为 OrdererCapabilities 的属性 # 具体通道排序配置信息引用OrdererCapabilities Application: # 系统通道信息 <<: *ApplicationDefaults # 具体应用通道配置信息引用ApplicationDefaults Organizations: # 系统通道组织 - <<: *OrdererOrg # 具体配置信息引用OrdererOrg Consortiums: # 定义了系统中包含的组织 # 联盟列表 SampleConsortium: # 联盟名称 Organizations: # 系统中包含的组织 # 联盟的组织列表 - *Org1 # 引用了上面的配置 TwoOrgsChannel: # 应用通道配置标识符,自定义 Consortium: SampleConsortium # 应用通道关联的联盟名称 <<: *ChannelDefaults # 具体通道相关配置信息引用ChannelDefaults Application: # 应用通道信息 <<: *ApplicationDefaults # 具体应用通道配置信息引用ApplicationDefaults Organizations: # 联盟的组织列表 - *Org1 Capabilities: # 定义应用通道全局功能特性 <<: *ApplicationCapabilities # 具体应用通道配置信息引用ApplicationCapabilities -
执行命令mkdir channel-artifacts创建文件夹,用来保存通过yaml文件以及系统通道生成的创世块文件(192.168.1.16)。
-
执行命令configtxgen -profile TwoOrgsOrdererGenesis -channelID systemchannel -outputBlock ./channel-artifacts/genesis.block生成系统文件的创世块192.168.1.16)。
-
执行命令configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID
testchannel生成用于创建应用通道的通道文件(192.168.1.16)。 -
接着将整个项目目录lpgsy中的文件拷贝到其他的三台主机上,在其他三台主机的项目目录下执行命令
scp -r gsy@192.168.1.16:$HOME/lpgsy/channel-artifacts ./scp -r gsy@192.168.1.16:$HOME/lpgsy/crypto-config ./
-
执行命令vim docker-compose-orderer.yaml,并将下面代码块中的内容粘贴到文件中(192.168.1.16)。
version: '2' volumes: orderer0.example.com: services: orderer0.example.com: container_name: orderer0.example.com image: hyperledger/fabric-orderer:latest environment: - GODEBUG=netdns=go - FABRIC_LOGGING_SPEC=INFO - ORDERER_GENERAL_LISTENADDRESS=0.0.0.0 # orderer服务器监听的地址 - ORDERER_GENERAL_GENESISMETHOD=file # 初始化块(Genesis)的来源方式 - ORDERER_GENERAL_GENESISFILE=/var/hyperledger/orderer/orderer.genesis.block # 存储初始块文件的路径 - ORDERER_GENERAL_LOCALMSPID=OrdererMSP # orderer节点的ID,在configtx.yaml模块配置文件中指定的 - ORDERER_GENERAL_LOCALMSPDIR=/var/hyperledger/orderer/msp # orderer节点msp文件路径 - ORDERER_GENERAL_TLS_ENABLED=true # 是否启用TLS, true/false - ORDERER_GENERAL_TLS_PRIVATEKEY=/var/hyperledger/orderer/tls/server.key # orderer节点的私钥文件 - 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/genesis.block:/var/hyperledger/orderer/orderer.genesis.block - ./crypto-config/ordererOrganizations/example.com/orderers/orderer0.example.com/msp:/var/hyperledger/orderer/msp - ./crypto-config/ordererOrganizations/example.com/orderers/orderer0.example.com/tls/:/var/hyperledger/orderer/tls - orderer0.example.com:/var/hyperledger/production/orderer ports: - 7050:7050 extra_hosts: - "orderer0.example.com:192.168.1.16" - "orderer1.example.com:192.168.1.17" - "orderer2.example.com:192.168.1.173" - "orderer3.example.com:192.168.1.190" - "orderer4.example.com:192.168.1.190" -
执行命令vim docker-compose-peer.yaml,并将下面代码块中的内容填写到文件中(192.168.1.16)。
version: '2' volumes: peer0.org1.example.com: services: peer0.org1.example.com: container_name: peer0.org1.example.com hostname: peer0.org1.example.com image: hyperledger/fabric-peer:latest environment: - GODEBUG=netdns=go - CORE_PEER_ID=peer0.org1.example.com - CORE_PEER_ADDRESS=peer0.org1.example.com:7051 # 当前peer节点的访问地址 - CORE_PEER_CHAINCODELISTENADDRESS=peer0.org1.example.com:7052 # chaincode的监听地址 - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer0.org1.example.com:7051 # 节点被组织外节点感知时的地址 - CORE_PEER_LOCALMSPID=Org1MSP # peer节点所属的组织的编号, 在configtxgen.yaml中设置的 - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock # docker服务器的地址 - FABRIC_LOGGING_SPEC=INFO - CORE_PEER_GOSSIP_USELEADERELECTION=true # 是否自动选举leader节点, 自动:true - CORE_PEER_GOSSIP_ORGLEADER=false # 当前节点是否为leader节点, 是:true - CORE_PEER_PROFILE_ENABLED=true - CORE_PEER_TLS_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 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:/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 - 7052:7052 - 7053:7053 extra_hosts: - "orderer0.example.com:192.168.1.16" - "orderer1.example.com:192.168.1.17" - "orderer2.example.com:192.168.1.173" - "orderer3.example.com:192.168.1.190" - "orderer4.example.com:192.168.1.190" -
执行命令vi docker-compose-cli.yaml,并将下面代码块中的内容粘贴到文件中(192.168.1.16)
version: '2' services: cli: container_name: cli image: hyperledger/fabric-tools:latest tty: true environment: - GODEBUG=netdns=go - GOPATH=/opt/gopath - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock - 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 volumes: - /var/run/:/host/var/run/ - ./chaincode:/opt/gopath/src/github.com/chaincode - ./crypto-config:/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ - ./channel-artifacts:/opt/gopath/src/github.com/hyperledger/fabric/peer/channel-artifacts extra_hosts: - "orderer0.example.com:192.168.1.16" - "orderer1.example.com:192.168.1.17" - "orderer2.example.com:192.168.1.173" - "orderer3.example.com:192.168.1.190" - "orderer4.example.com:192.168.1.190" - "peer0.org1.example.com:192.168.1.16" - "peer1.org1.example.com:192.168.1.17" - "peer2.org1.example.com:192.168.1.173" - "peer3.org1.example.com:192.168.1.190" -
在项目目录下创建脚本,主要是来启动容器和关闭容器的(192.168.1.16)。
在项目目录下执行 vim up.sh,并将下面代码块中的内容粘贴到文件中,填写完成后执行 chmod +x up.sh 为文件添加执行权限(192.168.1.16)。
#!/bin/sh docker-compose -f ./docker-compose-orderer.yaml up -d sleep 10 docker-compose -f ./docker-compose-peer.yaml up -d docker-compose -f ./docker-compose-cli.yaml up -d
在项目目录下执行 vim down.sh,并将下面代码块中内容粘贴到文件中,填写完成后执行 chmod +x down.sh 为文件添加执行权限(192.168.1.16)。
sudo docker rm -f $(sudo docker ps -aq)
sudo docker network prune
sudo docker volume prune
docker rmi --force `docker images | grep dev-peer | awk '{print $3}'`
第一台华为云服务器的配置已经完毕了,为什么orderer容器启动后需要等10秒才起别的容器,是因为这些时间是留给各个orderer容器,让他们达成一致的,他们需要这时间去选举leader,这一点官方的脚本是留了15秒的时间。
第二台主机 192.168.1.17
1、进入到项目目录lpgsy下,执行命令vim docker-compose-orderer.yaml,并将下面代码块中的内容粘贴到文件中(192.168.1.17)
version: '2'
volumes:
orderer1.example.com:
services:
orderer1.example.com:
container_name: orderer1.example.com
image: hyperledger/fabric-orderer:latest
environment:
- GODEBUG=netdns=go
- FABRIC_LOGGING_SPEC=INFO
- ORDERER_GENERAL_LISTENADDRESS=0.0.0.0
- 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_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/genesis.block:/var/hyperledger/orderer/orderer.genesis.block
- ./crypto-config/ordererOrganizations/example.com/orderers/orderer1.example.com/msp:/var/hyperledger/orderer/msp
- ./crypto-config/ordererOrganizations/example.com/orderers/orderer1.example.com/tls/:/var/hyperledger/orderer/tls
- orderer1.example.com:/var/hyperledger/production/orderer
ports:
- 7050:7050
extra_hosts:
- "orderer0.example.com:192.168.1.16"
- "orderer1.example.com:192.168.1.17"
- "orderer2.example.com:192.168.1.173"
- "orderer3.example.com:192.168.1.190"
- "orderer4.example.com:192.168.1.190"
2、执行命令vi docker-compose-peer.yaml,并将下面代码块中的内容填写到文件中(192.168.1.17)。
version: '2'
volumes:
peer1.org1.example.com:
services:
peer1.org1.example.com:
container_name: peer1.org1.example.com
hostname: peer1.org1.example.com
image: hyperledger/fabric-peer:latest
environment:
- GODEBUG=netdns=go
- CORE_PEER_ID=peer1.org1.example.com
- CORE_PEER_ADDRESS=peer1.org1.example.com:7051
- CORE_PEER_CHAINCODELISTENADDRESS=peer1.org1.example.com:7052
- CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer1.org1.example.com:7051
- CORE_PEER_LOCALMSPID=Org1MSP
- CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
- FABRIC_LOGGING_SPEC=INFO
- CORE_PEER_GOSSIP_USELEADERELECTION=true
- CORE_PEER_GOSSIP_ORGLEADER=false
- CORE_PEER_PROFILE_ENABLED=true
- CORE_PEER_TLS_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
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:
- 7051:7051
- 7052:7052
- 7053:7053
extra_hosts:
- "orderer0.example.com:192.168.1.16"
- "orderer1.example.com:192.168.1.17"
- "orderer2.example.com:192.168.1.173"
- "orderer3.example.com:192.168.1.190"
- "orderer4.example.com:192.168.1.190"
3、执行命令docker-compose-cli.yaml,并将下面代码块中的内容填写到文件中(192.168.1.17)。
version: '2'
services:
cli:
container_name: cli
image: hyperledger/fabric-tools:latest
tty: true
environment:
- GODEBUG=netdns=go
- GOPATH=/opt/gopath
- CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
- 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
volumes:
- /var/run/:/host/var/run/
- ./chaincode:/opt/gopath/src/github.com/chaincode
- ./crypto-config:/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/
- ./channel-artifacts:/opt/gopath/src/github.com/hyperledger/fabric/peer/channel-artifacts
extra_hosts:
- "orderer0.example.com:192.168.1.16"
- "orderer1.example.com:192.168.1.17"
- "orderer2.example.com:192.168.1.173"
- "orderer3.example.com:192.168.1.190"
- "orderer4.example.com:192.168.1.190"
- "peer0.org1.example.com:192.168.1.16"
- "peer1.org1.example.com:192.168.1.17"
- "peer2.org1.example.com:192.168.1.173"
- "peer3.org1.example.com:192.168.1.190"
4、在项目目录下创建脚本,主要是来启动容器和关闭容器的(192.168.1.17)。
在项目目录下执行 vim up.sh,并将下面代码块中的内容粘贴到文件中,填写完成后执行 chmod +x up.sh 为文件添加执行权限(192.168.1.17)。
#!/bin/sh
docker-compose -f ./docker-compose-orderer.yaml up -d
sleep 10
docker-compose -f ./docker-compose-peer.yaml up -d
docker-compose -f ./docker-compose-cli.yaml up -d
5、在项目目录下执行 vim down.sh,并将下面代码块中内容粘贴到文件中,填写完成后执行 chmod +x down.sh 为文件添加执行权限(192.168.1.17)。
sudo docker rm -f $(sudo docker ps -aq)
sudo docker network prune
sudo docker volume prune
docker rmi --force `docker images | grep dev-peer | awk '{print $3}'`
6、执行到这步,第二台主机也配置完毕
第三台主机 192.168.1.173
1、进入到项目目录lpgsy下,执行命令vim docker-compose-orderer.yaml,并将下面代码块中的内容粘贴到文件中(192.168.1.173)
version: '2'
volumes:
orderer2.example.com:
services:
orderer2.example.com:
container_name: orderer2.example.com
image: hyperledger/fabric-orderer:latest
environment:
- GODEBUG=netdns=go
- FABRIC_LOGGING_SPEC=INFO
- ORDERER_GENERAL_LISTENADDRESS=0.0.0.0
- 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_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/genesis.block:/var/hyperledger/orderer/orderer.genesis.block
- ./crypto-config/ordererOrganizations/example.com/orderers/orderer2.example.com/msp:/var/hyperledger/orderer/msp
- ./crypto-config/ordererOrganizations/example.com/orderers/orderer2.example.com/tls/:/var/hyperledger/orderer/tls
- orderer2.example.com:/var/hyperledger/production/orderer
ports:
- 7050:7050
extra_hosts:
- "orderer0.example.com:192.168.1.16"
- "orderer1.example.com:192.168.1.17"
- "orderer2.example.com:192.168.1.173"
- "orderer3.example.com:192.168.1.190"
- "orderer4.example.com:192.168.1.190"
2、执行vi docker-compose-peer.yaml,并将下面代码块中的内容填写到文件中(192.168.1.173)。
version: '2'
volumes:
peer2.org1.example.com:
services:
peer2.org1.example.com:
container_name: peer2.org1.example.com
hostname: peer2.org1.example.com
image: hyperledger/fabric-peer:latest
environment:
- GODEBUG=netdns=go
- CORE_PEER_ID=peer2.org1.example.com
- CORE_PEER_ADDRESS=peer2.org1.example.com:7051
- CORE_PEER_CHAINCODELISTENADDRESS=peer2.org1.example.com:7052
- CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer2.org1.example.com:7051
- CORE_PEER_LOCALMSPID=Org1MSP
- CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
- FABRIC_LOGGING_SPEC=INFO
- CORE_PEER_GOSSIP_USELEADERELECTION=true
- CORE_PEER_GOSSIP_ORGLEADER=false
- CORE_PEER_PROFILE_ENABLED=true
- CORE_PEER_TLS_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
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/peer2.org1.example.com/msp:/etc/hyperledger/fabric/msp
- ./crypto-config/peerOrganizations/org1.example.com/peers/peer2.org1.example.com/tls:/etc/hyperledger/fabric/tls
- peer2.org1.example.com:/var/hyperledger/production
ports:
- 7051:7051
- 7052:7052
- 7053:7053
extra_hosts:
- "orderer0.example.com:192.168.1.16"
- "orderer1.example.com:192.168.1.17"
- "orderer2.example.com:192.168.1.173"
- "orderer3.example.com:192.168.1.190"
- "orderer4.example.com:192.168.1.190"
3、执行vi docker-compose-cli.yaml,并将下面代码块中的内容填写到文件中(192.168.1.173)。
version: '2'
services:
cli:
container_name: cli
image: hyperledger/fabric-tools:latest
tty: true
environment:
- GODEBUG=netdns=go
- GOPATH=/opt/gopath
- CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
- FABRIC_LOGGING_SPEC=INFO
- CORE_PEER_ID=cli
- CORE_PEER_ADDRESS=peer2.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/peer2.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/peer2.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/peer2.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:/opt/gopath/src/github.com/chaincode
- ./crypto-config:/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/
- ./channel-artifacts:/opt/gopath/src/github.com/hyperledger/fabric/peer/channel-artifacts
extra_hosts:
- "orderer0.example.com:192.168.1.16"
- "orderer1.example.com:192.168.1.17"
- "orderer2.example.com:192.168.1.173"
- "orderer3.example.com:192.168.1.190"
- "orderer4.example.com:192.168.1.190"
- "peer0.org1.example.com:192.168.1.16"
- "peer1.org1.example.com:192.168.1.17"
- "peer2.org1.example.com:192.168.1.173"
- "peer3.org1.example.com:192.168.1.190"
4、在项目目录下创建脚本,主要是来启动容器和关闭容器的(192.168.1.173)。
在项目目录下执行 vim up.sh,并将下面代码块中的内容粘贴到文件中,填写完成后执行 chmod +x up.sh 为文件添加执行权限(192.168.1.173)。
#!/bin/sh
docker-compose -f ./docker-compose-orderer.yaml up -d
sleep 10
docker-compose -f ./docker-compose-peer.yaml up -d
docker-compose -f ./docker-compose-cli.yaml up -d
5、在项目目录下执行 vim down.sh,并将下面代码块中内容粘贴到文件中,填写完成后执行 chmod +x down.sh 为文件添加执行权限(192.168.1.173)。
sudo docker rm -f $(sudo docker ps -aq)
sudo docker network prune
sudo docker volume prune
docker rmi --force `docker images | grep dev-peer | awk '{print $3}'`
6、执行到这步,第三台主机也配置完毕
第四台主机 192.168.1.190
1、进入到项目目录lpgsy下,执行命令vim docker-compose-orderer.yaml,并将下面代码块中的内容粘贴到文件中(192.168.1.190)
version: '2'
volumes:
orderer3.example.com:
services:
orderer3.example.com:
container_name: orderer3.example.com
image: hyperledger/fabric-orderer:latest
environment:
- GODEBUG=netdns=go
- FABRIC_LOGGING_SPEC=INFO
- ORDERER_GENERAL_LISTENADDRESS=0.0.0.0
- 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_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/genesis.block:/var/hyperledger/orderer/orderer.genesis.block
- ./crypto-config/ordererOrganizations/example.com/orderers/orderer3.example.com/msp:/var/hyperledger/orderer/msp
- ./crypto-config/ordererOrganizations/example.com/orderers/orderer3.example.com/tls/:/var/hyperledger/orderer/tls
- orderer3.example.com:/var/hyperledger/production/orderer
ports:
- 7050:7050
extra_hosts:
- "orderer0.example.com:192.168.1.16"
- "orderer1.example.com:192.168.1.17"
- "orderer2.example.com:192.168.1.173"
- "orderer3.example.com:192.168.1.190"
- "orderer4.example.com:192.168.1.190"
2、执行vi docker-compose-orderer4.yaml,并将下面代码块中的内容填写到文件中(192.168.1.190)。
version: '2'
volumes:
orderer4.example.com:
services:
orderer4.example.com:
container_name: orderer4.example.com
image: hyperledger/fabric-orderer:latest
environment:
- GODEBUG=netdns=go
- FABRIC_LOGGING_SPEC=INFO
- ORDERER_GENERAL_LISTENADDRESS=0.0.0.0
- 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_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/genesis.block:/var/hyperledger/orderer/orderer.genesis.block
- ./crypto-config/ordererOrganizations/example.com/orderers/orderer4.example.com/msp:/var/hyperledger/orderer/msp
- ./crypto-config/ordererOrganizations/example.com/orderers/orderer4.example.com/tls/:/var/hyperledger/orderer/tls
- orderer4.example.com:/var/hyperledger/production/orderer
ports:
- 8050:7050
extra_hosts:
- "orderer0.example.com:192.168.1.16"
- "orderer1.example.com:192.168.1.17"
- "orderer2.example.com:192.168.1.173"
- "orderer3.example.com:192.168.1.190"
- "orderer4.example.com:192.168.1.190"
3、执行vi docker-compose-peer.yaml,并将下面代码块中的内容填写到文件中(192.168.1.190)。
version: '2'
volumes:
peer3.org1.example.com:
services:
peer3.org1.example.com:
container_name: peer3.org1.example.com
hostname: peer3.org1.example.com
image: hyperledger/fabric-peer:latest
environment:
- GODEBUG=netdns=go
- CORE_PEER_ID=peer3.org1.example.com
- CORE_PEER_ADDRESS=peer3.org1.example.com:7051
- CORE_PEER_CHAINCODELISTENADDRESS=peer3.org1.example.com:7052
- CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer3.org1.example.com:7051
- CORE_PEER_LOCALMSPID=Org1MSP
- CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
- FABRIC_LOGGING_SPEC=INFO
- CORE_PEER_GOSSIP_USELEADERELECTION=true
- CORE_PEER_GOSSIP_ORGLEADER=false
- CORE_PEER_PROFILE_ENABLED=true
- CORE_PEER_TLS_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
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/peer3.org1.example.com/msp:/etc/hyperledger/fabric/msp
- ./crypto-config/peerOrganizations/org1.example.com/peers/peer3.org1.example.com/tls:/etc/hyperledger/fabric/tls
- peer3.org1.example.com:/var/hyperledger/production
ports:
- 7051:7051
- 7052:7052
- 7053:7053
extra_hosts:
- "orderer0.example.com:192.168.1.16"
- "orderer1.example.com:192.168.1.17"
- "orderer2.example.com:192.168.1.173"
- "orderer3.example.com:192.168.1.190"
- "orderer4.example.com:192.168.1.190"
4、执行vi docker-compose-cli.yaml,并将下面代码块中的内容填写到文件中(192.168.1.190)。
version: '2'
services:
cli:
container_name: cli
image: hyperledger/fabric-tools:latest
tty: true
environment:
- GODEBUG=netdns=go
- GOPATH=/opt/gopath
- CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
- FABRIC_LOGGING_SPEC=INFO
- CORE_PEER_ID=cli
- CORE_PEER_ADDRESS=peer3.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/peer3.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/peer3.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/peer3.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:/opt/gopath/src/github.com/chaincode
- ./crypto-config:/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/
- ./channel-artifacts:/opt/gopath/src/github.com/hyperledger/fabric/peer/channel-artifacts
extra_hosts:
- "orderer0.example.com:192.168.1.16"
- "orderer1.example.com:192.168.1.17"
- "orderer2.example.com:192.168.1.173"
- "orderer3.example.com:192.168.1.190"
- "orderer4.example.com:192.168.1.190"
- "peer0.org1.example.com:192.168.1.16"
- "peer1.org1.example.com:192.168.1.17"
- "peer2.org1.example.com:192.168.1.173"
- "peer3.org1.example.com:192.168.1.190"
5、在项目目录下创建脚本,主要是来启动容器和关闭容器的(192.168.1.190)。
在项目目录下执行 vim up.sh,并将下面代码块中的内容粘贴到文件中,填写完成后执行 chmod +x up.sh 为文件添加执行权限(192.168.1.190)。
#!/bin/sh
docker-compose -f ./docker-compose-orderer.yaml up -d
docker-compose -f ./docker-compose-orderer4.yaml up -d
sleep 10
docker-compose -f ./docker-compose-peer.yaml up -d
docker-compose -f ./docker-compose-cli.yaml up -d
6、在项目目录下执行 vim down.sh,并将下面代码块中内容粘贴到文件中,填写完成后执行 chmod +x down.sh 为文件添加执行权限(192.168.1.190)。
sudo docker rm -f $(sudo docker ps -aq)
sudo docker network prune
sudo docker volume prune
docker rmi --force `docker images | grep dev-peer | awk '{print $3}'`
7、执行到这步,第四台主机也配置完毕
3、设置hosts与拷贝链码
1、设置hosts
由于各个主机在进行交互时,主机名的解析会影响交互速度,所以我们在/etc/hosts中将ip与主机名绑定起来,执行sudo vim /etc/hosts,并将下面代码块中的内容填写到文件中(192.168.1.16)、(192.168.1.17)、(192.168.1.173)、(192.168.1.190)
192.168.1.16 peer0.org1.example.com orderer0.example.com
192.168.1.17 peer1.org1.example.com orderer1.example.com
192.168.1.173 peer2.org1.example.com orderer2.example.com
192.168.1.190 peer3.org1.example.com orderer3.example.com orderer4.example.com
2、拷贝链码
到目前为止,整个网络还缺少一个链码,我们在第一台主机(192.168.1.16)的项目目录下执行mkdir chaincode创建链码目录,执行
cp $HOME/go/src/github.com/hyperledger/fabric-samples/chaincode/chaincode_example02/go/chaincode_example02.go ./chaincode
将示例的链码拷贝到链码目录中
3、分别进入四台主机的项目目录中,依次执行./up.sh
执行到这一步fabric的网络就已经启动完毕了,下面用cli工具代替客户端去和fabric网络进行交互。
4、通过客户端cli命令行和fabric网络进行交互
在第一台主机(192.168.1.16)上通过docker客户端对peer节点进行操作
1、执行以下命令进入到cli容器中
docker exec -it cli bash
2、执行以下命令创建应用通道
peer channel create -o orderer0.example.com:7050 -c testchannel -f ./channel-artifacts/channel.tx --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer0.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
3、执行以下命令将当前peer加入通道中
peer channel join -b testchannel.block
4、执行以下命令在当前peer上安装链码
peer chaincode install -n mycc -v 1.0 -l golang -p github.com/chaincode
5、执行以下命令将链码打包
peer chaincode package -p github.com/chaincode -n mycc -v 1.0 mycc.1.0.out
6、执行exit,退出当前cli容器
7、在宿主机中执行以下命令将生成的创世快文件从docker的cli容器中拷贝到宿主机
docker cp cli:/opt/gopath/src/github.com/hyperledger/fabric/peer/testchannel.block ./channel-artifacts
在宿主机中执行以下命令将生成的链码文件从docker的cli容器中拷贝到宿主机
docker cp cli:/opt/gopath/src/github.com/hyperledger/fabric/peer/mycc.1.0.out ./channel-artifacts
在第二台主机(192.168.1.17)上通过docker客户端对peer节点进行操作
1、将远程主机中的channel-artifacts文件拷贝到本地主机
scp -r gsy@192.168.1.16:$HOME/lpgsy/channel-artifacts ./
2、执行以下命令进入到cli容器中
docker exec -it cli bash
3、执行以下命令,将channel-artifacts中的创世块文件以及链码文件拷贝到docker容器内
mv ./channel-artifacts/testchannel.block /opt/gopath/src/github.com/hyperledger/fabric/peer
mv ./channel-artifacts/mycc.1.0.out /opt/gopath/src/github.com/hyperledger/fabric/peer
4、执行以下命令将当前peer加入到通道中
peer channel join -b testchannel.block
5、执行以下命令在当前peer上安装链码
peer chaincode install mycc.1.0.out
在第三台主机(192.168.1.173)上通过docker客户端对peer节点进行操作
1、将远程主机中的channel-artifacts文件拷贝到本地主机
scp -r gsy@192.168.1.16:$HOME/lpgsy/channel-artifacts ./
2、执行以下命令进入到cli容器中
docker exec -it cli bash
3、执行以下命令,将channel-artifacts中的创世块文件以及链码文件拷贝到docker容器内
mv ./channel-artifacts/testchannel.block /opt/gopath/src/github.com/hyperledger/fabric/peer
mv ./channel-artifacts/mycc.1.0.out /opt/gopath/src/github.com/hyperledger/fabric/peer
4、执行以下命令将当前peer加入到通道中
peer channel join -b testchannel.block
5、执行以下命令在当前peer上安装链码
peer chaincode install mycc.1.0.out
在第四台主机(192.168.1.190)上通过docker客户端对peer节点进行操作
1、将远程主机中的channel-artifacts文件拷贝到本地主机
scp -r gsy@192.168.1.16:$HOME/lpgsy/channel-artifacts ./
2、执行以下命令进入到cli容器中
docker exec -it cli bash
3、执行以下命令,将channel-artifacts中的创世块文件以及链码文件拷贝到docker容器内
mv ./channel-artifacts/testchannel.block /opt/gopath/src/github.com/hyperledger/fabric/peer
mv ./channel-artifacts/mycc.1.0.out /opt/gopath/src/github.com/hyperledger/fabric/peer
4、执行以下命令将当前peer加入到通道中
peer channel join -b testchannel.block
5、执行以下命令在当前peer上安装链码
peer chaincode install mycc.1.0.out
选择在第一台主机(192.168.1.16)(也可以选择其他主机)上通过docker客户端对peer节点进行操作
1、执行以下命令进入到cli容器中
docker exec -it cli bash
2、执行以下命令进行初始化链码(实例化链码)就可以在网络内同步,这时会有一个docker容器去运行指定的链码
peer chaincode instantiate -o orderer0.example.com:7050 --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer0.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C testchannel -n mycc -l golang -v 1.0 -c '{"Args":["init","a","100","b","200"]}' -P 'AND ('\''Org1MSP.peer'\'')'
执行以下命令查询a的数据,看是否初始化成功
peer chaincode query -C testchannel -n mycc -c '{"Args":["query","a"]}'
在第二台主机(192.168.1.17)上通过docker客户端对peer节点进行操作
1、执行以下命令进入到cli容器中
docker exec -it cli bash
2、执行以下命令查询b的数据,看是否初始化成功
peer chaincode query -C testchannel -n mycc -c '{"Args":["query","b"]}'
在第三台主机(192.168.1.173)上通过docker客户端对peer节点进行操作
1、执行以下命令进入到cli容器中
docker exec -it cli bash
2、执行以下命令将a的10块钱转账给b
peer chaincode invoke -o orderer0.example.com:7050 --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer0.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C testchannel -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 -c '{"Args":["invoke","a","b","10"]}'
在第四台主机(192.168.1.190)上通过docker客户端对peer节点进行操作
1、执行以下命令进入到cli容器中
docker exec -it cli bash
2、执行以下命令查询交互后的a的值
peer chaincode query -C testchannel -n mycc -c '{"Args":["query","a"]}'
至此,基于Raft共识的多机fabric1.4.1网络搭建就已完成

238

被折叠的 条评论
为什么被折叠?



