이전 포스트의 first-network 예제는 간단하게 bash shell을 실행하는 것만으로 HLF 네트워크 구축이 가능했다. 이번에는 fabric-tools를 이용하여 HLF 네트워크를 구축해보자.
HLF 네트워크 관련 파일이 저장될 디렉토리를 지정한다. (필자는 my-network로 지정하였지만 다른 이름도 상관없다.)
새로운 디렉토리에서 네트워크를 구성하는 엔티티들의 크리덴셜 (인증서와 서명을 위한 개인키)을 만들기 위해 Crypto Generator를 사용한다. Crypto Generator를 실행할 때는 yaml 형식의 설정 파일이 인자로 들어가야 하는데, 파일 이름은 crypto-config.yaml로 지정한다. crypto-config.yaml에는 Org 이름, 도메인 접속 정보와 Org를 구성하는 피어의 수가 정의되어 있다.
# Moving to \fabric-samplescd~/fabric-samples# Create new directorymkdirmy-network# Copy Cryptogen configuration file (used first-network example) to current directory cp../first-network/crypto-config.yaml./# Execute Crypto Generator (for generating x.509 certs and signing keys)../bin/cryptogengenerate--config=./crypto-config.yaml
Crypto Generator를 위 명령어로 실행시키면 현재 작업 중인 폴더 (my-network)에 crypto-config 폴더가 만들어지고 하위로 ordererOrganizations과 peerOrganizations 폴더가 만들어졌음을 확인할 수 있다.
tree 명령어를 사용하여 ordererOrganizations의 구조를 살펴보자. 도메인명 (example.com)으로 되어 있는 디렉토리 하위에 \ca, \msp, \orderers, \tlsca, \users가 위치하고, Root CA, TLS CA, Orderer, User의 인증서와 서명 키가 각각 들어 있다.
peerOrganizations는 org1, org2로 구분되어 있다. orderer의 인증서/서명 키 대신 peer들의 인증서/서명 키가 저장된다는 것만 제외하고 ordererOrganizations 디렉토리와 거의 흡사한 구조를 보인다.
다음으로 현재 작업 중인 디렉토리에 /channel-artifacts를 만들고 Configuration Transaction Generator (configtxgen)를 이용하여 제네시스 블록을 만들어보자. 이를 위해 설정 파일인 configtx.yaml을 작성한다. \first-network\configtx.yaml은 아래와 같이 총 6개의 Section으로 구성되어 있다.
Organizations: Org 정보, MSP 위치, anchor peer 접속 정보, 접근 제어 정책
Capabilities: 사용할 수 있는 Channel, Orderer, Application 버전
Applications: 어플리케이션 접근 제어 정책
Orderer: 오더링 타입 (etcdraft), 접속 정보, 일괄 처리 관련 옵션, Broker 접속 정보, 접근 제어 정책
Channel: 채널 접근 제어 정책
Profiles: 설정 프로파일. 위의 옵션들을 하나의 프로파일로 만들어 configtxgen에서 파라미터로 사용
이게 도커 설정 파일을 작성하고 HLF 네트워크를 실행할 차례이다. 도커 설정 파일도 위와 마찬가지로 first-network에서 사용한 것을 현재 디렉토리에 복사한다. 명령어를 차례대로 수행하면 5개의 orderer 컨테이너와 네 개의 peer 컨테이너, cli 컨테이너가 생성된다.
컨테이너 실행을 위해서는 COMPOSE_PROJECT_NAME, IMAGE_TAG 환경 변수를 지정할 필요가 있다. docker-compose를 실행할 때마다 지정할 수 있지만, 현재 디렉토리에 .env 파일을 생성하여 컨테이너에 적용될 환경 변수를 모아서 관리하는 것이 더 유용하다.
# Set peer0.org1 to anchor peer of Org1peerchannelupdate-oorderer.example.com:7050-c $CHANNEL_NAME -f./channel-artifacts/Org1MSPanchors.tx--tls--cafile/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem# Set peer0.org2 to anchor peer of Org2CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp CORE_PEER_ADDRESS=peer0.org2.example.com:9051 CORE_PEER_LOCALMSPID="Org2MSP" 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 peer channel update -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/Org2MSPanchors.tx --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
이제 체인코드를 채널 냉 피어에 설치하고 배포한다. v2.0부터는 합의 알고리즘이 RAFT로 바뀌면서 Orderer 간의 체인코드 검증과 Go module 적용으로 인한 체인코드 패키징 과정이 새로 추가되었다. peer 명령어를 통해 컨테이너 안에서 체인코드를 패키징한다. 패키징 후 cli 컨테이너의 루트 디렉토리 안에 mycc.tar.gz가 생성된 것을 확인할 수 있다.
# before packaging Golang chaincode, vendoring Go dependencies is required like the following commands.cd/opt/gopath/src/github.com/hyperledger/fabric-samples/chaincode/abstore/goGO111MODULE=ongomodvendorcd-# this packages a Golang chaincode.# make note of the --lang flag to indicate "golang" chaincode# for go chaincode --path takes the relative path from $GOPATH/src# The --label flag is used to create the package labelpeerlifecyclechaincodepackagemycc.tar.gz--pathgithub.com/hyperledger/fabric-samples/chaincode/abstore/go/--langgolang--labelmycc_1
peer0.org1에 체인 코드 패키지를 설치한다. 설치 후 queryinstalled 명령어를 이용하면 체인코드의 패키지 ID를 얻을 수 있는데 이를 CC_PACKAGE_ID 환경 변수로 설정한다. CC_PACKAGE_ID는 체인코드 검증에 사용된다. 아래 코드의 ID는 필자의 실습 환경에서 얻은 값이니 환경에 따라 다를 수 있다.
peerlifecyclechaincodeinstallmycc.tar.gz# this returns the details of the chaincode packages installed on your peerspeerlifecyclechaincodequeryinstalledCC_PACKAGE_ID=mycc_1:d881a1edbfb7d5fbbbfba6272158e24381826157c2f6b42a3245b454cffc908e
peer0.org2에 체인 코드 패키지를 설치한다. 피어에 체인 코드가 설치되어 있어야 체인코드를 호출할 수 있다.
cli 컨테이너에서 터미널로 이동하고 싶을 때는 exit 명령어로 빠져나온다. 더이상 확인할 것이 없다면 네트워크를 종료하고 실행 중인 컨테이너를 삭제한다.
# 실행 중인 docker container 모두 종료dockerrm-f $(dockerps-aq)# docker container에서 사용하지 않는 모든 docker volume을 삭제dockervolumeprune# cached network 초기화dockernetworkprune