[사전준비사항]
1. node, npm, go, docker, docker-compose 요소가 필요함
2. https://github.com/hyperledger/fabric-samples/tree/main (패브릭 샘플파일 다운로드)
3. 바이너리 파일 다운로드
curl -sSL https://bit.ly/2ysbOFE | bash -s -- 2.2.2 1.4.9
위 바이너리 파일을 다운로드 받으면, 이미지가 다음과 같이 생성됨.
4. docker file 수정하기 ** 매우중요.
a. core.yaml 파일에서, vm_docker_hostConfig_NetworkMode부분을 다음과 같이 이름을 준다. (뭐든 상관없음 맞추면됨)
b. docker-compose-test.yaml파일에서도 이름을 맞추어 설정한다.
단, 여기서는 peer0.org1.example.com 과, 다른 한 피어까지 총 두가지 모두 이름을 수정했다. (첫번째 것만 수정해도 작동함.)
[Bring up the test network]
1. Test Network 가져오기.
2. cd fabric-samples / test-network 디렉토리로 이동, ls명령어로 network.sh파일 확인.
아래처럼 network.sh파일이 있으면 성공!
3. 도움말을 보려면, 아래 명령어로 확인이 가능하다.
./network.sh -h
4. 피어 둘 + 1명의 오더러 노드 + 패브릭 네트워크 생성
./network.sh down #사전준비를 위해 혹시라도 실행되고 있는 컨테이너나 아티팩트를 모두 제거.
./network.sh up #패브릭 오더러, 피어노드를 생성한다. (채널은 생성되지 않음)
[채널생성하기]
이로써 우리는 피어둘 (Org1, Org2)를 생성했으며, Oderer를 생성했다.
Organization은 조직이며 그 안에서 각 영역별로 Channel로 구분지을 수 있다.
지금부터는 채널을 생성한다.
1. "mychannel" 디폴트 이름으로, 채널을 생성한다.
./network.sh createChannel
2. 이번에는 Custom 이름을 준, "channel1"으로 채널을 생성한다.
./network.sh createChannel -c channel1
3. 이번에는 Custom 이름으로 "channel2"으로 채널을 생성한다.
./network.sh createChannel -c channel2
[체인코드 채널에 배포하기]
1. 바로 상위 디렉토리의 fabric-samples/asset-transfer-basic/chaincode-go 에 있는 체인코드 파일을 채널에 배포해보자.
./network.sh deployCC -ccn basic -ccp ../asset-transfer-basic/chaincode-go -ccl go
deployCC옵션은 asset-transfer(basic) 체인코드를 peer0.org1.example.com과, peer0.org2.example.com에 디팬던시와 함꼐 설치하고 배포한다.-l옵션을 추가해서 랭귀지를 바꿀 수 있다.(go, typescript, javascript 등).
[네트워크 간 상호작용]
peer CLI를 사용해 네트워크와 상호작용 할 수 있다.
배포된 체인코드 스마트컨트렉트를 invoke할 수 있으며, 채널을 업데이트 할 수 있고, 새로운 체인코드를 설치&배포 할 수 있다.
1. Path를 설정한다.
#test-network 디렉토리에서,
export PATH=${PWD}/../bin:$PATH
export FABRIC_CFG_PATH=$PWD/../config/
2. 환경변수 설정
#한 줄 씩 붙여 넣으시오.
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
3. 실행 ㄱㄱ
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":[]}'
*참고 : query & invoke 차이점은 read, write 차이.
4. 모든 지갑 불러오기
peer chaincode query -C mychannel -n basic -c '{"Args":["GetAllAssets"]}'
5. Organization2 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"]}'
6. Org2 CLI 설정
# 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
7. asset6의 지갑을 봅시다.
peer chaincode query -C mychannel -n basic -c '{"Args":["ReadAsset","asset6"]}'
[실습 종료]
네트워크를 내립니다.
./network.sh down