유용한 정보

Fabric에 대해 살펴보겠습니다.(2편)

CyberI 2018. 5. 25. 10:02

이전 내용에서 Hyperledger Fabric을 알아보았다면 이번에는 Fabric을 개발하기 위한 환경 설정에 대해 알아보고자 합니다. Hyperledger Fabric에 대한 1편 내용을 복습하고 싶다면 '다시보기'를 클릭해주세요. 

 

1. Fabric 게시판을 구현하기 위한 환경 설정

지금부터는 Hyperledger Fabric 이용해서 환경은 어떻게 구성하며, 어떻게 동작되는지 , Hyperledger Fabric 기반의 블록체인 개발환경을 구성하면서 하나씩 알아보도록 하겠습니다. (아래 환경 구축 소스 내용은 Fabric 이용한 게시판을 작성한 내용을 토대로 진행 하였습니다.)

Fabric을 사용하기 위한 환경을 구축하는데는 2가지 방법이 있습니다. Bluemix라는 IBM에서 제공되는 클라우드 시스템을 이용하여 사용하는 방법과 Docker를 이용한 방법으로 개발 환경을 구축 할 수 있습니다.

Bluemix의 경우 IBM 클라우드를 이용하여 서버 및 여러 환경을 간단하게 셋팅하여 사용 할 수 있고 기본적인 서버환경이 자동으로 생성 되기 때문에 클라이언트에 해당하는 소스만 작성하여 테스트 할 수 있다는 장점이 있지만 가격적인 면과 아직 베타버전으로 제공 된다는 점에 있어서 차후 정식 버전이 나온다면 사용하는 것이 좋을 것 같다고 생각됩니다.

Docker를 이용한 방법은 Bluemix와 달리 서버환경의 설정, 블록체인 네트워크 등에 대한 설정을 개인이 설정해야 하는 번거로움이 있지만 사용자가 원하는 환경을 구성 할 수 있으며 개인 PC에서도 서버 환경을 구성 할 수 있다는 장점이 있습니다.

 

(아래 내용은 Docker를 이용한 환경 구축 및 개발 내용을 기준으로 설명을 하도록 하겠습니다.)

 

2. 설치

Fabric을 사용하기에 앞서 설치하기 위해서는 아래의 개발환경을 필요로 합니다.

l   VirtualBox (Ubuntu 설치용)

l   Docker Docker Compose

l   Node.js npm

l   curl

l   Go

Docker의 경우 Window10을 최소사양으로 지원하기 때문에 Window10의 경우 Docker를 이하 버전의 Window에서는 Docker ToolBox를 이용하는 방법과 다른 OS(Linux, Mac)에서 Docker를 사용하는 방법이 있습니다. (이 내용에서는 VirtualBox Ubuntu를 설치하여 진행 하도록 하겠습니다.) Docker의 경우 1.13버전 이상의 버전을 Docker Compose의 경우 1.8버전 이상의 버전을 사용해야 한다고 합니다.

Go언어의 경우 Fabric Chaincode 개발 시 필요로 하기 때문에 설치를 하였고 curl Docker의 이미지, 예제 소스를 받기 위해 설치를 하였습니다아래의 코드를 통해 Fabric 개발에 필요한 Docker 이미지와 예제 소스파일을 받을 수 있습니다.

curl -sSL https://goo.gl/6wtTN5 | bash -s 1.1.0

(위 명령어 실행 시 오류가 발생하는 경우가 생기는데 그 경우 curl의 url이 오래된 경우일 수 있으니 확인이 필요합니다. 링크 )

그림 4-예제파일

위 예제 소스들은 Hyperledger fabric document 사이트를 통해 사용법 및 예제 소스의 설명을 볼 수 있습니다이 예제소스 중 basic-network는 기본적인 fabric의 네트워크를 구성하는 설정 파일 및 여러 파일들이 존재하고 있습니다. 해당 basic-network를 통해 기본적으로 환경을 구성하는지 보시면 될 것 같습니다.

