원서 : https://hyperledger-fabric.readthedocs.io/en/release-1.4/channel_update_tutorial.html
- Adding an Org to a Channel
- 이번에는 BYFN을 확장하는 의미로써, 'hyperledger fabric' 에서 channel 에 새로운 organization을 추가하는 법을 알아보려고 합니다.
- 우선 새로운 organization 추가 하는것에만 초점을 맞추지만, 'channel 구성' 업데이트(poilcies,batch 등) 하는것도 비슷하게 할 수 있다는점을 잘 알고 있으시면 될 것 같습니다.
- 이러하게 'channel 관리 및 설정'을 하는 작업은, 해당 organization의 admin 담당자의 영역 인점도 유의하세요.
- Setup the Environment
- 이번에도 https://github.com/hyperledger/fabric-samples 의 /first-network 를 기반으로 진행됩니다.
- 이번에도 '스크립트 자동 실습' 과 '직접 수동 실습' 을 모두 설명해 드립니다.
- Bring Org3 into the Channel with the Script
- "./eyfn.sh up" 을 쳐보면, 다 알아서 되고~ 최종적으로 Org3에서 ledger에 쿼리를 할수있습니다...
- Bring Org3 into the Channel Manually
- 일단 byfn.sh 와 eyfn.sh 으로, 기존 docker를 정리하고~ 새롭게 다시 띄운뒤... /org3-artifacts 경로에서 한다.
- 1) Generate the Org3 Crypto Material
- cryptogen generate --config=./org3-crypto.yaml
- export FABRIC_CFG_PATH=$PWD
- configtxgen -printOrg Org3MSP > ../channel-artifacts/org3.json
- (org3를 위한, cryptogen 및 configtxgen 수행함. -printOrg 은 Definition of an organization as JSON 임.)
- cd .. && cp -r crypto-config/ordererOrganizations org3-artifacts/crypto-config/
- (orderer_node와 TLS통신 같은것도 원활히 진행 할 수 있도록, 해당 'orderer MSP' 일단 가져옴.)
- 2) Prepare the CLI Environment
- 이런 '구성 업데이트 작업'에는 'configtxlator 바이너리' 라는 툴을 사용합니다. (stateless REST API 제공)
- (블록체인 네트워크 구성 수정기능.)
- (서로다른 데이터 포맷간 전환기능. 예 : protobuf형식<->JSON형식)
- (두 channel간 차이점으로, '구성 업데이트' 트랜잭션 생성기능)
- docker exec -it cli bash (우선 CLI 도커로 들어가서, 작업준비 및 부트스트랩)
- export ORDERER_CA=/opt/.../ordererOrganizations/.../orderers/.../msp/tlscacerts/tlsca.example.com-cert.pem (orderer_node의 'local MSP'의 TSL통신 인증서)
- export CHANNEL_NAME=mychannel
- 이런 '구성 업데이트 작업'에는 'configtxlator 바이너리' 라는 툴을 사용합니다. (stateless REST API 제공)
- 3) Fetch the Configuration
- 우선 CLI 도커으로 들어가서, 작업환경이 되었으니... 업데이트 할 channel의 '가장최신 config block' 을 가져 오는것으로 시작을 해봅시다.
- '가장최신 config block'을 가져오는 이유는, 'channel 구성(config)'는 버져닝(versioning) 되기 때문입니다.
- 버져닝(versioning)은 유용한데, 'channel 구성(config)' 변경의 재반복을 방지하고~ 명시적 명확해 집니다.
- 'channel config block' 을 아래와 같은 커맨드로 가져올수있습니다.
- peer channel fetch config channel.pb -o {orderer주소} -c {channel이름} --tls --cafile {인증서}
- ('config_block.pb' 처럼 파일명과 확장자는 마음데로 정하면 됩니다...)
- (.pb는 protobuf .json은 JSON)
- (fetch 옵션에는 oldest, newest, config, {number} 가 있음)
- (음... config하면, Received:0 과 Receive:n 둘다 찍히던데?!?!?!)
- 커맨드시, "Received block:?" 라는 로그를 볼수있는데~ 이것이 바로 해당 `블록번호` 입니다.
- 앞서의 BYFN의 상황에선, 아래와 같은 상황의 block으로 됩니다.
- block 0: genesis block (아마도 genesis.block을 channel.tx로 channel create한, channel.block 일듯...)
- block 1: Org1 anchor peer update
- block 2: Org2 anchor peer update
- 4) Convert the Configuration to JSON and Trim It Down
- 이제 'configtxlator 바이너리' 으로 'channel config block' 을 좀더 다루기 편하도록, JSON화 해봅시다.
- (무의미한 headers, metadata, creator-signatures 등등은 제거 됩니다.)
- configtxlator proto_decode --input channel.pb --type common.Block | jq .data.data[0].payload.data.config > channel.json
- ('jq' 라는 툴을 | (파이프) 으로 연동해서 사용함)
- 결과적으로, '구성 업데이트 작업'에 사용할 '(JSON형식)channel config block' 를 획득하였습니다.
- (꼭 시간을 내어서, 해당 파일을 직접 열어보시고! 내부구조가 어떤지? 공부해 보세요!!! 도움많이됩니다.)
- 5) Add the Org3 Crypto Material
- 지금까지는, channel의 여러 '구성 업데이트' 에서 공통적으로 하는 작업입니다.
- 그럼, 추가할 '새로운 Org3 구성(config)'를 만들어 봅시다.
- jq -s '.[0] * {"channel_group":{"groups":{"Application":{"groups": {"Org3MSP":.[1]}}}}}' channel.json ./channel-artifacts/org3.json > new_channel.json
- ('jq' 툴으로 org3를 포함시킨, '새로운 channel 구성' 생성)
- 결과적으로, channel.json 과 new_channel.json 을 확득하였습니다.
- 이 다음으론, 아래와 같이 이 두 .json을 재인코딩 하고~ 델타를 계산해야 합니다.
- c~lator proto_encode --input channel.json --type common.Config --output channel.pb
- c~lator proto_encode --input new_channel.json --type common.Config --output new_channel.pb
- c~lator compute_update --channel_id {channel이름} --original channel.pb --updated new_channel.pb --output update_org3.pb
- 결과적으로, 'Org3 구성'을 추가하는 'channel config block' 을 획득하였습니다.
- (기존블록에는 Org1,Org2 관련정보는 이미 있음. 그래서...)
- (기존블록에서 Org3만 추가된 델타를 블록화 시키는것!!!)
- 그럼 이제... 마무리 작업을 하면 됩니다. 우선, 편집을 할수있도록 준비합니다.
- configtxlator proto_decode --input update_org3.pb --type common.ConfigUpdate | jq . > update_org3.json
- 아까전에 제거 했던, (headers, metadata, creator-signatures 등등)을 다시 붙입니다.
- echo '{"payload":{"header":{"channel_header":{"channel_id":"channel이름", "type":2}},"data":{"config_update":'$(cat update_org3.json)'}}}' | jq . > envelope_update_org3.json
- 마지막 편집까지 끝이나고, 최종 'channel config block' 을 완성합니다.
- configtxlator proto_encode --input envelope_update_org3.json --type common.Envelope --output envelope_update_org3.pb
- 6) Sign and Submit the Config Update
- 어어어
7) Configuring Leader Election
그럼 이미 'channel 구성'이 정해진 상황에서, 새로운 organization 추가 때, "리더선출"은 관련해서? 한번 알아봅시다.
genesis.block(channel.block) 으로 부트스트랩한 신규 peer_node는, 새로운 organization 정보를 당연히 모릅니다.
그래서 해당 peer_node는 (organization관련)'config-transaction'을 받을때 까지는, 그들의 organization간 블록 검증하지 않음으로~ '가십-프로토콜'을 사용 못하게 되는 현상이 나올것 입니다.
따라서 신규 peer_node는 orderer으로부터 블록을 받을수 있도록, 아래와 같은 '구성설정'을 꼭 해야 합니다.
1. "정적 리더 모드" 옵션 : "organization leader"으로 구성설정
CORE_PEER_GOSSIP_USELEADERELECTION=false CORE_PEER_GOSSIP_ORGLEADER=true
(모든 peer_node에서 동일하게 해줘야 함)
2. "동적 리더 선출" 옵션 : "leader election"으로 구성설정
CORE_PEER_GOSSIP_USELEADERELECTION=true CORE_PEER_GOSSIP_ORGLEADER=false
(새로 추가된 organization의 peer_node는 membership을 볼 수 없음으로, 해당 peer_node는 정적으로... 자신을 리더선언 합니다. )
(하지만 (organization관련)'config-transaction'을 받으면, 해당 organization은 하나의 leader으로 활성화 될것입니다.)
(따라서 해당 organization의 peer_node가 최종적으로는 "리더선출"을 하기 원할 때, 사용합니다. )
이 설명은... 그럼 결국에는 leader 노드만~ orderer으로부터 정보를 받고, 나머지 애들은 가십으로만 동기화 한다는 말인가??????
-끝-
'hyperledger > fabDoc.Tutorials' 카테고리의 다른 글
5) Using Private Data in Fabric (0) | 2019.06.30 |
---|---|
4) Upgrading Your Network Components (0) | 2019.06.30 |
2) Building Your First Network (0) | 2019.06.22 |
1) Writing Your First Application (0) | 2019.06.22 |
0) Tutorials (0) | 2019.06.22 |