2편에 이어 IBM Blockchain Platform(이하 IBP) Extension for VS Code 사용법에 대해 알아봅니다.

3편에서는 IBP Extension for VS Code를 실제로 사용해 보겠습니다

시나리오는 아래 순서에 따르겠습니다.
(테스트 코드 테스트 부분은 생략합니다)

1. 체인코드(SmartContract) 프로젝트 생성
2. 체인코드 개발
3. 체인코드 패키지
4. local Fabric 구동
5. local Fabric에 체인코드 설치(install)
6. local Fabric에 체인코드 배포(instantiate)
7. 트랜젝션 콜
8. 체인코드 수정
9. 체인코드 패키지
10. local Fabric에 체인코드 설치(install)
11. local Fabric에 체인코드 배포(Upgrade)
12. 트랜젝션 콜

자 그럼 시작해 볼까요?

1. 체인코드(SmartContract) 프로젝트 생성

1. IBP 사이드바 레이아웃 중 제일 상단에 SMART CONTRACT PACKAGES 패널에서 Create Smart Contract Project 메뉴를 클릭합니다

2. 체인코드 language를 선택하라는 메뉴가 나오면 Go 언어를 선택합니다

3. 생성 할 체인코드 프로젝트를 위치를 지정합니다.
Browse를 클릭하면 아래 화면이 나타납니다

여기가 매우 중요합니다.
Go언어용 체인코드 프로젝트는 $GOPATH/src/ 경로에 생성되어야 합니다.

만약 $GOPATH와 무관한 경로에 프로젝트를 생성하면 나중에 패키지를 하는 과정에서 아래와 같은 에러메세지가 발생합니다.

4. 저는 아래와 같이 ibp-cc라는 이름의 새로운 폴더를 만들고 해당 경로 밑에서 체인코드를 개발할겁니다.

5. 폴더가 생성되면 생성된 폴더를 클릭하고 save 버튼을 누릅니다.

6.save 버튼을 클릭하면 생성한 프로젝트를 VS Code WorkSpace에 추가해야 합니다.
아래와 같이 Workspace에 추가(Add) 합니다.

7. WorkSpace에 추가되면 아래와 같이 3개의 go 파일이 보여집니다.

8. 실제 저희가 개발할 소스는 chaincode.go에 있습니다.
디폴트로 생성된 chaincode.go 파일은 아래와 같은 소스로 되어 있습니다.
체인코드를 개발해 보셨던 분들이라면 많이 보셨을 Init/Invoke 함수가 보이네요.
하지만 추가적으로 구현이 필요할 것 같습니다.
다음 챕터에서 계속해서 진행해 볼게요.

2. 체인코드 개발

chaincode.go파일을 아래와 같이 간단하게 수정해 보았습니다. 2개의 function을 만들었습니다.
– putData : args[0]을 key로 설정, TestModel(key,value) struct를 json으로 저장합니다
– getData : args[0]을 key로 설정, stateDB에 저장된 값을 조회합니다

3. 체인코드 패키지

자 이제 2번에서 개발한 체인코드를 패키지화 해보겠습니다.

1. 다시 IBP 탭으로 와서 Package a Smart Contract Project 버튼을 클릭합니다


2. WorkSpace 목록에 있는 프로젝트 중 패키지화 할 체인코드 프로젝트를 선택합니다.
만약 WorkSpace에 프로젝트가 하나밖에 없으면 이 과정은 생략됩니다.
저는 이전에 테스트를 위해 여러개 프로젝트를 만들었는데요. 그러면 이렇게 목록 중 하나를 선택하라고 나옵니다.
$GOPATH/src 밑에 프로젝트를 만들더라도 VS Code WorkSpace에 추가되지 않은 프로젝트는 목록에 나타나지 않습니다.
꼭 주의해 주세요!


3. 패키지 이름을 설정합니다. 저는 폴더 이름과 동일하게 ibp-cc라고 해보겠습니다.


4. 버전을 설정합니다. 첫번째 체인코드 이므로 1로 설정하겠습니다.


5. 아래와 같이 패키지가 완료되었습니다. 패키지 이름@패키지 버전으로 표시됩니다.


4. local Fabric 구동

패키지가 완료된 체인코드를 실행하기 위해서는 Fabric 네트워크 환경이 필요합니다.
local에(개인 PC라고 가정) Fabric 네트워크를 구동시켜 보겠습니다.

1. 현재는 local pc(Desktop이라고 가정)에 Fabric 이미지가 구동되지 않은 상태입니다.


2. LOCAL FABRIC OPS 패널에서 ‘Click to Start’ 문구가 적힌 곳을 클릭합니다.


3. 2번을 수행하면 Fabric 이미지가 다운로드 되며(fabric v1.4.1) 자동으로 이미지들이 구동됩니다(run).
앞서 설명한 것처럼 CA, Orderer, Peer, CouchDB 이미지가 구동됩니다
(gliderlabs/logspout 이미지도 구동됩니다. 이는 도커 컨테이너들의 로그들을 라우팅하여 다양한 옵션 및 필터링으로 보여주게끔 하는 써드파티입니다.
이번 포스팅에서 사용방법에 대해서는 생략합니다)
어쨌든 다시 docker ps를 쳤을 때 아래와 같이 fabricvscodelocalfabric_이름 으로 컨테이너들이 구동된 것을 확인할 수 있습니다.

4. 또 IBP SideBar의 모습도 아래와 같이 변경됩니다.
(각 패널들의 설명은 2편을 참고해주세요)

5. local Fabric에 체인코드 설치(install)

