hyperledger-fabric.readthedocs.io/en/release-2.2/test_network.html
공식문서의 test-network 파트 실습입니다.
1. 디렉터리 위치로 들어가기
cd fabric-samples/test-network
2. network.sh의 옵션 및 명령어 파악하기
아래는 up 과 createChannel 에서 사용할 수 있는 겁니다.
deployCC 에서 사용할 수 있는 옵션입니다.
예시입니다. 한번 살펴보시면 이해가 조금 더 쉬워지실 겁니다.
이 모든 옵션은 ./network.sh -h 으로 살펴볼 수 있기 때문에 암기하지 않으셔도 됩니다!
------약간의 사족-------
공식 문서
Every Fabric network also includes an ordering service. While peers validate transactions and add blocks of transactions to the blockchain ledger, they do not decide on the order of transactions or include them into new blocks. On a distributed network, peers may be running far away from each other and not have a common view of when a transaction was created. Coming to consensus on the order of transactions is a costly process that would create overhead for the peers.
패브릭 네트워크는 오더링 서비스를 제공합니다. 하지만 피어가 트랜잭션의 순서나 새로운 블록으로 포함시키는 건 아닙니다. 부산 네트워크에서 피어들은 각자 돌아갑니다. 합의는 피어의 오버헤드를 이끌어낼 것입니다.
그럼 누가 정렬을 하나? 그건 ordering nodes, 즉 오더러(orderer)입니다. 오더러는 클라이언트로 부터 endorsed 트랜잭션을 받은 후 합의 알고리즘을 통해 트랜잭션의 순서를 정하고 그것을 블록에 추가합니다. 이 블록은 피어 노드들에게 전달되고 각 블록체인 원장에 블록을 추가 하게 됩니다.
3. 테스트 네트워크 가져오기
test-network 디렉토리 내에서 ./network down 을 통해 혹시 네트워크가 열려있었거나 돌아가는 컨테이너들을 하는 것을을 닫아줍니다.
./network up
test network 의 구성은 2개의 피어, 하나의 오더러, 하나의 클라이어트입니다.
docker ps -a 명령어로 컨테이너를 확인할 수 있습니다.
docker 명령어도 파악을 해두셔야 하는데 ps 는 실행하는 컨테이너 목록을 보여주고 -a 옵션은 종료되었던 컨테이너 목록까지 확인할 수 있습니다.
4. 채널 생성하기
Channels are a private layer of communication between specific network members.
채널은 조직과 조직 간의 연결 입니다. 이는 제네시스 블록에 권한이 저장되어 있는데 이로 권한 판단을 합니다.
저희는 두 개의 조직 org1, org2 를 가지고 있습니다.
이제 network.sh 를 통해 채널을 org1, org2 사이에 채널을 만들고 그들의 피어를 채널에 join 시킬 겁니다.
./network.sh createChannel
defalut 채널명은 myChannel 입니다. -c 옵션을 추어 변경 가능합니다.
채널2도 참여가 되고 각 조직에 앵커 피어들이 설치가 됩니다.
5. 채널에서 체인코드 시작하기
하이퍼레저 패브릭에서 스마트 컨트랙트는 '체인코드'라고 불립다. 이를 통해 채널의 원장과 상호작용할 수가 있습니다.
./network.sh deployCC -ccn basic -ccp ../asset-transfer-basic/chaincode-go -ccl go
이름은 basic 위치는 ../asset-transfer-basic/chaincode-go 언어는 go 로 한다는 의미입니다.
체인코드를 설치할 때 각 채널의 맴버들에 동의가 필요합니다. 필요한 수 만큼의 동의를 얻었을 때에 체인 코드의 정의가 채널에 커밋됩니다.
다음과 같이 합의를 걸칩니다.
6. 네트워크와 상호작용하기
피어의 CLI(Command Line Interface)를 통하여 네트워크와 상호작용할 수 있습니다.
CLI 를 통해 invoke(원장 업데이트 가능), 채널 업데이트/설치, 그리고 새로운 스마트 컨트랙트도 구현할 수 있습니다.
일단 PATH 추가를 더 해야합니다.
그전에 yaml 파일에 대해 모르시는 분들도 있으실 거 같아 간단히 설명하자면, xml과 json 과 같이 데이터 포맷 형식입니다. yyyy-mm-dd 로 표현하냐 yyyy.mm.dd로 표현하냐를 정의해놓은 파일인데 yaml 은 xml과 json보다 가독성이 좋은 형식입니다. 아래 비교 사진을 통해 파악할 수 있습니다.
그럼 tset-network 디렉토리에 있는 걸 확인하고 다음을 입력해줍니다. (환경설정 때 했는데 하지 않으신 분들은 해주세요)
export PATH=${PWD}/../bin:$PATH
아래도 설정해줍니다.
export FABRIC_CFG_PATH=$PWD/../config/
이 후 아래 명령어들을 통해서 org1 에 peer CLI의 설정을 할 수 있습니다.
# Environment variables for Org1 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
test-network 안에 organizations 폴더를 확인하시면 됩니다.
이제 아래의 명령어를 통해서 원장을 초기화 할 수 있습니다.
peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n basic --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":"InitLedger","Args":[]}'
만약 성공하면 다음과 같이 출력이 됩니다.
-> INFO 001 Chaincode invoke successful. result: status:200
이제 원장에 쿼리를 날릴 수도 있습니다.
모든 Assets을 가져오는 것이라고 직관적으로 이해할 수 있습니다.
peer chaincode query -C mychannel -n basic -c '{"Args":["GetAllAssets"]}'
만약 성공하면 다음과 같이 출력이 됩니다.
[ {"ID": "asset1", "color": "blue", "size": 5, "owner": "Tomoko", "appraisedValue": 300},
{"ID": "asset2", "color": "red", "size": 5, "owner": "Brad", "appraisedValue": 400},
{"ID": "asset3", "color": "green", "size": 10, "owner": "Jin Soo", "appraisedValue": 500},
{"ID": "asset4", "color": "yellow", "size": 10, "owner": "Max", "appraisedValue": 600},
{"ID": "asset5", "color": "black", "size": 15, "owner": "Adriana", "appraisedValue": 700},
{"ID": "asset6", "color": "white", "size": 15, "owner": "Michel", "appraisedValue": 800} ]
에셋(자산) 들의 색깔, 사이즈,소유자, 평가된 가치가 출력이 됩니다.
Query 와 Invoke 의 차이는 원장의 변경 가능 여부 입니다. 간단히 Read/Write라고 생각할 수 있습니다.
이제는 원장을 변경하는 Invoke 를 날려보겠습니다.
peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n basic --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":"TransferAsset","Args":["asset6","Christopher"]}'
이 명령어 후 다시 GetAllAsset을 치면 다음과 같이 asset6 의 소유자가 Christopher로 변한 것을 확인할 수 있습니다.
조직 2에서 이 에셋을 확인을 해보겠습니다. 채널로 엮었으니 같은 원장이 보여야하겠죠?
조직 1과 동일하게 환경 설정을 해줍니다.
# Environment variables for Org2
export CORE_PEER_TLS_ENABLED=true export CORE_PEER_LOCALMSPID="Org2MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt
export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp
export CORE_PEER_ADDRESS=localhost:9051
이제 조직 2에 쿼리를 날릴 수 있습니다.
peer chaincode query -C mychannel -n basic -c '{"Args":["ReadAsset","asset6"]}'
다음과 같은 동일한 결과를 확인할 수 있습니다.
{"ID":"asset6","color":"white","size":15,"owner":"Christopher","appraisedValue":800}
7. 네트워크 닫기
이제 테스트 네트워크를 닫아보겠습니다.
이 때 노드와 체인코드 컨테이너는 먹추고 조직읜 암호화 부분이 삭제되고 도커로 부터 체인코드의 이미지가 삭제 됩니다.
도커나 채널들을 정리해줘서 다음 ./network.sh up 이 돌아갈 수 있는 환경을 만들어 줍니다.
./network.sh down
이제 하이퍼레저 패브릭을 구현한 테스트 네트워크를 로컬 환경에 갖게 되었습니다!
이를 통해 하이퍼레저 패브릭 v2.2 테스트 네트워크 사용을 끝내겠습니다!
궁금하신 점이나 제가 틀린 점은 댓글로 남겨주시면 정말 감사하겠습니다.
'블록체인' 카테고리의 다른 글
Chainlink API (0) | 2021.05.23 |
---|---|
Chainlink 기초 (0) | 2021.05.23 |
신뢰체인 분석 - 화이트 페이퍼를 통해 (0) | 2021.05.10 |
오라클(Oracle)이란 (0) | 2021.05.07 |
VMware 하이퍼레저 패브릭 v2.2 환경 구축하기 (0) | 2021.01.27 |