Hyperledger Fabric에 대해 알아 보았따. 이제 직접 개발 환경은 올려보자.
개발을 위한 환경
- docker
- go
- virtualBox
Docker VM환경 생성
물론 default환경을 사용해도 좋지만 나중에 여러개의 node를 올려보기 위해서 미리 분리를 하도록 하자.
1
|
$ docker-machine create --driver virtualbox blockchain
|
다음으로 생성된 VM의 환경변수를 확인하자
1
|
$ docker-machine env blockchain
|
이 환경을 그대로 적용 시키자
1
|
$ eval $(docker-machine env blockchain)
|
잘 적용되었는지 확인하려면 ps나 images 명령을 날려보자.
1
2
3
|
$ docker ps
or
$ docker images
|
docker machine을 만들기 전과 결과가 다르다면 성공이다.
Hyperledger Fabric Docker image받기
1
2
3
|
docker pull hyperledger/fabric-baseimage:x86_64-0.2.2
docker pull hyperledger/fabric-membersrvc:x86_64-0.6.1-preview
docker pull hyperledger/fabric-peer:x86_64-0.6.1-preview
|
baseimage의 경우 TAG를 latest로 해야한다.
1
|
docker tag hyperledger/fabric-baseimage:x86_64-0.2.2 hyperledger/fabric-baseimgae:latest
|
이제 image들을 받았으니 docker-compose 파일을 하나 작성하자.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
membersrvc:
image: hyperledger/fabric-membersrvc:x86_64-0.6.1-preview
ports:
- "7054:7054"
command: membersrvc
vp0:
image: hyperledger/fabric-peer:x86_64-0.6.1-preview
ports:
- "7050:7050"
- "7051:7051"
- "7053:7053"
environment:
- CORE_PEER_ADDRESSAUTODETECT=true
- 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 --peer-chaincodedev"
|
에러 없이 정상 작동하면 Blockchain server가 실행된 것이다.
Fabric 소스 준비
chaincode는 go로 되어있는 example을 이용하자.
1
2
3
4
5
|
$ mkdir -p $GOPATH/src/github.com/hyperledger
$ cd $GOPATH/src/github.com/hyperledger
$ git clone https://github.com/hyperledger/fabric.git
$ cd fabric
$ git checkout v0.6.1-preview
|
chaincode 빌드 및 실행
소스를 받았으면 빌드를 한다.
1
2
|
$ cd $GOPATH/src/github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02
$ go build
|
build되었으면 chaincode_example02
라는 실행파일이 생성되어 있을 것이다.
개발모드 vs 운영모드
개발모드에서는 chaincode가 blockchain 런타임과 별도의 프로세스로 실행된다.
운영모드에서는 chaincode를 deploy하면 blockchain network에 있는 모든 peer들에게 복제가 되고 모든 peer들이 동일한 chaincode로 동작한다. 개발모드는 단일 peer에 chaincode가 붙어서 동작한다.
이제 실제로 블록체인 런타임에 chaincode를 실행하자.
이전에 생성했던 docker-compose.yaml파일을 실행한다.
chaincode 실행 전 docker VM의 IP를 확인한다.
URL에 tcp://192.168.99.100:2376
이라고 (아마 다를 수도 있습니다) 나올 텐데 이를 CORE_PEER_ADDRESS에 넣고 실행시키면된다.
1
2
|
$ cd $GOPATH/src/github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02
$ CORE_CHAINCODE_ID_NAME=mycc CORE_PEER_ADDRESS=192.168.99.100:7051 ./chaincode_example02
|
요런식으로.
테스트
REST API를 통해 테스트 해보자.
사용자 등록 및 로그인
먼저 사용자 등록 및 로그인을 해보자. ID, PW는 사전에 정의 되어 있어서 동일 하게 테스트 한다.
1
2
3
4
5
6
|
POST /registrar
{
"enrollId": "admin",
"enrollSecret": "Xurw3yU9zI0l"
}
|
response로
1
2
3
|
{
"OK": "Login successful for user 'admin'."
}
|
이라고 응답이 오면 성공한 것이다.
chaincode deploy
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
POST /chaincode
{
"jsonrpc": "2.0",
"method": "deploy",
"params": {
"type": 1,
"chaincodeID":{
"name": "mycc"
},
"ctorMsg": {
"args":["init", "a", "100", "b", "200"]
},
"secureContext": "admin"
},
"id": 1
}
|
이에 대한 response는
1
2
3
4
5
6
7
8
|
{
"jsonrpc": "2.0",
"result": {
"status": "OK",
message": "mycc"
},
"id": 1
}
|
이렇게 돌아오면 성공적이다.
만약 개발 모드에서 chaincode를 수정했을시 코드 빌드 -> chaincode 실행 -> 로그인 API호출 -> chaincode deploy 호출 단계로 진행해야 기본 환경 준비가 된다.
Invoke
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
POST /chaincode
{
"jsonrpc": "2.0",
"method": "invoke",
"params": {
"type": 1,
"chaincodeID":{
"name":"mycc"
},
"ctorMsg": {
"args":["invoke", "a", "b", "10"]
},
"secureContext": "admin"
},
"id": 3
}
|
response
1
2
3
4
5
6
7
8
|
{
"jsonrpc": "2.0",
"result": {
"status": "OK",
"message": "~~~~"
},
"id": 3
}
|
Query
invoke가 정상적으로 호출 되었다면 Query로 값을 확인하자.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
POST /chaincode
{
"jsonrpc": "2.0",
"method": "query",
"params": {
"type": 1,
"chaincodeID":{
"name":"mycc"
},
"ctorMsg": {
"args":["query", "a"]
},
"secureContext": "admin"
},
"id": 5
}
|
response
1
2
3
4
5
6
7
8
|
{
"jsonrpc": "2.0",
"result": {
"status": "OK",
"message": "~~~"
},
"id": 3
}
|
참고 - IBM Developer Blog