본문 바로가기

프로그래밍/블록체인

Hyperledger Fabric v2.0 samples 실행하기(2)


Fabcar Sample 실행하기

Hyperledger Fabric v2.0을 기준으로 작성되었음을 알려드립니다. 버전이 맞지 않으면 오류가 날 수 있으니 여기를 보고 v2.0을 설치해주기 바랍니다.

Fabric test network

Fabric은 orderer와 peer 노드로 구분되어 있습니다. 허가형 블록체인인 Fabric은 orderer 노드에서 합의 알고리즘을 수행해 transaction을 바탕으로 블록을 생성하고 추가합니다. peer 노드는 chaincode를 사용하여 channel을 통해 ledger에 등록하기 위한 데이터를 orderer 노드에게 보내게 됩니다. Fabric test network를 이용해서 네트워크를 구성하고 채널을 만들며 체인코드를 수행할 수 있습니다.

자, 이제 test network를 사용해 볼까요?

앞서 설치한 Fabric의 Samples directory로 이동합니다. test-network/ 안에 network.sh 파일이 존재할 것입니다. 도움말을 보기 위해선 test-network/에서 아래의 명령을 수행합니다.

./network.sh -h

테스트 노드 생성하기

그렇다면 우선 기본적으로 설정되어 있는 1개의 orderer 노드와 2개의 peer 노드를 아래의 명령어를 통해 만들어 봅시다. 정상적으로 실행되었다면 docker container 3개가 실행되는 것을 보실 수 있습니다. docker ps -a를 통해서도 확인 가능합니다.

이전에 Fabric docker image를 수행한 적이 있다면 ./network.sh down을 수행하고 하시길 바랍니다.

./network.sh up

실제 Fabric을 이용해서 프로젝트를 진행하게 되면 ordering 노드가 여러개가 될 수 있으며 ordering 노드들은 Raft 합의 알고리즘을 사용하여 block을 생성하고 블록체인을 하나의 체인만을 유지합니다.

채널 생성하기

다음으로 예제에서 이용할 채널을 생성해야합니다. 채널의 default 이름은 mychannel이며 -c을 주어서 이름을 지정할 수 있습니다.

# mychannel 생성
./network.sh createChannel

# 이름 지정 채널 생성
./network.sh createChannel -c channelname

명령어 두개를 사용함으로써 위의 테스트 노드와 채널을 동시에 생성할 수 있습니다.

./network.sh up createChannel

채널에서 돌아갈 chaincode 실행하기

peer 노드에서 chaincode를 실행을 하기위해선 앞서 up 명령으로 실행중인 docker container peer0.org1.example.com, peer0.org2.example.com안에 fabcar chaincode를 설치해야합니다. 아래의 명령어를 수행해봅시다.

-l chaincode_language을 주지 않으면 default로 Go로 작성된 fabcar chaincode가 설치 됩니다. chaincode_languagego, javascript, java가 가능합니다. 저는 javascript를 사용하겠습니다.

# go의 fabcar chaincode 설치
./network.sh deployCC

# javascript의 fabcar chaincode 설치
./network.sh deployCC -l javascript

# channel 지정 시
./network.sh deployCC -c channelname -l chaincode_language

이제 Fabric의 test-network에 fabcar.tar.gz가 생긴것을 볼 수 있습니다. ./network.sh deployCC를 하게 되면 내부적으론 test-network/scripts/deployCC.sh를 수행합니다. chaincode를 fabcar.tar.gz를 package 작업 후 peer 노드에 설치하게 됩니다.

peer 노드에 체인코드를 실행시켜 보기 위해선 앞서 Fabric Binary를 설치한 디렉토리에 /bin에 있는 peer CLI/config에 있는 core.yaml 필요합니다. 아래의 명령어를 수행하여 환경 변수를 추가합니다.

# test-nertwork 디렉토리에서 실행

# peer
export PATH=${PWD}/../bin:${PWD}:$PATH
# core.yaml
export FABRIC_CFG_PATH=$PWD/../config/

첫 번째 peer인 org1.example.com의 체인코드를 수행하려면 추가적인 환경변수가 필요합니다. ./network.sh deployCC로 실행하면 아래의 환경변수를 추가해주고 실행하여 정상적으로 동작하지만 따로 실행하려면 아래의 환경 변수가 없다면 실행되지 않을 수 있습니다.

export CORE_PEER_TLS_ENABLED=true
export CORE_PEER_LOCALMSPID="Org1MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
export CORE_PEER_ADDRESS=localhost:7051

이제 잘 되는지 전체 데이터를 가져오도록 아래의 명령어를 실행합니다. ./network.sh deployCC의 수행 결과에서 데이터를 출력하는 부분과 같다면 성공적입니다.

# 전체 데이터 가져오기
peer chaincode query -C mychannel -n fabcar -c '{"Args":["queryAllCars"]}'

이제 데이터를 변경해볼까요? 아래의 명령어를 수행하고 Chaincode invoke successful. result: status:200라는 내용이 있다면 성공한 것 입니다. 전체 데이터를 가져온 명령어를 다시 수행해서 CAR9Dave로 변경된 것을 확인하시면 됩니다.

# chaincode로 데이터에 invoke하기
peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls true --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n fabcar --peerAddresses localhost:7051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses localhost:9051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt -c '{"function":"changeCarOwner","Args":["CAR9","Dave"]}'

이것으로 Hyperledger Fabric v2.0 Sample Fabcar를 실행했습니다. 좀 더 자세한 내용을 알고 싶다면 Hyperledger Fabric Docs에서 확인해주세요. 다음에는 Fabcar가 아닌 나만의 Fabric Application을 만들어 보도록 하겠습니다.