안녕하세요?
오늘은 지난 포스팅에 이어 운영모드로 스마트 컨트랙(이하, 체인코드) 개발에 대해서 설명하겠습니다.

개발모드에서의 체인코드 개발 사이클을 되집어 보겠습니다.
개발모드에서는 블록체인 런타임 환경과 별도로 개발 PC에서 체인코드를 빌드 후 Validating Peer의 주소와 체인코드 이름을 환경변수로 셋팅하고 빌드된 체인코드 실행파일을 실행하여 REST API를 호출하여 테스트를 했습니다. 맞나요?^^
그와 대비되게 운영모드에서는 개발 완료된 체인코드를 Validating Peer 컨테이너에 복사해 넣고, REST API로 deploy만 호출하면 블록체인 네크워크 전체에 체인코드가 적용됩니다.
그럼, 지금부터 운영모드에서는 어떻게 체인코드를 반영하는지 알아보도록 하겠습니다.

1. 운영서버에서의 체인코드 디플로이 과정

운영모드에서의 체인코드는 어떤 과정을 거쳐 반영이 되는지 간단히 설명하겠습니다.
운영모드에서 체인코드 디플로이가 요청되면 요청을 받은 Peer는 블록체인 네크워크상에 연결되어 있는 모든 피어에게 동일한 체인코드를 전송합니다.
그리고, 체인코드를 전송받은 피어들은 각자 체인코드를 빌드하여 체인코드를 실행합니다.
최종적으로 아래의 그림과 같이 블록체인의 피어들은 체인코드를 포함하여 구동되는 형태가 됩니다.

개발모드에서는 체인코드를 직접 빌드하여 실행했지만 운영모드에서는 Peer가 그 역할을 대신합니다.
체인코드의 빌드는 체인코드를 전송받은 각 Validating Peer가 hyperledger/fabric-baseimage Docker 이미지를 기반으로 체인코드를 빌드하여 체인코드 구동을 위한 Docker 이미지를 만들고, 실행하게 됩니다.
Validating Peer는 Docker Remote API 서비스에 체인코드를 위한 Docker 이미지 생성 및 실행을 요청하고,
Docker 엔진은 hyperledger/fabric-baseimage를 이용하여 체인코드 Docker 이미지를 생성하고 실행합니다.
아래 그림은 운영모드에서 디플로이시 Validating Peer에서 일어나는 과정을 간략하게 표현한 그림입니다. 그리고 최종적으로 디플로이가 되고 난 이후에 docker 이미지 리스트를 검색한 결과입니다.

Validating Peer에서 Docker engine으로 요청을 보낼 수 있는 인터페이스가 있어야겠죠? 그 통로가 Docker Engine API (Docker Remote API) 입니다.

2. Validating Peer 이미지 수정

Docker machine은 VM 환경을 만들 때 기본적으로 https 통신을 하도록 Docker 엔진을 구동합니다. 그래서 위에서 설명한것과 같이 Validating Peer가 Docker engine API에 요청하기 위해서는 SSL Certificate를 가지고 있어야지만 가능합니다.
이와 관련한 설정 방법은 다음과 같습니다.

  1. 실행중인 Validating Peer 컨테이너에 certificate들을 복사합니다.
  2. 실행중인 Validating Peer 컨테이너에 터미널로 접속해서 설정파일을 수정합니다.
  3. Validating Peer에서 빠져나와서 실행중인 Validating Peer 컨테이너를 새로운 이미지 명으로 commit 합니다.
  4. 새로 생성된 이미지로 Validating Peer를 다시 구동합니다.

이제 차근차근 설정 방법을 설명하겠습니다.

2.1 Validating Peer 컨테이너에 SSL 인증서 복사

실행중인 컨테이너에 파일 복사하는 명령은 다음과 같습니다.

컨테이너에서 로컬로 복사
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH

로컬에서 컨테이너로 복사
docker cp [OPTIONS] SRC_PATH CONTAINER:DEST_PATH

그리고 docker-machine을 통해서 생성된 VM의 SSL 인증서는 각 OS 별로 다음의 위치에 있습니다.

  • MacOS

  • Windows

위의 이미지에서와 같은 위치에서 key 라는 디렉토리를 만들고 cert.pem, ca.pem, key.pem 파일을 key 디렉토리로 복사합니다.

  • MacOS
$ cd $HOME/.docker/machine/machines/blockchain
$ mkdir key
$ cp {cert,ca,key}.pem key
  • Windows

다음 순서로 key 디렉토리를 현재 실행중인 컨테이너에 복사해 넣겠습니다. 먼저 실행중인 컨테이너 ID 또는 컨테이너 Names를 확인합니다.

docker ps

hyperledger/fabric-peer에 해당하는 컨테이너 ID를 확인 하였으면 다음의 명령을 통해서 복사합니다.

docker cp key 컨테이너ID:/root/key

위의 그림을 기준으로 명령 예는 다음과 같습니다.
docker cp key 4409df7072c4:/root/key
2.2 Validating Peer의 설정파일 수정

인증서 복사단계를 완료하였으면 컨테이너에서 Peer의 설정파일에 인증서 위치를 명시해야 합니다.
그러기 위해선 먼저 Validating Peer로 접속을 해야겠죠? 다음의 명령을 통해서 접속합니다.

docker exec -it 컨테이너ID bash

위 그럼을 기준으로 명령 예는 다음과 같습니다.
docker exec -it 4409df7072c4 bash

위의 그림과 같이 접속이 되며 설정파일의 위치는 peer 디렉토리 아래에 있는 core.yaml 파일입니다.
vi 등 에디터를 통해 설정파일을 수정합니다.

