0. 사전 환경설정 및 필수지식
- Hyperledger Docs를 읽으며 과도한 삽질에 대한 경험이 필요(처음 보면 뭐가 뭔지 모를 수 있음...내가 그랬기 때문에)
- Fabric-Samples 설치 후 Requiresments에 대한 툴 및 라이브러리는 설치되어있어야함(Go, Node 등)
- Cryptogen을 통한 Key생성
- Docker-compose.yaml 파일 생성
- configtx.yaml에 새로운 Org추가
디렉토리 구성
anchor, anchor_soft, anchor_v2 : 앵커피어 관련 설정 디렉토리
basic.tar.gz : 기본 Sample로 제공하는 체인코드 압축파일
bin : Hyperledger Fabric 에서 제공하는 라이브러리 디렉토리 (configtxgen, crytptogen, configxlator, orderer, peer ....)
chaincode-go : Sample로 제공하는 체인코드 디렉토리
channel-artificate : 채널의 블록에 대한 기록 저장
configtx : 제네시스 블록생성을 위한 yaml파일 저장 디렉토리
docker : docker-compose.yaml파일을 저장하는 디렉토리 yaml파일에 기록된 Org들을 통해 도커 컨테이너를 실행
organization : Org가 기록되어 있는디렉토리, MSP, Key등을 기록함
system-genesis-block: 최초 블록을 기록하는 디렉토리
1. Cryptogen을 통한 Key생성
crypto-config 파일 생성
경로 : fabric-samples/my-network/organizations/cryptogen
#빈 yaml파일 생성
touch crypto-config-LG.yaml
# crypto-config-LG.yaml
PeerOrgs:
- Name: LG
Domain: LG.example.com
EnableNodeOUs: true
Template:
Count: 1
SANS:
- localhost
Users:
Count: 1
KEY 생성
경로 : fabric-samples/my-network/
cryptogen generate \
--config=./organizations/cryptogen/crypto-config-LG.yaml \
--output="organizations"
LG의 Key, MSP등이 저장된 디렉토리를 확인 할 수 있음.
2. configtx.yaml에 새로운 Org추가
# configtx.yaml에 새로운 Org ID, 정책 추가
- &LG
Name: LGMSP
ID: LGMSP
MSPDir: ../organizations/peerOrganizations/LG.example.com/msp
Policies:
Readers:
Type: Signature
Rule: "OR('LGMSP.admin', 'LGMSP.peer', 'LGMSP.client')"
Writers:
Type: Signature
Rule: "OR('LGMSP.admin', 'LGMSP.client')"
Admins:
Type: Signature
Rule: "OR('LGMSP.admin')"
Endorsement:
Type: Signature
Rule: "OR('LGMSP.peer')"
AnchorPeers:
- Host: peer0.LG.example.com
Port: 13051
# 맨아래 프로파일도 조직에 추가
Profiles:
TwoOrgsOrdererGenesis:
<<: *ChannelDefaults
Orderer:
<<: *OrdererDefaults
Organizations:
- *OrdererOrg
Capabilities:
<<: *OrdererCapabilities
Consortiums:
SampleConsortium:
Organizations:
- *Org1
- *Org2
- *cau
- *soft
- *LG
TwoOrgsChannel:
Consortium: SampleConsortium
<<: *ChannelDefaults
Application:
<<: *ApplicationDefaults
Organizations:
- *Org1
- *Org2
- *cau
- *soft
- *LG
Capabilities:
<<: *ApplicationCapabilities
2.1 Configtxgen -printorg
bin에 있는 configtxgen 도구를 활용해 새로운 조직의 정의를 print
해당 파일에는 조직의 CA root 인증서, TLS ㅜㄹ트 인증서의 내용을 담고있음
# bin/ 디렉토리에서 환경변수 설정
export FABRIC_CFG_PATH=$PWD
# configtx 디렉토리에서 Print
configtxgen -printOrg LGMSP > ../organizations/peerOrganizations/LG.example.com/LG.json
3. Docker-compose.yaml파일 생성
Docker Compose는 여러개의 컨테이너를 정의하고 실행하기 위한 도구.
Docker Yaml 파일생성
경로 : fabric-samples/my-network/docker/
version: '2'
volumes:
peer0.LG.example.com:
networks:
test:
# name: fabric_test
services:
peer0.LG.example.com:
container_name: peer0.LG.example.com
image: hyperledger/fabric-peer:2.2
environment:
#Generic peer variables
- CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
- CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=net_test
- FABRIC_LOGGING_SPEC=INFO
- CORE_PEER_TLS_ENABLED=true
- CORE_PEER_PROFILE_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
# Peer specific variabes
- CORE_PEER_ID=peer0.LG.example.com
- CORE_PEER_ADDRESS=peer0.LG.example.com:13051
- CORE_PEER_LISTENADDRESS=0.0.0.0:13051
- CORE_PEER_CHAINCODEADDRESS=peer0.LG.example.com:13052
- CORE_PEER_CHAINCODELISTENADDRESS=0.0.0.0:13052
- CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer0.LG.example.com:13051
- CORE_PEER_GOSSIP_BOOTSTRAP=peer0.LG.example.com:13051
- CORE_PEER_LOCALMSPID=LGMSP
volumes:
- /var/run/docker.sock:/host/var/run/docker.sock
- ../organizations/peerOrganizations/LG.example.com/peers/peer0.LG.example.com/msp:/etc/hyperledger/fabric/msp
- ../organizations/peerOrganizations/LG.example.com/peers/peer0.LG.example.com/tls:/etc/hyperledger/fabric/tls
- peer0.LG.example.com:/var/hyperledger/production
working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
command: peer node start
ports:
- 13051:13051
networks:
- test
Docker 실행
COMPOSE_PROJECT_NAME = ''프로젝트 명 docker-copose up -d
docker-compose -p "프로젝트명" up -d
-d 는 백그라운드 실행
-f 는 파일지정
# Docker의 프로젝트 이름을 'net'으로 정의
COMPOSE_PROJECT_NAME=net docker-compose -f docker-compose-LG.yaml up -d
4. 기존 채널에 새로운 조직 허가받기
4.1 채널에 가장 최근의 구성 블록을 가져오기위한 Fetch
# 환경변수 설정하여 Org1로 변경
cd fabric-samples/my-network
export FABRIC_CFG_PATH=${PWD}/config
export CORE_PEER_TLS_ENABLED=true
export CORE_PEER_LOCALMSPID="Org1MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
export CORE_PEER_ADDRESS=localhost:7051
mkdir channel_org && cd channel_org
peer channel fetch config config_block.pb \
-o localhost:7050 \
--ordererTLSHostnameOverride orderer.example.com \
-c mychannel \
--tls \
--cafile $ORDERER_CA
4.2 블록 파일의 확장자(json, pb) 인코딩 디코딩
json 파일들을 읽어봤을 때 새로운 조직을 block에 추가하려고 json으로 바꾸고 새로운 조직넣고 pb형태로 다시바꾸는 것으로 이해함
※ 위에서부터 차근차근 실행
configtxlator proto_decode --input config_block.pb --type common.Block --output config_block.json
jq .data.data[0].payload.data.config config_block.json > config.json
# config.json파일에 새로운 조직 내용 추가(값 변경필요)
jq -s '.[0] * {"channel_group":{"groups":{"Application":{"groups": {"LGMSP":.[1]}}}}}' config.json ../organizations/peerOrganizations/LG.example.com/LG.json > modified_config.json
# config.json -> pb
configtxlator proto_encode --input config.json --type common.Config --output config.pb
# modified_config.json -> pb
configtxlator proto_encode --input modified_config.json --type common.Config --output modified_config.pb
configtxlator compute_update \
--channel_id mychannel \
--original config.pb \
--updated modified_config.pb \
--output LG_update.pb
configtxlator proto_decode \
--input LG_update.pb \
--type common.ConfigUpdate \
> LG_update.json
echo '{"payload":{"header":{"channel_header":{"channel_id":"mychannel", "type":2}},"data":{"config_update":'$(cat LG_update.json)'}}}' \
| jq . \
> LG_update_in_envelope.json
configtxlator proto_encode \
--input LG_update_in_envelope.json \
--type common.Envelope \
--output LG_update_in_envelope.pb
4.3 채널의 조직 서명
현재 저의 네트워크에는 총 Org1, Org2, cau, soft 4개의 조직이 존재하고 과반수인 2명 이상이 서명을 해야 업데이트가 가능
Org1 서명
cd fabric-samples/my-network
export FABRIC_CFG_PATH=${PWD}/config
export CORE_PEER_TLS_ENABLED=true
export CORE_PEER_LOCALMSPID="Org1MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
export CORE_PEER_ADDRESS=localhost:7051
# 7051포트를 사용하는 Org1 서명
cd channel_org
peer channel signconfigtx -f LGMSPanchors.tx
Org2 서명
cd fabric-samples/my-network
export FABRIC_CFG_PATH=${PWD}/config
export CORE_PEER_TLS_ENABLED=true
export CORE_PEER_LOCALMSPID="Org2MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt
export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp
export CORE_PEER_ADDRESS=localhost:9051
# 9051포트를 사용하는 Org2 서명
cd channel_org
peer channel signconfigtx -f LGMSPanchors.tx
cau 서명
cd fabric-samples/my-network
export FABRIC_CFG_PATH=${PWD}/config
export CORE_PEER_TLS_ENABLED=true
export CORE_PEER_LOCALMSPID="cauMSP"
export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/cau.example.com/peers/peer0.cau.example.com/tls/ca.crt
export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/cau.example.com/users/Admin@cau.example.com/msp
export CORE_PEER_ADDRESS=localhost:10051
# 10051포트를 사용하는 cau 서명
cd channel_org
peer channel signconfigtx -f LGMSPanchors.tx
과반수 이하로 진행하고 업데이트시 에러 :
Error: got unexpected status: BAD_REQUEST -- error applying config update to existing channel 'mychannel': error authorizing update: error validating DeltaSet: policy for [Group] /Channel/Application not satisfied: implicit policy evaluation failed - 2 sub-policies were satisfied, but this policy requires 3 of the 'Admins' sub-policies to be satisfied
4.4 채널 업데이트
peer channel update \
-o localhost:7050 \
--ordererTLSHostnameOverride orderer.example.com \
-c mychannel \
-f LGMSPanchors.tx \
--tls \
--cafile $ORDERER_CA
5. 새로운 조직 채널에 가입
# 새로운 조직의 환경변수 설정
export FABRIC_CFG_PATH=${PWD}/config
export CORE_PEER_TLS_ENABLED=true
export CORE_PEER_LOCALMSPID="LGMSP"
export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/LG.example.com/peers/peer0.LG.example.com/tls/ca.crt
export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/LG.example.com/users/Admin@LG.example.com/msp
export CORE_PEER_ADDRESS=localhost:13051
peer channel fetch 0 channel-artifacts/mychannel.block \
-o localhost:7050 \
--ordererTLSHostnameOverride orderer.example.com \
-c mychannel \
--tls \
--cafile $ORDERER_CA
peer channel join -b channel-artifacts/mychannel.block
# 해당 조직이 어디 채널에 가입되어 있는지 보여주는 리스트
peer channel list
체인코드 승인시 LGMSP가 추가된 것을 확인할 수 있음