IBM Blockchain Platform(이하 IBP) Extension for VS Code를 이용해서 체인코드(SmartContract)를
쉽게 개발하고 테스트하는 방법에 대해 포스팅합니다.

본 포스팅은 HyperLedger Fabric의 기본 개념을 알고계신 분들을 대상으로 합니다.

들어가며…

IBM에서는 BaaS(blockchain-as-a-service) 형태로 제공되는 서비스를 IBM Blockchain Platform(이하 IBP)이라고 부르고 있습니다.

다양한 오퍼링 환경에서 구동가능한 IBP는 근본적으로 Hyperledger Fabric 스택을 구현하고 있습니다.

당연히 IBP가 HyperLedger Fabric을 구현하고 있기 때문에 체인코드 개발 및 디플로이 과정도 필요합니다.

잠깐 체인코드 개발/테스트에 대해 이야기 해볼까요?

    HyperLedger Fabric에서 체인코드를 개발하고 테스트하는 방법은 크게 2가지가 있습니다.

  1. 테스트 코드 작성(단위/시나리오 테스트)
  2. 로컬/개발 fabric 환경에서 체인코드 deploy(instantiate) 후 테스트

1번 테스트 코드를 작성하는 방법은 state에 접근할 수 있는 shim 패키지를 이용하는 방법입니다.
shim 패키지에서는 MockStub이라는 인터페이스를 통해 모의로 체인코드를 테스트 할 수 있는 환경을 제공하고 있습니다.
테스트 코드의 샘플은 github에도 잘 나와있습니다(아래 소스를 참고해주세요)
(https://github.com/hyperledger/fabric/blob/release-1.4/examples/chaincode/go/example02/chaincode_test.go)

디자인이나 화면 기획을 하시는 분들이 실제 구현체를 만들기 전에 balsamiq 같은 Mockup tool을 이용해
모의 Frame을 만들게 되는데 이와 비슷하다고 할 수 있습니다.

모의(mock) 구현체인거죠.

요약하자면 MockStub은 체인 코드 기능을 디플로이 하기 전 직접 테스트 할 수 있는 기능을 구현한 shim 패키지의 일부입니다.
(https://godoc.org/github.com/hyperledger/fabric/core/chaincode/shim)

실제로 체인코드 개발자 대부분이 Mockstub을 이용해 단위 테스트 코드를 작성합니다.

다만, MockStub은 production 환경에서 구동되는 체인코드(implement ChaincodeStub interface)의 모든 기능을 지원하지 않기 때문에 약간의 한계는 존재합니다.
예를 들어 couchDB에 접근하는 기능들 혹은 GetHistoryForKey 같은 일부 function들에 대해서는 아직 구현되지 않은거죠(not implemented).

이렇게 지원되지 않은 MockStub 함수들을 단위 테스트 코드로 활용하기 위해서는 별도의 라이브러리들을 MockStub과 연결하여 구동 가능한 형태로 만들던지 별도 로직을 구현해야 합니다.
하지만 많은 노력과 시간이 필요합니다.

결국 테스트 코드를 이용해 단위 테스트가 가능한 부분은 일부 기능들로 제한되기 때문에 로컬 혹은 개발 환경에 구축된
블록체인 네트워크 환경에서 체인코드를 디플로이한 후 각 function에 대한 기능 테스트를 하는 과정이 매우 중요합니다(2번)

하지만 이러한 과정들이 단순히 한두번 으로 끝나지 않는 경우가 많습니다.

비즈니스에 대한 요건이 끊임없이 변경됨에 따라 체인코드로 구현해야 하는 로직들도 지속적인 수정이 필요할 수 있습니다.

개발/테스트 환경에서 지속적으로 변경되는 코드를 체인코드 LifeCycle(package, install, instantiate, upgrade)에 따라
다시 개발 > 테스트 > 디플로이 하는 과정이 반복적으로 일어나게 되는 것이죠.

이러한 과정들을 별도 script로 만들거나 Fabric Client SDK를 구현해 간결한 형태로 만들 수 있지만 구현하는데 상당한 시간이 소요됩니다.

그래서 IBM에서는 VS Code extension으로 체인코드 개발 효율성을 높이는 일종의 도구(Tool)를 제공하고 있습니다.

무료(free)로 사용할 수 있기 때문에 접근성(?)도 좋고
여기에서 개발한 체인코드를 당연히 Fabric에서도 사용할 수 있습니다(IBP가 아니더라도요)

자 그럼 한번 살펴볼까요?

IBP Extension for VS Code 사용해보기

IBP Extension for VS Code를 사용하기 위해서는 아래와 같은 개발 환경이 요구됩니다.
(https://github.com/IBM-Blockchain/blockchain-vscode-extension)

  • OS : Windows 10, Linux, MacOS
  • VS Code v1.32 이상
  • Node v8.x 이상, npm v5.x 이상
  • Docker v17.06.2-ce 이상
  • Docker Compose v1.14.0 이상
  • Golang v1.12 이상


추가로 Windows 사용자는 아래 내용도 필요합니다

    설치 확인 방법(터미널에서 아래 명령어 입력)은 아래와 같습니다

  • node –version
  • npm –version
  • docker –version
  • docker-compose –version
  • go version

기본적인 설치 및 환경은 위 요구사항을 충족하면 됩니다.
다만 Go, javascript, typescript, java 등 구현할 체인코드 language에 따라 추가적으로 설정해줘야 할 부분들이 존재합니다.

저희는 golang용 체인코드를 개발할 것이므로 go파일을 실행하기(compile/run) 위한 별도의 path를 설정해야 합니다
(본 포스팅에서 path를 설정하는 방법은 다루지 않습니다. 설치파일을 통해 자동으로 설정된다고 가정합니다)
go언어는 https://golang.org/에 접속하여 실행파일을 다운로드 할 수 있습니다.

설치(install)가 가능한 형태(.msi, .pkg)로 다운로드 받을 경우 go언어 실행을 위한 path가 자동으로 설정됩니다.
다만 tar 또는 zip형태의 파일은 별도로 path를 설정해야 합니다.(본 포스팅에서는 해당 과정을 생략합니다)

go언어에 대한 설정들이 완료 되면 터미널에서 go env 명령어를 통해 현재 설정된 go 환경정보를 확인할 수 있습니다.
여기에서 가장 중요한 부분 중 하나는 GOPATH입니다.

GOPATH는 go 코드 개발을 위한 일종의 Workspace(작업공간) 입니다.

우리가 흔히 java환경을 구동하기 위해서 JDK 또는 JRE 경로를 환경변수나 PATH에 설정하게 되는 것처럼(개념상 약간은 다릅니다)
GOPATH도 설정을 통해 Workspace의 기준 경로를 설정해야합니다.

GOPATH를 꼭 기억해주세요.
Unix 계열의 시스템들은 go를 설치하면(.msi,.pkg) $HOME/go 경로에 디폴트로 GOPATH가 설정되며
Windows 계열에서는 %USERPROFILE%/go가 설정됩니다(특정 버전 이하는 디폴트 설정 안됨)

이 GOPATH는 이후에 체인코드 프로젝트를 생성할 때 기준 디렉토리가 되기 때문에 꼭 기억해주세요.

기본적인 환경구성이 완료되면 VS Code를 실행하여 IBM Blockchain Platform extension을 설치합니다.

설치 방법은 아래와 같습니다.

1. VS Code 실행 후 extension 클릭(단축키 : command+shift+p)합니다.
검색 창에 IBM Blockchain Platform을 입력한 후 해당 extension을 설치(install) 합니다.

2. 설치(install)가 완료되면 아래 화면처럼 Activity Bar에 IBP 아이콘이 생성되며 아이콘을 클릭하면 아래와 같은 화면이 나타납니다.

만약 2번을 진행하시다가 “There is no data provider registered that can provide view data” 라는 오류 메세지가 발생하면 npm/nodejs 버전 문제일 수 있으니 시스템 요구사항을 다시 한번 확인해주세요.

IBP for VS code 화면은 아래와 같이 4개의 레이아웃(layout)으로 구성되어 있으며 각 레이아웃의 역할은 아래와 같습니다.

  • SMART CONTRACTS PACKAGES : 체인코드를 생성 및 패키지화
  • LOCAL FABRIC OPS : 로컬 Fabric 네트워크 구동
  • FABRIC GATEWAYS : 로컬 Fabric 네트워크 연결/체인코드 함수 호출(Submit/Evaluate)
  • FABRIC WALLETS : 관리자 신원 저장

각 레이아웃별로 구체적으로 어떤 기능들을 할 수 있는지 또 어떻게 사용할 수 있는지는 다음 포스팅에서 자세히 이야기 해보겠습니다.