그림 5-Docker 이미지

이렇게 생성된 이미지를 이용하여 환경 설정을 진행합니다. 여기서 모든 docker의 이미지가 필요한 것은 아니고 아래의 이미지 들이 사용됩니다.

l   hyperledger/fabric-ca

l   hyperledger/fabric-orderer

l   hyperledger/fabric-peer

l   hyperledger/fabric-couchdb

l   hyperledger/fabric-tools

이렇게 다섯개의 이미지를 이용하여 진행 하도록 할 예정입니다. 여기서 생성된 이미지는 docker-compose 파일을 이용하여 환경을 구축하고 container로 띄우려고 합니다. (docker-compose의 사용법에 대한 내용은 링크를 통해 확인하실 수 있습니다.)

docker composel 파일은 일반적으로 yml, yaml 확장자로 설정파일로 많이 쓰입니다. 특징은 공백은 탭이 아닌 스페이스로 반드시 타이핑 해야 하며, 들여쓰기의 위치를 아래 문서와 동일하게 해야 정상동작 합니다. yml 파일의 특성으로 잘못 작성될 경우(빈 공백에 탭 문자등 스페이스가 아니 다른 문자가 들어갈 경우나 탭의 위치가 맞지 않을 경우 등) docker 컨테이너 시작이 되지 않으므로 작성에 유의해야 합니다.

 

아래의 내용은 docker-compose 파일의 servicece 부분이며 해당 소스는 아래와 같습니다. 이 소스는 위에서 언급한 basic-network에 있는 docker-compose파일을 참고로 한 것이며 필요한 설정 파일 역시 동일한 파일을 사용하였습니다

1) hyperledger/fabric-ca

 ca.example.com:

 

    image: hyperledger/fabric-ca

 

    environment:

 

      - FABRIC_CA_HOME=/etc/hyperledger/fabric-ca-server

 

      - FABRIC_CA_SERVER_CA_NAME=ca.example.com

 

      - FABRIC_CA_SERVER_CA_CERTFILE=/etc/hyperledger/fabric-ca-server-config/ca.org1.example.com-cert.pem

 

      - FABRIC_CA_SERVER_CA_KEYFILE=/etc/hyperledger/fabric-ca-server-config/4239aa0dcd76daeeb8ba0cda701851d14504d31aad1b2ddddbac6a57365e497c_sk

 

    ports:

 

      - "7054:7054"

 

    command: sh -c 'fabric-ca-server start -b admin:adminpw -d'

 

    volumes:

 

      - ./crypto-config/peerOrganizations/org1.example.com/ca/:/etc/hyperledger/fabric-ca-server-config

 

    container_name: ca.example.com

 

    networks:

      - basic

fabric-ca(Certificate Authority)는 위에서 언급했던 Membership과 관련있는 docker입니다.
여기서 주의 할 점은FABRIC_CA_SERVER_CA_CERTFILE, FABRIC_CA_SERVER_CA_KEYFILE 의 경로와 파일 명에 대한 부분을 주의 해야 합니다. 생성된 fabric-ca 컨테이너에 접속 하여 해당 경로로 이동하면 실제로는 해당 파일들이 존재하지 않는 상태로 있습니다. 여기서 보아야 할 것이 volumes입니다

./crypto-config/peerOrganizations/org1.example.com/ca/ : /etc/hyperledger/fabric-ca-server-config

 