최초 접속시 vi 에디터 설치가 되어있지 않습니다. 다음의 명령을 통해서 설치하시면 됩니다.

$ apt-get update
$ apt-get install -y vim

다음과 같이 파일을 수정합니다.

$ cd peer
$ vi core.yaml

설정파일 저장하였으면 최종적으로 exit 명령을 통해서 컨테이너에서 빠져나옵니다.

2.3 Validating Peer commit

인증서 파일 복사와 설정파일 수정이 완료되었으면 수정된 컨테이너를 commit 명령을 통해서 새로운 이미지로 생성합니다.

 여기서 사용하는 컨테이너 ID는 2.1 항목에서 확인된 컨테이너 ID를 사용하면 됩니다.
docker commit 4409df7072c4 hyperledger/peer:1.0

정상적으로 commit이 되었는지 확인합니다.

docker images

2.4 컨테이너 재실행

실행중인 컨테이너는 docker-compose.yml 파일이 있는 위치에서 다음의 명령을 통해서 중지시킵니다.

docker-compose down

앞서 변경된 내용을 기준으로 docker-compose.yml 파일을 수정합니다.
수정내용은 vp0의 이미지 명과 CORE_VM_ENDPOINT의 환경변수 추가, 그리고 마지막줄에서의 command 항목입니다.
다음의 파일을 받으셔서 사용하셔도 됩니다. https://github.com/mjkong/blockchain_hyperledger/blob/master/docs/Setup/prodmode/docker-compose.yml

membersrvc:
  image: hyperledger/fabric-membersrvc:x86_64-0.6.1-preview
  ports:
    - "7054:7054"
  command: membersrvc
vp0:
  image: hyperledger/peer:1.0
  ports:
    - "7050:7050"
    - "7051:7051"
    - "7053:7053"
  environment:
    - CORE_PEER_ADDRESSAUTODETECT=true
    - CORE_VM_ENDPOINT=https://192.168.99.100:2376
    - CORE_LOGGING_LEVEL=DEBUG
    - CORE_PEER_ID=vp0
    - CORE_PEER_PKI_ECA_PADDR=membersrvc:7054
    - CORE_PEER_PKI_TCA_PADDR=membersrvc:7054
    - CORE_PEER_PKI_TLSCA_PADDR=membersrvc:7054
    - CORE_SECURITY_ENABLED=true
    - CORE_SECURITY_ENROLLID=test_vp0
    - CORE_SECURITY_ENROLLSECRET=MwYpmSRjupbT
  links:
    - membersrvc
  command: sh -c "sleep 5; peer node start"

수정된 docker-compose.yml 파일의 위치에서 다음의 명령을 통해서 컨테이너를 실행합니다

docker-compose up

3. 테스트

지금까지 운영모드를 위한 설정작업을 완료하였습니다. 모든 과정을 완료하였고 컨테이너가 정상적으로 실행되었으면 REST API를 통해서 테스트해보겠습니다.
REST API로 테스트 과정은 개발모드와 동일합니다. 다만, 이번 문서에서는 차이점에 대해서만 설명하겠습니다. 개발모드의 4.테스트 항목을 함께 봐주시기 바랍니다.
먼저 시작해 보는 블록체인 04 – 개발 모드에서 스마트 컨트랙(체인코드) 개발

멤버쉽 서비스가 실행되고 있는 경우 다음의 순서로 API 호출을 해야합니다.
registrar –> deploy –> invoke or query
그 중 개발모드와 운영모드는 deploy, invoke, query에서 chaincodeID 항목만 변경이 필요합니다.

registrar 은 설명에서는 생략하지만 테스트 시는 반드시 실행하여야 합니다.

deploy

운영모드에서 체인코드 디플로이는 체인코드 소스를 컨테이너 안으로 복사한 이후 deploy API를 호출합니다.
여기에서는 이미 컨테이너 안에 존재하는 샘플 체인코드를 디플로이합니다.

API호출을 위한 전문의 개발모드와 차이점은 chaincodeID에서 path를 지정해줘야 하는 점입니다.

개발된 체인코드는 실행중인 Validating Peer 컨테이너로 복사를 해서 deploy를 해야합니다.
복사를 해야하는 위치는 GOPATH 하위에 디렉토리로 복사되어야 하며, Validating Peer 컨테이너의 GOPATH는 /opt/gopath 입니다.
다음 그림과 같이 chaincodeID의 path에 지정된 샘플 체인코드의 절대경로는 /opt/gopath/src/github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02 입니다.

정상적으로 디플로이가 되었으면 다음 그림에서와 같은 결과를 받게됩니다. 그리고 docker images 또는 docker ps 를 통해 확인하면 관련 컨테이너가 생성되고 실행 중인 것을 확인 할 수 있습니다.

또한 디플로이 호출 결과의 message 의 값을 따로 관리해야합니다. (invoke, query 의 전문에서 chaincodeID.name 의 값으로 입력해서 호출해야 합니다.)


invoke, query

디플로이의 결과로 리턴된 해시코드를 invoke, query 에서 chaincodeID.name으로 입력하여 호출합니다. 다음의 API 호출 결과를 확인해서 테스트합니다.

  • invoke

  • query

4. 정리하며

지금까지 Docker 기반으로 블록체인 런타임 환경을 만들고, 개발모드와 운영모드에서의 체인코드 개발 및 적용 방법에 대해서 알아봤습니다.
이로서 Hyperledger Fabric 기반의 개발 환경이나 운영하기 위한 아주 기본적인 환경 설정은 가능할 것으로 생각됩니다.
Hyperledger Fabric은 우선 docker 이미지로 배포가 되기 때문에 Docker를 잘 활용할 수 있으면 더 편리하게 블록체인 네트워크를 구성하고 운영하실 수 있습니다.