[以下是基于官方教程fabric-sample1.1搭建的,原来是2 Org + 1 Orderer,现在研究新增一个组织Org3并加入到原来的通道中,请先clone fabric-sample1.1 git clone https://github.com/hyperledger/fabric-samples.git]
[以下所有需要vim的文件在fabric-sample1.1中都有]
./byfn -m generate
./byfn -m up
进入fabric-sample/first-network/下面将fabric网络启动,以下操作都是在first-network下面进行的mkdir org3-artifacts (此文件夹以及下面的文件在fabric-sample1.1版本中都有,不需要新建)
cd org3-artifacts (进入org3-artifacts目录下,以下几个操作都是在org3-artifacts目录下操作的)
vim org3-crypto.yaml (参考附录)
vim configtx.yaml (参考附录)../../bin/cryptogen generate –config=./org3-crypto.yaml (生成org3秘钥)
export FABRIC_CFG_PATH=$PWD (设置配置路径)
../../bin/configtxgen -printOrg Org3MSP > ../channel-artifacts/org3.json (生成org3的配置文件并放入上一层channel-artifact中,org3.json中包含)cd .. (进入first-network目录,注意和上面2.2对应)
cp -r crypto-config/ordererOrganizations org3-artifacts/crypto-config/
(将orderer相关的证书拷贝到org3的目录中,让新的组织可以连接到orderer)docker exec -it cli bash (新加的组织需要原来channel中成员的同意,进行org1,org2对org3交易进行签名等处理,以下操作加上#都是带边在容器内操作)
apt-get update
apt-get -y install jq (安装jq,一个对json进行过滤,格式化,修改的工具)
!如果cli容器由于网络问题不能很好的更新安装,可以手动安装
!在宿主机中进行 wget https://github.com/stedolan/jq/releases/download/jq-1.5/jq-1.5.tar.gz
!tar -zxvf jq-1.5.tar.gz
!docker cp jq-1.5 cli:/opt/gopath/src/github.com/hyperledger/fabric/peer/
!在cli容器中进行 cd jq-1.5/ && ./configure && make && sudo make install配置环境变量
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 && export CHANNEL_NAME=mychannel
echo ORDERER_CA && echo ORDERER_CA && echo CHANNEL_NAME
检查环境变量是否配置成功
peer channel fetch config config_block.pb -o orderer.example.com:7050 -c CHANNELNAME−−tls−−cafile C H A N N E L N A M E − − t l s − − c a f i l e ORDERER_CA
解码原来网络的配置文件config_block.pb
configtxlator proto_decode –input config_block.pb –type common.Block | jq .data.data[0].payload.data.config > config.json
将原来的网络配置文件转化成json,使用到了configtxlator proto_decode和jq工具
jq -s ‘.[0] * {“channel_group”:{“groups”:{“Application”:{“groups”: {“Org3MSP”:.[1]}}}}}’ config.json ./channel-artifacts/org3.json > modified_config.json
在原来的配置文件中增加org3的配置信息,生成 modified_config.json
configtxlator proto_encode –input config.json –type common.Config –output config.pb
将config.json转换成protobufs(下面计算会需要)
configtxlator proto_encode –input modified_config.json –type common.Config –output modified_config.pb
将modified_config.json 转换为 protobufs(下一步计算会需要)
configtxlator compute_update –channel_id $CHANNEL_NAME –original config.pb –updated modified_config.pb –output org3_update.pb
根据config.pb和modified_config.pb计算出升级的org3_update.pb
configtxlator proto_decode –input org3_update.pb –type common.ConfigUpdate | jq . > org3_update.json
解码org3_update.pb到json文件
echo ‘{“payload”:{“header”:{“channel_header”:{“channel_id”:”mychannel”, “type”:2}},”data”:{“config_update”:’$(cat org3_update.json)’}}}’ | jq . > org3_update_in_envelope.json
生成配置升级的json
configtxlator proto_encode –input org3_update_in_envelope.json –type common.Envelope –output org3_update_in_envelope.pb
将生成的配置升级文件org3_update_in_envelope.json转化成protobufs
为org3签名(在cli操作)
切换到 peer0.org1,为org3签名
export CORE_PEER_LOCALMSPID=”Org1MSP”
export 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
export CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
export CORE_PEER_ADDRESS=peer0.org1.example.com:7051
peer channel signconfigtx -f org3_update_in_envelope.pb 为org3签名切换到peer0.org2,2位org3签名
export CORE_PEER_LOCALMSPID=”Org2MSP”
export 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
export CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp
export CORE_PEER_ADDRESS=peer0.org2.example.com:7051peer channel signconfigtx -f org3_update_in_envelope.pb
配置交易到orderer
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.pempeer channel update -f org3_update_in_envelope.pb -c mychannel -o orderer.example.com:7050 –tls –cafile $ORDERER_CA
新打来一个terminal,,在first-network下面操作
vim docker-compose-org3.yaml (编写编写org3的节点文件,参考附录)
docker-compose -f docker-compose-org3.yaml up -d (启动org3网络)进入Org3cli容器,进行相关操作(注意这里的操作在Org3cli下,和上面cli下操作的区别)
docker exec -it Org3cli bash 登录Org3cli容器,进行通道等相关操作,下面带#的标识在容器里面进行的操作
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
export CHANNEL_NAME=mychannel (配置环境变量)peer channel fetch 0 mychannel.block -o orderer.example.com:7050 -c CHANNELNAME−−tls−−cafile C H A N N E L N A M E − − t l s − − c a f i l e ORDERER_CA (从orderer获取当前通道的配置信息,注意此处的的0表示从区块number为0的开始,如果不填表示从当前更改配置信息的区块开始,这样行不通,必须从0开始)
peer0.org3加入通道
export CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org3.example.com/peers/peer0.org3.example.com/tls/ca.crt
export CORE_PEER_ADDRESS=peer0.org3.example.com:7051 (配置peer0.org3环境变量)peer channel join -b mychannel.block (peer0.org3加入通道)
peer1.org3加入通道
export CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org3.example.com/peers/peer1.org3.example.com/tls/ca.crt
export CORE_PEER_ADDRESS=peer1.org3.example.com:7051 (配置peer1.org3的环境变量)peer channel join -b mychannel.block (peer1.org3加入通道)
升级链码和背书策略等
peer chaincode install -n mycc -v 2.0 -p github.com/chaincode/chaincode_example02/go/ (Org3Cli里面安装chaincode)
org1里升级chaincode(注意在cli容器中操作)
export CORE_PEER_LOCALMSPID=”Org1MSP” export 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 export CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp export CORE_PEER_ADDRESS=peer0.org1.example.com:7051peer chaincode install -n mycc -v 2.0 -p github.com/chaincode/chaincode_example02/go/
org2 里升级chaincode(注意在cli容器中操作)
export CORE_PEER_LOCALMSPID=”Org2MSP” export 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 export CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp export CORE_PEER_ADDRESS=peer0.org2.example.com:7051peer chaincode install -n mycc -v 2.0 -pgithub.com/chaincode/chaincode_example02/go/
升级背书策略(任何一个安装了该链码的机器上都行)
peer chaincode upgrade -o orderer.example.com:7050 –tls COREPEERTLSENABLED−−cafile C O R E P E E R T L S E N A B L E D − − c a f i l e ORDERER_CA -C $CHANNEL_NAME -n mycc -v 2.0 -c ‘{“Args”:[“init”,”c”,”900”,”d”,”100”]}’ -P “OR (‘Org1MSP.peer’,’Org2MSP.peer’,’Org3MSP.peer’)”测试
peer chaincode query -C $CHANNEL_NAME -n mycc -c ‘{“Args”:[“query”,”c”]}’