하이퍼레저v1.4 새 조직 추가

min71·2021년 9월 4일
0

하이퍼레저

목록 보기
8/12
post-thumbnail

Org3를 기존 네트워크에 추가하기

네트워크 구조

  • Orderer : orderer.example.com 1개 존재
  • Org1 : peer0, peer1, peer2 존재
  • Org2 : peer0, peer1, peer2 존재

네트워크 시작

cd fabric-samples/first-network
./byfn.sh up

블록 높이 확인, 현재 블록 높이는 1

Org3 artifacts 준비

Org3 인증파일 생성

cd first-network/org3-artifacts
../../bin/cryptogen generate --config=./org3-crypto.yaml
cp -r ../crypto-config/ordererOrganizations crypto-config/

Org3 채널블록 생성

export FABRIC_CFG_PATH=$PWD
../../bin/configtxgen -printOrg Org3MSP > ../channel-artifacts/org3.json

네트워크가 Org3를 포함하도록 설정

fabric-sample/bin 디렉터리 내 도구

  • proto_encode: JSON format을 protobuf format으로 인코딩
  • proto_decode: protobuf format을 JSON format으로 디코딩
  • compute_update: 두 protobuf format의 차이점을 계산하고 첫번째 protobuf에서 두번째 protobuf로 설정 업데이트를 생성

가장 최신의 설정 블록 가져옴

현재 블록 내용

  • block #0: Genesis block (mychannel.block)
  • block #1: Org1 앵커피어 업데이트
  • block #2: Org2 앵커피어 업데이트
  • block #3: 체인코드 인스턴스화 (a, 100, b, 200)
  • block #4: 체인코드 실행 (a, b, 10)
docker exec -it cli bash
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 config config_block.pb -o orderer.example.com:7050 -c $CHANNEL_NAME --tls --cafile $ORDERER_CA

Org3 설정 업데이트 준비

# protobuf -> json 디코딩
configtxlator proto_decode --input config_block.pb --type common.Block | jq .data.data[0].payload.data.config > config.json

# config.json 파일에 Org3MSP가 포함되도록 함
jq -s '.[0] * {"channel_group":{"groups":{"Application":{"groups": {"Org3MSP":.[1]}}}}}' config.json ./channel-artifacts/org3.json > modified_config.json

#config.json => config.pb로 인코딩
configtxlator proto_encode --input config.json --type common.Config --output config.pb

# modified_config.json => modified_config.pb로 인코딩
configtxlator proto_encode --input modified_config.json --type common.Config --output modified_config.pb

#config.pb 와 modified_config.pb의 차이점을 계산해 org3_update.pb 생성
configtxlator compute_update --channel_id $CHANNEL_NAME --original config.pb --updated modified_config.pb --output org3_update.pb

# org3_update.pb => org3_update.json로 디코딩
configtxlator proto_decode --input org3_update.pb --type common.ConfigUpdate | jq . > org3_update.json

# org3_update.json 봉투로 감싸서 org3_update_in_envelope.json 생성
echo '{"payload":{"header":{"channel_header":{"channel_id":"mychannel", "type":2}},"data":{"config_update":'$(cat org3_update.json)'}}}' | jq . > org3_update_in_envelope.json

# org3_update_in_envelope.json => org3_update_in_envelope.pb로 인코딩
configtxlator proto_encode --input org3_update_in_envelope.json --type common.Envelope --output org3_update_in_envelope.pb

네트워크에 Org3 포함

트랜잭션(org3_update_in_envelope.pb)을 오더러에게 보냄

채널의 승인 정책이 기본적으로 majority(다수결)이기 때문에 Org1과 Org2의 두 서명이 모두 필요함

# peer0.org2 전용 터미널 실행, 호스트에서 실행
docker exec -e CORE_PEER_LOCALMSPID="Org2MSP" -e 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 -e CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp -e CORE_PEER_ADDRESS=peer0.org2.example.com:7051 -it cli bash

# peer0.org2 전용 터미널, 컨테이너에서 실행
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

peer0.org1에서 트랜잭션에 서명

# peer0.org1.example.com 컨테이너
peer channel signconfigtx -f org3_update_in_envelope.pb

peer0.org2에서 트랜잭션에 서명 후 오더러에게 전송

# peer0.org2.example.com 컨테이너
peer channel update -f org3_update_in_envelope.pb -c $CHANNEL_NAME -o orderer.example.com:7050 --tls --cafile $ORDERER_CA

peer0.org2에서 트랜잭션을 오더러에게 전송 후 오더러는 새 블록을 네트워크에 전파

# 새 블록 체크
peer channel getinfo -c mychannel

Org3 실행 & mychannel 채널에 가입

Org3 컨테이너 실행

cd fabric-samples/first-network
docker-compose -f docker-compose-org3.yaml up -d

Org3를 mychannel 채널에 가입

# org3 전용 터미널 실행, 호스트에서 실행
docker exec -it Org3cli bash

# 컨테이너에서 실행
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

Org3의 피어가 mychannel 채널에 가입하기 위해서는 제네시스 블록(0번 블록)이 필요함

# 제네시스 블록 가져오기, peer0.org1.example.com 전용 터미널
peer channel fetch 0 mychannel.block -o orderer.example.com:7050 -c $CHANNEL_NAME --tls --cafile $ORDERER_CA

# 제네시스 블록 Org3 전용 터미널로 복사, 호스트에서 실행

docker cp cli:/opt/gopath/src/github.com/hyperledger/fabric/peer/mychannel.block .

docker cp mychannel.block Org3cli:/opt/gopath/src/github.com/hyperledger/fabric/peer/

# Org3cli 컨테이서
# peer0.org3.example.com 피어 mychannel에 가입
peer channel join -b mychannel.block

# peer1.org3.example.com 피어 mychannel에 가입
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 CORE_PEER_ADDRESS=peer1.org3.example.com:12051 peer channel join -b mychannel.block

# 블록 확인
peer channel getinfo -c mychannel

Org3에서 체인코드 실행

org3이 추가되었기 때문에 체인코드의 승인정책이 업데이트 되어야 한다.

모든 조직의 피어에 mycc 체인코드 2.0 버전 설치

# cli for peer0.org1.example.com
# peer chaincode install -n mycc -v 2.0 -p github.com/chaincode/chaincode_example02/go/

# cli for peer0.org2.example.com
# peer chaincode install -n mycc -v 2.0 -p github.com/chaincode/chaincode_example02/go/

# Org3cli
# peer chaincode install -n mycc -v 2.0 -p github.com/chaincode/chaincode_example02/go/
  • peer0.org1.example.com

  • peer0.org2.example.com

  • peer0.org3.example.com

mycc 체인코드 업그레이드

체인코드 초기화(instantiation) 처럼, 업그레이드도 체인코드 내부의 Init()을 실행

# cli for peer0.org1.example.com
peer chaincode upgrade -o orderer.example.com:7050 —-tls $CORE_PEER_TLS_ENABLED —-cafile $ORDERER_CA -C $CHANNEL_NAME -n mycc -v 2.0 -c '{"Args":["init","a","90","b","210"]}' -P "OR ('Org1MSP.peer','Org2MSP.peer','Org3MSP.peer')"

# 질의, Org3cli 컨테이너
peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}'

네트워크 종료

./byfn.sh down

Hits

profile
한 줄 소개

0개의 댓글

관련 채용 정보