volumes의 부분을 보면 “:“을 기준으로 앞뒤 경로를 나눌 수 있습니다. 앞의 경로는 실제 로컬의 경로이며 뒤의 경로는 docker container의 경로로 이렇게 volumes를 사용한다면 로컬의 경로에 있는 파일을 container에서 사용 할 수 있게 됩니다.
이 경로에 있는 파일 명에 따라 FABRIC_CA_SERVER_CA_CERTFILE, FABRIC_CA_SERVER_CA_KEYFILE 의 파일명도 변경 되어야 하며 위치에 따라 volumes의 로컬 위치도 변경해야 합니다.

 2) hyperledger/fabric-orderer

 orderer.example.com:

    container_name: orderer.example.com

    image: hyperledger/fabric-orderer

    environment:

      - ORDERER_GENERAL_LOGLEVEL=debug

      - ORDERER_GENERAL_LISTENADDRESS=0.0.0.0

      - ORDERER_GENERAL_GENESISMETHOD=file

      - ORDERER_GENERAL_GENESISFILE=/etc/hyperledger/configtx/genesis.block

      - ORDERER_GENERAL_LOCALMSPID=OrdererMSP

      - ORDERER_GENERAL_LOCALMSPDIR=/etc/hyperledger/msp/orderer/msp

    working_dir: /opt/gopath/src/github.com/hyperledger/fabric/orderer

    command: orderer

    ports:

      - 7050:7050

    volumes:

        - ./config/:/etc/hyperledger/configtx

        - ./crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/:/etc/hyperledger/msp/orderer

        - ./crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/:/etc/hyperledger/msp/peerOrg1

    networks:

      - basic


3)
hyperledger/fabric-peer

 peer0.org1.example.com:

    container_name: peer0.org1.example.com

    image: hyperledger/fabric-peer

    environment:

      - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock

      - CORE_PEER_ID=peer0.org1.example.com

      - CORE_LOGGING_PEER=debug

      - CORE_CHAINCODE_LOGGING_LEVEL=DEBUG

      - CORE_PEER_LOCALMSPID=Org1MSP

      - CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/msp/peer/

      - CORE_PEER_ADDRESS=peer0.org1.example.com:7051

      - CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=${COMPOSE_PROJECT_NAME}_basic

      - CORE_LEDGER_STATE_STATEDATABASE=CouchDB

      - CORE_LEDGER_STATE_COUCHDBCONFIG_COUCHDBADDRESS=couchdb:5984

      - CORE_LEDGER_STATE_COUCHDBCONFIG_USERNAME=admin

      - CORE_LEDGER_STATE_COUCHDBCONFIG_PASSWORD=adminpw

    working_dir: /opt/gopath/src/github.com/hyperledger/fabric

    command: peer node start

    ports:

      - 7051:7051

      - 7053:7053

    volumes:

        - /var/run/:/host/var/run/

        - ./crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/msp:/etc/hyperledger/msp/peer

        - ./crypto-config/peerOrganizations/org1.example.com/users:/etc/hyperledger/msp/users

        - ./config:/etc/hyperledger/configtx

    depends_on:

      - orderer.example.com

      - couchdb

    networks:

      - basic


4) hyperledger/fabric-couchdb

 couchdb:

    container_name: couchdb

    image: hyperledger/fabric-couchdb

    environment:

      - COUCHDB_USER=admin

      - COUCHDB_PASSWORD=adminpw

    ports:

      - 5984:5984

    networks:

      - basic

 

COUCHDB_USER COUCHDB_PASSWORD는 원하는 계정명과 비밀번호로 변경하여 작성해도 무관합니다.

  5) hyperledger/fabric-tools

 cli:

    container_name: cli

    image: hyperledger/fabric-tools

    tty: true

    environment:

      - GOPATH=/opt/gopath

      - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock

      - CORE_LOGGING_LEVEL=DEBUG

      - CORE_PEER_ID=cli

      - CORE_PEER_ADDRESS=peer0.org1.example.com:7051

      - CORE_PEER_LOCALMSPID=Org1MSP

    -                     CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp

      - CORE_CHAINCODE_KEEPALIVE=10

    working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer

    command: /bin/bash

    volumes:

        - /var/run/:/host/var/run/

        - ./../chaincode/:/opt/gopath/src/github.com/

        - ./crypto-config:/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/

    networks:

        - basic

chaincode의 경로와 config file의 경로 등을 설정하도록 되어있습니다. 실제로 작업한 chaincode 관련 파일의 위치를 맞춰서 volumes의 경로를 수정해야 합니다위의 설정들을 통해 작성 된 yaml 파일을 이용하여 아래의 명령어를 통해 container를 생성 하게 됩니다.

