建立一個名爲fabric-deploy的目錄,用來存放部署過程使用到的文件。html
mkdir ~/fabric-deploy
這裏將用三臺機器部署一個fabric網絡,該網絡中有兩個組織:java
org1.example.com org2.example.com
一個order:node
orderer.example.com
org1.example.com有兩個peer:linux
peer0.org1.example.com peer1.org1.example.com
org2.example.com有一個peer:golang
peer0.org2.example.com
三臺機器的IP,以及部署的組件以下:docker
192.168.88.10 部署: orderer、peer0@org1 192.168.88.11 部署: peer1@org1 192.168.88.12 部署: peer0@org2
相應域名的IP分別爲:json
192.168.88.10 orderer.example.com 192.168.88.10 peer0.org1.example.com 192.168.88.11 peer1.org1.example.com 192.168.88.12 peer0.org2.example.com
將這四條記錄添加到每臺機器的/etc/hosts文件中。bootstrap
每臺機器上還須要安裝docker:bash
yum install -y docker systemctl start docker
另外fabric的peer會調用docker,須要在全部peer上安裝docker,並提早下載鏡像:網絡
docker pull hyperledger/fabric-javaenv:x86_64-1.1.0 docker pull hyperledger/fabric-ccenv:x86_64-1.1.0 docker pull hyperledger/fabric-baseos:x86_64-0.4.6
下載的鏡像須要與下面步驟中建立的core.yaml中的鏡像配對:
... chaincode: peerAddress: id: path: name: builder: $(DOCKER_NS)/fabric-ccenv:$(ARCH)-$(PROJECT_VERSION) golang: runtime: $(BASE_DOCKER_NS)/fabric-baseos:$(ARCH)-$(BASE_VERSION) car: runtime: $(BASE_DOCKER_NS)/fabric-baseos:$(ARCH)-$(BASE_VERSION) java: Dockerfile: | from $(DOCKER_NS)/fabric-javaenv:$(ARCH)-$(PROJECT_VERSION) ...
建立合約的時候會用到這些鏡像,鏡像下載可能比較慢,根據本身的狀況配置加速器。另外每一個peer上都須要下載。
我在」區塊鏈實踐分享」中提供的fabric-deploy中下載包中提供了這三個鏡像,能夠直接使用:
cd fabric-deploy/docker-images ./load.sh
編譯方法見:hyperledger fabric編譯
執行下面的命令能夠下載編譯好的fabric以及依賴的鏡像:
curl -sSL https://goo.gl/6wtTN5 | bash
或者直接到這裏下載: hyperledger fabric download
這裏使用的linux-amd64,fabric-1.1.0:
wget https://nexus.hyperledger.org/content/repositories/releases/org/hyperledger/fabric/hyperledger-fabric/linux-amd64-1.1.0/hyperledger-fabric-linux-amd64-1.1.0.tar.gz wget https://nexus.hyperledger.org/content/repositories/releases/org/hyperledger/fabric/hyperledger-fabric/linux-amd64-1.1.0/hyperledger-fabric-linux-amd64-1.1.0.tar.gz.md5
下載完成後校驗一下:
$ md5sum hyperledger-fabric-linux-amd64-1.1.0.tar.gz 6be979ccd903752aefba9da4fc9e1d44 hyperledger-fabric-linux-amd64-1.1.0.tar.gz $ cat hyperledger-fabric-linux-amd64-1.1.0.tar.gz.md5 6be979ccd903752aefba9da4fc9e1d44
解壓後獲得兩個bin和config兩個目錄:
tar -xvf hyperledger-fabric-linux-amd64-1.1.0.tar.gz
bin目錄中是fabric的組件,config是配置文件模版。
$ ls bin/ configtxgen configtxlator cryptogen get-byfn.sh get-docker-images.sh orderer peer $ ls config/ configtx.yaml core.yaml orderer.yaml
保留備用。
證書的準備方式有兩種,一種用cryptogen
命令生成,一種是經過fabric-ca服務
生成。
建立一個配置文件crypto-config.yaml
,這裏配置了兩個組織,org1的Count是2,表示兩個peer:
OrdererOrgs: - Name: Orderer Domain: example.com Specs: - Hostname: orderer PeerOrgs: - Name: Org1 Domain: org1.example.com Template: Count: 2 Users: Count: 1 - Name: Org2 Domain: org2.example.com Template: Count: 1 Users: Count: 1
而後執行crypto,生成證書:
./bin/cryptogen generate --config=crypto-config.yaml --output ./certs
certs目錄下生成了兩個目錄:
$ ls ./certs/ ordererOrganizations peerOrganizations
certs目錄的內容比較多,而且目錄很深,須要提早說明一下。搞清楚了這裏面文件的含義,就懂了一半。
以certs/ordererOrganizations/example.com/orderers/orderer.example.com/
目錄中內容爲例。
這裏目錄中的內容是用於orderer.example.com的,裏面有兩個子目錄tls
和msp
:
$ tree certs/ordererOrganizations/example.com/orderers/orderer.example.com/ certs/ordererOrganizations/example.com/orderers/orderer.example.com/ |-- msp | |-- admincerts | | -- Admin@example.com-cert.pem | |-- cacerts | | -- ca.example.com-cert.pem | |-- keystore | | -- 16da15d400d4ca4b53d369b6d6e50a084d4354998c3b4d7a0934635d3907f90f_sk | |-- signcerts | | -- orderer.example.com-cert.pem | -- tlscacerts | -- tlsca.example.com-cert.pem -- tls |-- ca.crt |-- server.crt -- server.key
tls目錄中的內容很好理解,它是order對外服務時使用的私鑰(server.key)和證書(server.crt),ca.crt是簽註這個證書的CA,須要提供給發起請求的一端。
msp中有五個目錄,對區塊鏈進行操做時須要使用這些文件。
msp/admincerts
中存放的是用戶證書,使用該證書的用戶對orderer.example.com具備管理權限。
msp/cacerts
是簽署msp/signcerts
中用戶證書的ca,能夠用來校驗用戶的證書:
$ cd ./certs/ordererOrganizations/example.com/orderers/orderer.example.com/msp/ $ openssl verify -CAfile ./cacerts/ca.example.com-cert.pem admincerts/Admin\@example.com-cert.pem admincerts/Admin@example.com-cert.pem: OK
msp/keystore
是orderer.example.com操做區塊,進行簽署時使用的的私鑰。
msp/signcerts
是orderer.example.com提供其它組件用來覈實它的簽署的公鑰。
msp/tlscacerts
文件與tls/ca.crt
相同。
這裏須要特別提到的是msp/admincerts
,在使用fabric時,你可能會發現有些操做須要admin權限,例如在某個peer上安裝合約。
那麼管理員是如何認定的?就是看當前用戶的證書是否是在msp/admincerts
目錄中。
這個目錄中的內容目前是(版本1.1.x)啓動時加載的,所以若是在裏面添加或刪除文件後,須要重啓使用到它的組件。
在ordererOrganizations/example.com/
還有其它幾個目錄:
ca msp orderers tlsca users
orderers中存放就簽名分析的每一個orderer組件的證書文件。
users中存放的用戶的證書文件,與orderer.example.com
中內容基本相同,不過tls目錄中文件名變成了client.X
:
$ tree ordererOrganizations/example.com/users ordererOrganizations/example.com/users -- Admin@example.com |-- msp | |-- admincerts | | -- Admin@example.com-cert.pem | |-- cacerts | | -- ca.example.com-cert.pem | |-- keystore | | -- 1ac3b40c9ddda7e7a0f724b18faa0ce6fdf3f9e9ff5eac59e1e3f9739499ac2d_sk | |-- signcerts | | -- Admin@example.com-cert.pem | -- tlscacerts | -- tlsca.example.com-cert.pem -- tls |-- ca.crt |-- client.crt -- client.key
certs/peerOrganizations
中的內容與certs/ordererOrganizations
中也基本相同,只不過它裏面存放的是peer要使用的證書文件。
certs目錄中的文件留着備用。
fabric-ca的部署和詳細用法見:hyperledger的fabricCA的使用
只用fabric-ca生成證書的過程相對繁瑣不少,須要爲每一個組件、每一個用戶生成,這裏不作示例。
建一個目錄存放orderer.example.com須要文件:
mkdir orderer.example.com
先將bin/orderer以及證書複製到orderer.example.com目錄中。
cp bin/orderer orderer.example.com/ cp -rf certs/ordererOrganizations/example.com/orderers/orderer.example.com/* orderer.example.com/
而後準備orderer的配置文件orderer.yaml
:
General: LedgerType: file ListenAddress: 0.0.0.0 ListenPort: 7050 TLS: Enabled: true PrivateKey: ./tls/server.key Certificate: ./tls/server.crt RootCAs: - ./tls/ca.crt # ClientAuthEnabled: false # ClientRootCAs: LogLevel: debug LogFormat: '%{color}%{time:2006-01-02 15:04:05.000 MST} [%{module}] %{shortfunc} -> %{level:.4s} %{id:03x}%{color:reset} %{message}' # GenesisMethod: provisional GenesisMethod: file GenesisProfile: SampleInsecureSolo GenesisFile: ./genesisblock LocalMSPDir: ./msp LocalMSPID: OrdererMSP Profile: Enabled: false Address: 0.0.0.0:6060 BCCSP: Default: SW SW: Hash: SHA2 Security: 256 FileKeyStore: KeyStore: FileLedger: Location: /opt/app/fabric/orderer/data Prefix: hyperledger-fabric-ordererledger RAMLedger: HistorySize: 1000 Kafka: Retry: ShortInterval: 5s ShortTotal: 10m LongInterval: 5m LongTotal: 12h NetworkTimeouts: DialTimeout: 10s ReadTimeout: 10s WriteTimeout: 10s Metadata: RetryBackoff: 250ms RetryMax: 3 Producer: RetryBackoff: 100ms RetryMax: 3 Consumer: RetryBackoff: 2s Verbose: false TLS: Enabled: false PrivateKey: #File: path/to/PrivateKey Certificate: #File: path/to/Certificate RootCAs: #File: path/to/RootCAs Version:
注意,orderer將被部署在目標機器的/opt/apt/fabric/orderer
目錄中,若是要部署在其它目錄中,須要修改配置文件中路徑。
這裏須要用到一個data目錄,存放orderer的數據:
mkdir orderer.example.com/data
建一個目錄存放peer0.org1.example.com須要文件:
mkdir peer0.org1.example.com
先將bin/peer以及證書複製到peer0.org1.example.com目錄中。
cp bin/peer peer0.org1.example.com/ cp -rf certs/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/* peer0.org1.example.com/
準備peer0.org1.example.com的配置文件core.yaml:
logging: peer: debug cauthdsl: warning gossip: warning ledger: info msp: warning policies: warning grpc: error format: '%{color}%{time:2006-01-02 15:04:05.000 MST} [%{module}] %{shortfunc} -> %{level:.4s} %{id:03x}%{color:reset} %{message}' peer: id: peer0.org1.example.com networkId: dev listenAddress: 0.0.0.0:7051 address: 0.0.0.0:7051 addressAutoDetect: false gomaxprocs: -1 gossip: bootstrap: 127.0.0.1:7051 bootstrap: peer0.org1.example.com:7051 useLeaderElection: true orgLeader: false endpoint: maxBlockCountToStore: 100 maxPropagationBurstLatency: 10ms maxPropagationBurstSize: 10 propagateIterations: 1 propagatePeerNum: 3 pullInterval: 4s pullPeerNum: 3 requestStateInfoInterval: 4s publishStateInfoInterval: 4s stateInfoRetentionInterval: publishCertPeriod: 10s skipBlockVerification: false dialTimeout: 3s connTimeout: 2s recvBuffSize: 20 sendBuffSize: 200 digestWaitTime: 1s requestWaitTime: 1s responseWaitTime: 2s aliveTimeInterval: 5s aliveExpirationTimeout: 25s reconnectInterval: 25s externalEndpoint: peer0.org1.example.com:7051 election: startupGracePeriod: 15s membershipSampleInterval: 1s leaderAliveThreshold: 10s leaderElectionDuration: 5s events: address: 0.0.0.0:7053 buffersize: 100 timeout: 10ms tls: enabled: true cert: file: ./tls/server.crt key: file: ./tls/server.key rootcert: file: ./tls/ca.crt serverhostoverride: fileSystemPath: /opt/app/fabric/peer/data BCCSP: Default: SW SW: Hash: SHA2 Security: 256 FileKeyStore: KeyStore: mspConfigPath: msp localMspId: Org1MSP profile: enabled: true listenAddress: 0.0.0.0:6060 vm: endpoint: unix:///var/run/docker.sock docker: tls: enabled: false ca: file: docker/ca.crt cert: file: docker/tls.crt key: file: docker/tls.key attachStdout: false hostConfig: NetworkMode: host Dns: # - 192.168.0.1 LogConfig: Type: json-file Config: max-size: "50m" max-file: "5" Memory: 2147483648 chaincode: peerAddress: id: path: name: builder: $(DOCKER_NS)/fabric-ccenv:$(ARCH)-$(PROJECT_VERSION) golang: runtime: $(BASE_DOCKER_NS)/fabric-baseos:$(ARCH)-$(BASE_VERSION) car: runtime: $(BASE_DOCKER_NS)/fabric-baseos:$(ARCH)-$(BASE_VERSION) java: Dockerfile: | from $(DOCKER_NS)/fabric-javaenv:$(ARCH)-$(PROJECT_VERSION) startuptimeout: 300s executetimeout: 30s mode: net keepalive: 0 system: cscc: enable lscc: enable escc: enable vscc: enable qscc: enable logging: level: info shim: warning format: '%{color}%{time:2006-01-02 15:04:05.000 MST} [%{module}] %{shortfunc} -> %{level:.4s} %{id:03x}%{color:reset} %{message}' ledger: blockchain: state: stateDatabase: goleveldb couchDBConfig: couchDBAddress: 127.0.0.1:5984 username: password: maxRetries: 3 maxRetriesOnStartup: 10 requestTimeout: 35s queryLimit: 10000 history: enableHistoryDatabase: true
注意,peer將被部署在目標機器的/opt/apt/fabric/peer
目錄中,若是要部署在其它目錄中,須要修改配置文件中路徑。
這裏須要用到一個data目錄,存放peer的數據:
mkdir peer0.org1.example.com/data
過程與peer0.org1.example.com相似,注意將配置文件中的名稱修改成peer1,而且不要拷錯證書。
這裏直接複製peer0.org1.exampl.com目錄,而後替換其中的文件。
cp -rf peer0.org1.example.com/ peer1.org1.example.com/ rm -rf peer1.org1.example.com/msp/ rm -rf peer1.org1.example.com/tls/ cp -rf certs/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/* peer1.org1.example.com/
最後修改peer1.org1.example.com/core.yml,將其中的peer0.org1.exampl.com
修改成peer1.org1.example.com
,這裏直接用sed命令替換:
sed -i "s/peer0.org1.example.com/peer1\.org1\.example.com/g" peer1.org1.example.com/core.yaml
過程與peer0.org1.example.com相似,注意將配置文件中的名稱修改成org2,而且不要拷錯證書。
這裏直接複製peer0.org1.exampl.com目錄,而後替換其中的文件。
cp -rf peer0.org1.example.com/ peer0.org2.example.com/ rm -rf peer0.org2.example.com/msp/ rm -rf peer0.org2.example.com/tls/ cp -rf certs/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/* peer0.org2.example.com/
最後修改peer0.org2.example.com/core.yml,將其中的peer0.org1.exampl.com
修改成peer0.org2.example.com
,這裏直接用sed命令替換:
sed -i "s/peer0.org1.example.com/peer0\.org2\.example.com/g" peer0.org2.example.com/core.yaml
將配置文件中Org1MSP替換成Org2MSP:
sed -i "s/Org1MSP/Org2MSP/g" peer0.org2.example.com/core.yaml
部署以前,先確保已經在每臺機器的/etc/hosts文件中添加下列的記錄:
192.168.88.10 orderer.example.com 192.168.88.10 peer0.org1.example.com 192.168.88.11 peer1.org1.example.com 192.168.88.12 peer0.org2.example.com
注意根據你本身的環境狀況修改。
在192.168.88.10上建立目錄:
mkdir -p /opt/app/fabric/{orderer,peer}
將orderer.example.com和peer0.org1.exmaple.com中的內容複製到192.168.88.10:
scp -r orderer.example.com/* root@192.168.88.10:/opt/app/fabric/orderer/ scp -r peer0.org1.example.com/* root@192.168.88.10:/opt/app/fabric/peer/
在192.168.88.11上建立目錄:
mkdir -p /opt/app/fabric/peer
將peer1.org1.exmaple.com中的內容複製到192.168.88.11:
scp -r peer1.org1.example.com/* root@192.168.88.11:/opt/app/fabric/peer/
在192.168.88.12上建立目錄:
mkdir -p /opt/app/fabric/peer
將peer0.org2.exmaple.com中的內容複製到192.168.88.12:
scp -r peer0.org2.example.com/* root@192.168.88.12:/opt/app/fabric/peer/
order、peer都部署到位,可是對我這裏示意的場景,須要的文件並不齊備。
查看orderer.yaml文件,你會看到有這樣幾行:
GenesisMethod: file GenesisFile: ./genesisblock GenesisProfile: SampleInsecureSolo
前兩行配置了創世塊的獲取方式。第一個區塊的獲取方式有多種,這裏採用最簡單的一種作法,用configtxgen生成。
沒有在前面的步驟中一次生成全部須要的文件是由於,若是你修改了配置、使用了其它的方式,可能不須要這裏的操做。
回到存放了全部文件的fabric-deploy目錄中,建立一個名爲configtx.yaml
的文件:
Profiles: TwoOrgsOrdererGenesis: Orderer: <<: *OrdererDefaults Organizations: - *OrdererOrg Consortiums: SampleConsortium: Organizations: - *Org1 - *Org2 TwoOrgsChannel: Consortium: SampleConsortium Application: <<: *ApplicationDefaults Organizations: - *Org1 - *Org2 Organizations: - &OrdererOrg Name: OrdererOrg ID: OrdererMSP MSPDir: ./certs/ordererOrganizations/example.com/msp - &Org1 Name: Org1MSP ID: Org1MSP MSPDir: ./certs/peerOrganizations/org1.example.com/msp AnchorPeers: - Host: peer0.org1.example.com Port: 7051 - &Org2 Name: Org2MSP ID: Org2MSP MSPDir: ./certs/peerOrganizations/org2.example.com/msp AnchorPeers: - Host: peer0.org2.example.com Port: 7051 Orderer: &OrdererDefaults OrdererType: solo Addresses: - orderer.example.com:7050 BatchTimeout: 2s BatchSize: MaxMessageCount: 10 AbsoluteMaxBytes: 99 MB PreferredMaxBytes: 512 KB Kafka: Brokers: - 127.0.0.1:9092 Organizations: Application: &ApplicationDefaults Organizations:
這個配置文件的內容比較多,這裏就不作解釋了,能夠到視頻解說中聽講解。
直接用./bin/configtxgen
生成創世塊文件。
./bin/configtxgen -profile TwoOrgsOrdererGenesis -outputBlock ./genesisblock
將./genesisblock文件複製到192.168.88.10的/opt/app/fabric/orderer/目錄中:
scp genesisblock root@192.168.88.10:/opt/app/fabric/orderer/
分別到每臺機器到orderer、peer目錄中啓動:
./orderer & ./peer node start &
爲了方便查看輸出的日誌,能夠寫一個腳本:
$ cat start.sh ./orderer 2>&1 |tee log
peer的腳本以下:
$ cat start.sh ./peer node start 2>&1 |tee log
而後將腳本放到後臺運行:
$ ./start.sh &
若是程序啓動失敗,那麼覈實以前的步驟。或者到右側的「區塊鏈實踐分享」知識星球中諮詢。
要使用得先有用戶。在前面用cryptogen
準備證書的時候,它默認建立了用戶。
還記得certs目錄下的幾個users
目錄嗎?那裏面就是用戶證書。
users目錄一共有三個,分別是聯盟的用戶,和每一個組織的用戶:
./certs/ordererOrganizations/example.com/users ./certs/peerOrganizations/org1.example.com/users ./certs/peerOrganizations/org2.example.com/users
其中每一個組織有兩個用戶,Admin和User1:
$ ls ./certs/peerOrganizations/org1.example.com/users Admin@org1.example.com User1@org1.example.com
Admin和User1惟一的區別是,Admin的用戶證書被添加到了對一個peer的msp/admincerts
目錄中。(還記得這個目錄的做用嗎?)
使用hyperledger fabric能夠經過SDK,也能夠使用peer命令。
這裏直接演示peer命令的用法。
在fabric-deploy中建立目錄Admin@org1.example.com
,在其中存放該用戶的全部資料。
mkdir Admin@org1.example.com
將用戶證書複製到其中:
cp -rf certs/peerOrganizations/org1.example.com/users/Admin\@org1.example.com/* Admin\@org1.example.com/
還須要將core.yaml複製到用戶目錄下:
cp peer0.org1.example.com/core.yaml Admin\@org1.example.com/
爲了方便使用,在Admin@org1.example.com中建立一個peer.sh腳本:
#!/bin/bash PATH=`pwd`/../bin:$PATH export FABRIC_CFG_PATH=`pwd` export CORE_PEER_TLS_ENABLED=true export CORE_PEER_TLS_CERT_FILE=./tls/client.crt export CORE_PEER_TLS_KEY_FILE=./tls/client.key export CORE_PEER_MSPCONFIGPATH=./msp export CORE_PEER_ADDRESS=peer0.org1.example.com:7051 export CORE_PEER_LOCALMSPID=Org1MSP export CORE_PEER_TLS_ROOTCERT_FILE=./tls/ca.crt export CORE_PEER_ID=cli export CORE_LOGGING_LEVEL=INFO peer $*
而後直接經過這個腳本訪問peer0.org1.example.com:
$ ./peer.sh node status status:STARTED 2018-04-29 14:32:03.517 CST [main] main -> INFO 001 Exiting.....
能夠看到peer0.org1.example.com:7051
的狀態是啓動的。
爲了後面的演示,下面使用複製替換的方式,準備另外兩個用戶的目錄。
User1與Admin1使用相同的peer,所以只須要替換用戶證書便可:
cp -rf Admin\@org1.example.com/ User1\@org1.example.com/ rm -rf User1\@org1.example.com/msp rm -rf User1\@org1.example.com/tls cp -rf certs/peerOrganizations/org1.example.com/users/User1\@org1.example.com/* User1\@org1.example.com/
執行peer.sh檢驗:
$ ./peer.sh node status status:STARTED 2018-04-29 14:37:48.251 CST [main] main -> INFO 001 Exiting.....
對於Admin@org2.example.com,core.yaml也須要替換:
cp -rf Admin\@org1.example.com/ Admin\@org2.example.com/ rm -rf Admin\@org2.example.com/msp/ rm -rf Admin\@org2.example.com/tls/ cp -rf certs/peerOrganizations/org2.example.com/users/Admin\@org2.example.com/* Admin\@org2.example.com/ cp peer0.org2.example.com/core.yaml Admin\@org2.example.com/
還須要將peer.sh
中peer地址修改成org2的peer地址:
export CORE_PEER_ADDRESS=peer0.org1.example.com:7051 export CORE_PEER_LOCALMSPID=Org1MSP 修改成: export CORE_PEER_ADDRESS=peer0.org2.example.com:7051 export CORE_PEER_LOCALMSPID=Org2MSP
驗證:
$ ./peer.sh node status status:STARTED 2018-04-29 14:44:22.395 CST [main] main -> INFO 001 Exiting.....
這裏用命令行演示channel的建立與peer的設置。(也能夠經過SDK,SDK將單獨討論)
須要再次回到fabric-deploy目錄中,用configtxgen生成channel文件:
./bin/configtxgen -profile TwoOrgsChannel -outputCreateChannelTx mychannel.tx -channelID mychannel
channel名字爲mychannel,生成的mychannel.tx備用。
還須要爲每一個組織的peer生成一個anchor文件,每一個組織只須要一個:
./bin/configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate Org1MSPanchors.tx -channelID mychannel -asOrg Org1MSP ./bin/configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate Org2MSPanchors.tx -channelID mychannel -asOrg Org2MSP
生成的Org1MSPanchors.tx和Org2MSPanchors.tx備用。
下一步操做中須要訪問orderer.example.com,須要將驗證orderer.example.com的證書複製到用戶目錄中:
cp certs/ordererOrganizations/example.com/tlsca/tlsca.example.com-cert.pem Admin\@org1.example.com/ cp certs/ordererOrganizations/example.com/tlsca/tlsca.example.com-cert.pem User1\@org1.example.com/ cp certs/ordererOrganizations/example.com/tlsca/tlsca.example.com-cert.pem Admin\@org2.example.com/
在Admin@org1.exampl.com目錄中執行下面的命令,:
./peer.sh channel create -o orderer.example.com:7050 -c mychannel -f ../mychannel.tx --tls true --cafile tlsca.example.com-cert.pem
執行完成後,會生成一個mychannel.block
文件:
$ ls core.yaml msp mychannel.block peer.sh tls tlsca.example.com-cert.pem
將mychannel.block複製一份到Admin\@org2.example.com/
中備用:
cp Admin\@org1.example.com/mychannel.block Admin\@org2.example.com/
分別在Admin\@org1.example.com/
和Admin\@org2.example.com/
執行下面的命令:
./peer.sh channel join -b mychannel.block
由於org1有兩個peer,所以須要將peer.sh中peer修改成peer1.org1.example.com
後,再添加一次:
./peer.sh channel join -b mychannel.block
能夠用channel list查看peer所在channel
$ ./peer.sh channel list 2018-04-29 16:37:47.016 CST [channelCmd] InitCmdFactory -> INFO 001 Endorser and orderer connections initialized Channels peers has joined: mychannel 2018-04-29 16:37:47.018 CST [main] main -> INFO 002 Exiting.....
最後須要每一個組織指定一個anchor peer,anchor peer是組織用來與外部通訊的peer:
cd Admin\@org1.example.com/ ./peer.sh channel update -o orderer.example.com:7050 -c mychannel -f ../Org1MSPanchors.tx --tls true --cafile ./tlsca.example.com-cert.pem cd Admin\@org2.example.com/ ./peer.sh channel update -o orderer.example.com:7050 -c mychannel -f ../Org2MSPanchors.tx --tls true --caf