1. LOCAL FABRIC OPS 패널에서 +Install 버튼을 클릭합니다.


2. 체인코드를 설치(install)할 peer를 선택합니다.


3. 설치(install)할 패키지를 선택합니다.
저는 이전에 패키지화 했던 ibp-cc@1을 선택하겠습니다.


4. 설치가 완료되면 Installed 목록에 체인코드가 추가됩니다.

6. local Fabric에 체인코드 배포(instantiate)

1. LOCAL FABRIC OPS 패널에서 +Instantiate 버튼을 클릭합니다.


2. 디플로이(instantiate)할 채널을 선택합니다.

3. 디플로이(instantiate)할 체인코드를 선택합니다.
당연히 설치된(installed) 체인코드를 선택해야겠죠?

4. 초기화 함수가 있다면 해당 함수명을 적습니다.
저는 초기화 함수를 별도로 작성하지 않았으므로 skip 하겠습니다(빈 공간으로 enter)

5. Private Data Collection을 사용한다면 Yes를 클릭하여 다음을 진행합니다.
저는 사용하지 않으므로 No를 선택하겠습니다.

5. VS Code 오른쪽 하단에 디플로이가 진행된다는 메세지창이 뜨며 완료되면 아래와 같이 complete 메세지가 보여집니다.


6. 디플로이(Instantiate)가 완료되면 Instantiated 목록에 체인코드가 추가됩니다.


7. 트랜젝션 콜(Invoke = Submit/Query = Evaluate)

모든 준비가 다 끝났습니다. 이제 저희가 만든 체인코드만 호출하면 됩니다.
먼저 데이타를 저장해보겠습니다(Submit Transaction = Invoke Transaction)

1. FABRIC GATEWAYS 패널에서 채널 선택 후 해당 채널에 디플로이된 체인코드를 선택합니다.
체인코드 위에서 마우스 오른쪽 버튼을 누른 후 Submit Transaction을 선택합니다.

2. 호출할 함수명을 적습니다. 저는 위에서 작성한 putData 함수를 호출할 겁니다.

3. 함수 호출에 필요한 파라미터를 적습니다.
putData 함수에는 argument로 key,value가 들어가므로
아래와 같이 순서대로 적습니다.


4. 앞서 설명한 것처럼 저희는 PDC를 사용하지 않으므로 생략합니다(optional)

5. 정상적으로 완료되면 아래와 같은 메세지가 출력됩니다.

저장된 데이타를 조회 해보겠습니다(Evaluate Transaction = Query Transaction)

6. 체인코드 위에서 마우스 오른쪽 버튼을 누른 후 Evaluate Transaction을 선택합니다.


7. 호출할 함수명을 적습니다. 저는 위에서 작성한 getData 함수를 호출할 겁니다.


8. 함수 호출에 필요한 파라미터를 적습니다.


9. 정상적으로 호출되면 Return된 value 값이 표시 됩니다.

8. 체인코드(SmartContract) 수정

체인코드를 수정하고 다시 배포해보겠습니다(Upgrade)
이전에 만들었던 chainncode.go 파일로 돌아와 아래와 같이 수정했습니다.
putData 함수 호출시 현재시간이 함께 저장되도록 했습니다(RegDate)


9. 체인코드(SmartContract) 패키지

이 전과 동일하게 체인코드 패키지(3번) 과정을 동일하게 거치면 SMART CONTRACT PACKAGES 패널에 아래와 같이 패키지된 체인코드가 추가됩니다.
저는 수정된 체인코드의 이름을 동일하게 ibp-cc라고 했습니다. 버전은 2번으로 했구요.


10. local Fabric에 체인코드 설치(install)

이 전과 동일하게 체인코드 설치(5번) 과정을 거치면 LOCAL FABRIC OPS 패널에 설치(install)된 체인코드가 추가됩니다.


11. local Fabric에 체인코드 배포(upgrade)

1. 체인코드를 업그레이드 하는건 패널에 바로 노출되어 있지 않습니다.
이전에 디플로이(instantiate)된 체인코드를 선택하고 마우스 오른쪽 버튼을 클릭하여 Upgrade Smart Contract 메뉴를 클릭합니다.


2. 이 후 과정은 instantiate와 동일합니다. 설치된 체인코드 중 하나를 선택합니다.
저는 수정된 체인코드 패키지인 ibp-cc@2를 선택하겠습니다.

3. 업그레이드 된 체인코드가 FABRIC GATEWAY 패널에 보이는군요.
이제 수정된 체인코드를 호출해보겠습니다.

12. 트랜젝션 콜

1. Submit Transaction으로 putData 함수를 호출했습니다.

2. Evaluate Transaction으로 getData 함수를 호출했습니다.
수정된 버전의 체인코드가 정상적으로 실행된 것을 확인할 수 있습니다.

마치며…

IBM Blockchain Platform extension for VS Code – 체인코드 개발 효율성 높이기 편은 여기까지 입니다.

블록체인 비즈니스가 확장되면서 다수의 체인코드를 동시 다발적으로 개발하고 또 이를 관리하고 테스트하는 과정에 많은 시간과 노력이 필요합니다.
IBM Blockchain Platform for VS Code는 이러한 과정들의 효율성을 부여하는 좋은 옵션으로 작용할 수 있을 것 같네요.

다음 포스팅에서는 여기에서 만든 체인코드를 IBM Blockchain Platform(이하 IBP)에서 사용하는 방법과 IBP 2.0에 대해
포스팅 할 예정입니다. 다음에 또 만나요!

감사합니다.