1. Solo多機多節點部署
所有的節點分離部署, 每臺主機上有一個節點
名稱 | IP | Hostname | 組織機構 |
---|---|---|---|
orderer | 118.31.35.238 | orderer.itcast.com | Orderer |
peer0 | 121.40.33.98 | peer0.orggo.com | OrgGo |
peer1 | peer1.orggo.com | OrgGo | |
peer0 | 47.94.242.61 | peer0.orgcpp.com | OrgCpp |
peer1 | peer1.orgcpp.com | OrgCpp |
-
準備工作 - 創建工作目錄
1. n臺主機需要創建一個名字相同的工作目錄 # 121.40.33.98 mkdir ~/testwork # 118.31.35.238 mkdir ~/testwork # 47.94.242.61 mkdir ~/testwork
-
編寫配置文件 -> 生成證書的
根據代碼生成…
# crypto-config.yaml -> 名字可以改 OrdererOrgs: # --------------------------------------------------------------------------- # Orderer # --------------------------------------------------------------------------- - Name: Orderer Domain: test.com # --------------------------------------------------------------------------- # "Specs" - See PeerOrgs below for complete description # --------------------------------------------------------------------------- Specs: - Hostname: orderer PeerOrgs: # --------------------------------------------------------------------------- # OrgGo # --------------------------------------------------------------------------- - Name: OrgGo Domain: orgGo.test.com EnableNodeOUs: false Template: Count: 2 Users: Count: 1 # --------------------------------------------------------------------------- # OrgCpp # --------------------------------------------------------------------------- - Name: OrgCpp Domain: orgCpp.test.com EnableNodeOUs: false Template: Count: 2 Users: Count: 1
-
生成通道文件和創始塊文件
從測試文件裏拷貝過來…
# configtx.yaml -> 名字不能變 Organizations: # SampleOrg defines an MSP using the sampleconfig. It should never be used # in production but may be used as a template for other definitions - &OrdererOrg # DefaultOrg defines the organization which is used in the sampleconfig # of the fabric.git development environment Name: OrdererOrg # ID to load the MSP definition as ID: OrdererMSP # MSPDir is the filesystem path which contains the MSP configuration MSPDir: crypto-config/ordererOrganizations/test.com/msp - &OrgGo # DefaultOrg defines the organization which is used in the sampleconfig # of the fabric.git development environment Name: OrgGoMSP # ID to load the MSP definition as ID: OrgGoMSP MSPDir: crypto-config/peerOrganizations/orgGo.test.com/msp 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.orgGo.test.com Port: 7051 - &OrgCpp Name: OrgCppMSP ID: OrgCppMSP MSPDir: crypto-config/peerOrganizations/orgCpp.test.com/msp AnchorPeers: - Host: peer0.orgCpp.test.com Port: 7051 Capabilities: Global: &ChannelCapabilities V1_1: true Orderer: &OrdererCapabilities V1_1: true Application: &ApplicationCapabilities V1_2: true Application: &ApplicationDefaults Organizations: Orderer: &OrdererDefaults # Orderer Type: The orderer implementation to start # Available types are "solo" and "kafka" OrdererType: solo Addresses: - orderer.test.com:7050 # Batch Timeout: The amount of time to wait before creating a batch BatchTimeout: 2s # Batch Size: Controls the number of messages batched into a block BatchSize: # Max Message Count: The maximum number of messages to permit in a batch MaxMessageCount: 10 # Absolute Max Bytes: The absolute maximum number of bytes allowed for # the serialized messages in a batch. AbsoluteMaxBytes: 99 MB # Preferred Max Bytes: The preferred maximum number of bytes allowed for # the serialized messages in a batch. A message larger than the preferred # max bytes will result in a batch larger than preferred max bytes. PreferredMaxBytes: 512 KB Kafka: # Brokers: A list of Kafka brokers to which the orderer connects # NOTE: Use IP:port notation Brokers: - 127.0.0.1:9092 Organizations: Profiles: TwoOrgsOrdererGenesis: Capabilities: <<: *ChannelCapabilities Orderer: <<: *OrdererDefaults Organizations: - *OrdererOrg Capabilities: <<: *OrdererCapabilities Consortiums: SampleConsortium: Organizations: - *OrgGo - *OrgCpp TwoOrgsChannel: Consortium: SampleConsortium Application: <<: *ApplicationDefaults Organizations: - *OrgGo - *OrgCpp Capabilities: <<: *ApplicationCapabilities
生成的具體過程參考第四章即可。
1.1 部署 orderer 排序節點
-
編寫orderer節點啓動的docker-compose.yaml配置文件
version: '2' services: orderer.test.com: container_name: orderer.test.com image: hyperledger/fabric-orderer:latest environment: - CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=testwork_default - ORDERER_GENERAL_LOGLEVEL=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 # 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] 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/test.com/orderers/orderer.test.com/msp:/var/hyperledger/orderer/msp - ./crypto-config/ordererOrganizations/test.com/orderers/orderer.test.com/tls/:/var/hyperledger/orderer/tls networks: default: aliases: - testwork # 這個名字使用當前配置文件所在的目錄 的名字 ports: - 7050:7050
1.2 部署 peer0.orggo 節點
-
切換到peer0.orggo主機 - 121.40.33.98
-
進入到
~/testwork
-
拷貝文件
$ tree -L 1 . ├── channel-artifacts └── crypto-config
-
編寫
docker-compose.yaml
配置文件version: '2' services: peer0.orgGo.test.com: container_name: peer0.orgGo.test.com image: hyperledger/fabric-peer:latest environment: - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock - CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=testwork_default - CORE_LOGGING_LEVEL=INFO #- CORE_LOGGING_LEVEL=DEBUG - CORE_PEER_GOSSIP_USELEADERELECTION=true - CORE_PEER_GOSSIP_ORGLEADER=false - CORE_PEER_PROFILE_ENABLED=true - CORE_PEER_LOCALMSPID=OrgGoMSP - CORE_PEER_ID=peer0.orgGo.test.com - CORE_PEER_ADDRESS=peer0.orgGo.test.com:7051 - CORE_PEER_GOSSIP_BOOTSTRAP=peer0.orgGo.test.com:7051 - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer0.orgGo.test.com:7051 # TLS - 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 volumes: - /var/run/:/host/var/run/ - ./crypto-config/peerOrganizations/orgGo.test.com/peers/peer0.orgGo.test.com/msp:/etc/hyperledger/fabric/msp - ./crypto-config/peerOrganizations/orgGo.test.com/peers/peer0.orgGo.test.com/tls:/etc/hyperledger/fabric/tls working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer command: peer node start networks: default: aliases: - testwork ports: - 7051:7051 - 7053:7053 extra_hosts: # 聲明域名和IP的對應關係 - "orderer.test.com:118.31.35.238" cli: container_name: cli image: hyperledger/fabric-tools:latest tty: true stdin_open: true environment: - GOPATH=/opt/gopath - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock #- CORE_LOGGING_LEVEL=DEBUG - CORE_LOGGING_LEVEL=INFO - CORE_PEER_ID=cli - CORE_PEER_ADDRESS=peer0.orgGo.test.com:7051 - CORE_PEER_LOCALMSPID=OrgGoMSP - CORE_PEER_TLS_ENABLED=true - CORE_PEER_TLS_CERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/orgGo.test.com/peers/peer0.orgGo.test.com/tls/server.crt - CORE_PEER_TLS_KEY_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/orgGo.test.com/peers/peer0.orgGo.test.com/tls/server.key - CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/orgGo.test.com/peers/peer0.orgGo.test.com/tls/ca.crt - CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/orgGo.test.com/users/[email protected]/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/ - ./channel-artifacts:/opt/gopath/src/github.com/hyperledger/fabric/peer/channel-artifacts depends_on: # 啓動順序 - peer0.orgGo.test.com networks: default: aliases: - testwork extra_hosts: - "orderer.test.com:118.31.35.238" - "peer0.orgGo.test.com:121.40.33.98"
-
在
~/testwork
創建了一個子目錄chaincode
, 並將鏈碼文件放進去 -
啓動容器
$ docker-compose up -d
-
進入到客戶端容器中
docker exec -it cli bash-
創建通道
$ peer channel create -o orderer.test.com:7050 -c testchannel -f ./channel-artifacts/channel.tx --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/test.com/msp/tlscacerts/tlsca.test.com-cert.pem
-
將當前節點加入到通道中
$ peer channel join -b testchannel.block
-
安裝鏈碼(捨棄)peer chaincode install -n testcc -v 1.0 -l golang -p github.com/chaincode
如果在服務器A上安裝鏈碼,然後在服務器B上安裝同樣的鏈碼,哪怕鏈碼是一樣的,可能因爲權限或者其他一些差異,也會導致智能合約不一樣。所以在這裏,我們不是直接安裝鏈碼,而是使用下面的方法:
-
首先將鏈代碼打包:
peer chaincode package -n testcc -p github.com/chaincode -v 1.0 testcc.out
之後安裝:
peer chaincode install testcc.out
再然後,將testcc.out文件拷貝到宿主機
docker cp cli:/opt/gopath/src/github.com/hyperledger/fabric/peer/test.out ./
再將test.out文件複製到組織服務器B(orgCpp)上的channel-artifacts文件夾裏,當啓動服務器B的docker-compose時,再將該文件move到peer目錄下即可
- 初始化鏈碼(只初始化一次)
peer chaincode instantiate -o orderer.test.com:7050 --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/test.com/msp/tlscacerts/tlsca.test.com-cert.pem -C testchannel -n testcc -l golang -v 1.0 -c '{"Args":["init","a","100","b","200"]}' -P "AND ('OrgGoMSP.member', 'OrgCppMSP.member')"
- 測試查詢
peer chaincode query -C testchannel -n testcc -c '{"Args":["query","a"]}'
-
將生成的通道文件
testchannel.block
從cli容器拷貝到宿主機# 拷貝操作要在宿主機中進行 $ docker cp cli:/opt/gopath/src/github.com/hyperledger/fabric/peer/testchannel.block ./
1.3 部署 peer0.orgcpp 節點
-
切換到peer0.orgcpp主機 - 47.94.242.61
-
進入到
~/testwork
-
拷貝文件
$ tree -L 1 . ├── channel-artifacts └── crypto-config
-
通道塊文件 從宿主機 -> 當前的peer0.orgcpp上
# 爲了方便操作可以將文件放入到客戶端容器掛載的目錄中 $ mv testchannel.block channel-artifacts/
-
- 編寫
docker-compose.yaml
配置文件
version: '2'
services:
peer0.orgCpp.test.com:
container_name: peer0.orgCpp.test.com
image: hyperledger/fabric-peer:latest
environment:
- CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
- CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=testwork_default
# - CORE_LOGGING_LEVEL=INFO
- CORE_LOGGING_LEVEL=DEBUG
- CORE_PEER_GOSSIP_USELEADERELECTION=true
- CORE_PEER_GOSSIP_ORGLEADER=false
- CORE_PEER_PROFILE_ENABLED=true
- CORE_PEER_LOCALMSPID=OrgCppMSP
- CORE_PEER_ID=peer0.orgCpp.test.com
- CORE_PEER_ADDRESS=peer0.orgCpp.test.com:7051
- CORE_PEER_GOSSIP_BOOTSTRAP=peer0.orgCpp.test.com:7051
- CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer0.orgCpp.test.com:7051
# TLS
- 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
volumes:
- /var/run/:/host/var/run/
- ./crypto-config/peerOrganizations/orgCpp.test.com/peers/peer0.orgCpp.test.com/msp:/etc/hyperledger/fabric/msp
- ./crypto-config/peerOrganizations/orgCpp.test.com/peers/peer0.orgCpp.test.com/tls:/etc/hyperledger/fabric/tls
working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
command: peer node start
networks:
default:
aliases:
- testwork
ports:
- 7051:7051
- 7053:7053
extra_hosts:
- "orderer.test.com:118.31.35.238"
- "peer0.orgGo.test.com:121.40.33.98"
cli:
container_name: cli
image: hyperledger/fabric-tools:latest
tty: true
stdin_open: true
environment:
- GOPATH=/opt/gopath
- CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
#- CORE_LOGGING_LEVEL=DEBUG
- CORE_LOGGING_LEVEL=DEBUG
- CORE_PEER_ID=cli
- CORE_PEER_ADDRESS=peer0.orgCpp.test.com:7051
- CORE_PEER_LOCALMSPID=OrgCppMSP
- CORE_PEER_TLS_ENABLED=true
- CORE_PEER_TLS_CERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/orgCpp.test.com/peers/peer0.orgCpp.test.com/tls/server.crt
- CORE_PEER_TLS_KEY_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/orgCpp.test.com/peers/peer0.orgCpp.test.com/tls/server.key
- CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/orgCpp.test.com/peers/peer0.orgCpp.test.com/tls/ca.crt
- CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/orgCpp.test.com/users/[email protected]/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/
- ./channel-artifacts:/opt/gopath/src/github.com/hyperledger/fabric/peer/channel-artifacts
depends_on:
- peer0.orgCpp.test.com
networks:
default:
aliases:
- testwork
extra_hosts:
- "orderer.test.com:118.31.35.238"
- "peer0.orgGo.test.com:121.40.33.98"
- "peer0.orgCpp.test.com:47.94.242.61"
- 啓動當前節點
-
進入到操作該節點的客戶端中
- 加入到通道中
- 安裝鏈碼
peer chaincode install cctest.out
- 測試查詢
peer chaincode query -C testchannel -n testcc -c '{"Args":["query","a"]}'
- 調用方法修改數據
# 轉賬
$ peer chaincode invoke -o orderer.test.com:7050 -C testchannel -n testcc --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/test.com/orderers/orderer.test.com/msp/tlscacerts/tlsca.test.com-cert.pem --peerAddresses peer0.orgGo.test.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/orgGo.test.com/peers/peer0.orgGo.test.com/tls/ca.crt --peerAddresses peer0.orgcpp.test.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/orgCpp.test.com/peers/peer0.orgCpp.test.com/tls/ca.crt -c '{"Args":["invoke","a","b","10"]}'
# 查詢
$ peer chaincode query -C testchannel -n testcc -c '{"Args":["query","a"]}'
$ peer chaincode query -C testchannel -n testcc -c '{"Args":["query","b"]}'
1.4 部署其他節點
關於其餘節點的部署, 在此不再過多贅述, 部署方式請參考1.3內容, 步驟是完全一樣的
補充:鏈碼的打包
我們在進行多機多節點部署的時候, 所有的peer節點都需要安裝鏈碼, 有時候會出現鏈碼安裝失敗的問題, 提示鏈碼的指紋(哈希)不匹配,我們可以通過以下方法解決
-
通過客戶端在第1個peer節點中安裝好鏈碼之後, 將鏈碼打包
$ peer chaincode package -n testcc -p github.com/chaincode -v 1.0 mycc.1.0.out -n: 鏈碼的名字 -p: 鏈碼的路徑 -v: 鏈碼的版本號 -mycc.1.0.out: 打包之後生成的文件
-
將打包之後的鏈碼從容器中拷貝出來
$ docker cp cli:/xxxx/mycc.1.0.out ./
-
將得到的打包之後的鏈碼文件拷貝到其他的peer節點上
-
通過客戶端在其他peer節點上安裝鏈碼
$ peer chaincode install mycc.1.0.out