docker-compose –f “파일명” up –d

그림 6-Docker container 리스트

이와 같이 container들이 생성된 것을 볼 수 있습니다여기서 추가적으로 해야 할 것들이 있는데 

 1. 채널 생성

docker exec -e "CORE_PEER_LOCALMSPID=Org1MSP" –e 

"CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/msp/users/Admin@org1.example.com/msp"

peer0.org1.example.com peer channel create -o orderer.example.com:7050 -c mychannel -f /etc/hyperledger/configtx/channel.tx

 

2. peer0.org1.example.com을 해당 채널에 추가 시키는 작업

docker exec -e "CORE_PEER_LOCALMSPID=Org1MSP" -e

 "CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/msp/users/Admin@org1.example.com/msp" peer0.org1.example.com peer channel join -b mychannel.block

 

3. docker 내부에 github.com/board-app경로에 있는 go파일을 이용해 chaincode 생성

docker exec -e "CORE_PEER_LOCALMSPID=Org1MSP" -e "CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp"

cli peer chaincode install -n board-app -v 1.0 -p github.com/board-app

위의 순서의 단계가 추가적으로 필요합니다.
1
번은 Peer를 이용하여 채널을 생성하는 작업이며 채널명은 mychannel로 지정하는 부분입니다. 여기서 경로 역시 docker compose 파일의 voluems에 지정된 경로로 사용해야 합니다.
2
번은 그렇게 생성한 채널에 Peer를 추가하는 작업이며 3번은 chaincode 생성 및 해당 chaincode에 사용 될 go파일의 경로를 적어 준 것입니다. 여기서 go파일의 경로 역시 docker compose 파일의 volumes에서 지정해준 경로로 사용하며 경로가 다를 경우 수정이 필요합니다.

 


Fabric에 대한 더 자세한 내용을 살펴보고 싶다면, 아래 링크를 클릭해주세요.

▶ Fabric에 대해 살펴보겠습니다.(1편)


 

참고자료

https://developer.ibm.com/kr/developer-%EA%B8%B0%EC%88%A0-%ED%8F%AC%EB%9F%BC/2017/01/08/blockchain-basic-01-introduction-to-distributed-ledgers/

https://developer.ibm.com/kr/developer-%EA%B8%B0%EC%88%A0-%ED%8F%AC%EB%9F%BC/2017/01/15/blockchain-basic-02-hyperledger-fabric-overview/

https://godoc.org/github.com/hyperledger/fabric/core/chaincode/shim

https://www.bloter.net/archives/276774

http://fabrictestdocs.readthedocs.io/en/latest/gettingstarted.html

https://snowdeer.github.io/blog/tags/#blockchain

https://snowdeer.github.io/blockchain/2017/06/22/introduction-of-hyperledger/

http://miiingo.tistory.com/40

https://developer.ibm.com/kr/cloud/blockchain/2017/04/04/starting_blockchain_using_hyperledger_fabric/

https://developer.ibm.com/kr/developer-%EA%B8%B0%EC%88%A0-%ED%8F%AC%EB%9F%BC/2017/01/26/blockchain-basic-03-build_development_environment/

http://hihellloitland.tistory.com/24

http://hyperledger-fabric.readthedocs.io/en/latest/

http://hyperledger-fabric.readthedocs.io/en/release-1.1/getting_started.html

http://avilos.codes/infra-management/virtualization-platform/docker/docker-compose/

https://www.ibm.com/blockchain/kr-ko/hyperledger.html 

https://developer.ibm.com/kr/developer-%EA%B8%B0%EC%88%A0-%ED%8F%AC%EB%9F%BC/2017/01/15/blockchain-basic-02-hyperledger-fabric-overview/

 

https://mvnrepository.com/artifact/org.hyperledger.fabric-sdk-java/fabric-sdk-java/1.1.0