하이퍼레저 패브릭 - Deploying a smart contract to a channel

choko's avatar
Jun 29, 2024
하이퍼레저 패브릭 - Deploying a smart contract to a channel
 

Logspout - smart contract 로그 모니터링 도구(선택)

cd fabric-samples/test-network cp ../commercial-paper/organization/digibank/configuration/cli/monitordocker.sh . # if you're not sure where it is find . -name monitordocker.sh ./monitordocker.sh fabric_test
 
실행시 다음 로그가 출력됨
Starting monitoring on all containers on the network net_basic Unable to find image 'gliderlabs/logspout:latest' locally latest: Pulling from gliderlabs/logspout 4fe2ade4980c: Pull complete decca452f519: Pull complete ad60f6b6c009: Pull complete Digest: sha256:374e06b17b004bddc5445525796b5f7adb8234d64c5c5d663095fccafb6e4c26 Status: Downloaded newer image for gliderlabs/logspout:latest 1f99d130f15cf01706eda3e1f040496ec885036d485cb6bcc0da4a567ad84361 # 이 이후로 체인코드 배포 시 로그가 표시된다.
 
 

네트워크 시작 - Org1, Org2 두 개의 Org로 구성된 채널 생성

./network.sh up createChannel
 
체인코드 Deploying은 다음 4단계 절차로 이루어진다.
  1. 체인코드 패키징
  1. 피어에 체인코드 설치
  1. 조직의 체인코드 정의 승인
  1. 채널에 체인코드 정의 커밋
 

Step one: Package the smart contract

### 체인코드 패키징 ### cd fabric-samples/asset-transfer-basic/chaincode-go # 체인코드 벤더링 GO111MODULE=on go mod vendor # test-network 폴더로 이동 cd ../../test-network # FABRIC_CFG_PATH에는 configtx.yaml, core.yaml, orderer.yaml이 있다. export FABRIC_CFG_PATH=$PWD/../config/ # fabric config path 지정 # peer 바이너리로 체인코드 패키징 peer lifecycle chaincode package basic.tar.gz --path ../asset-transfer-basic/chaincode-go/ --lang golang --label basic_1.0 # basic.tar.gz 파일이 생성됨.

Step two: Install the chaincode package

### 패키징 후 Peer에 체인코드 설치 ### # 환경변수 지정 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 # peer 바이너리로 체인코드 설치 peer lifecycle chaincode install basic.tar.gz # 성공 로그 # #2020-07-16 10:09:57.534 CDT [cli.lifecycle.chaincode] submitInstallProposal -> INFO 001 Installed remotely: response:<status:200 payload:"\nJbasic_1.0:e2db7f693d4aa6156e652741d5606e9c5f0de9ebb88c5721cb8248c3aead8123\022\tbasic_1.0" > #2020-07-16 10:09:57.534 CDT [cli.lifecycle.chaincode] submitInstallProposal -> INFO 002 Chaincode code package identifier: basic_1.0:e2db7f693d4aa6156e652741d5606e9c5f0de9ebb88c5721cb8248c3aead8123 # 마찬가지로 Org2에도 체인코드를 설치한다. 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 peer lifecycle chaincode install basic.tar.gz
 

Step three: Approve a chaincode definition

패키지 설치 후, Org에 대한 체인코드 정의(name, version, policy 등이 포함)를 승인받아야 한다.
Org가 Peer에 체인코드를 설치한 경우, packageID가 포함되어야 한다. peer lifecycle chaincode queryinstalled 를 통해 패키지 ID를 찾을 수 있다.
peer lifecycle chaincode queryinstalled # 결과 : 밑 해시값을 저장해 둔다. Installed chaincodes on peer: Package ID: basic_1.0:69de748301770f6ef64b42aa6bb6cb291df20aa39542c3ef94008615704007f3, Label: basic_1.0 export CC_PACKAGE_ID=basic_1.0:69de748301770f6ef64b42aa6bb6cb291df20aa39542c3ef94008615704007f3 # 체인코드는 Org 레벨에서 승인 되므로, 다음 명령어는 peer 하나에만 적용시킨다. # 적용된 Peer은 Gossip 프로토콜에 의해 승인을 다른 Peer들에게 전달시킨다. peer lifecycle chaincode approveformyorg -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com \ --channelID mychannel --name basic --version 1.0 --package-id $CC_PACKAGE_ID --sequence 1 \ --tls --cafile "${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem" # $CC_PACKAGE_ID를 통해 체인코드 정의에 패키지 식별자를 포함한다. # Sequence는 체인코드가 정의되거나 업데이트된 횟수를 나타내는 정수다. # 위 명령어에는 없지만 --init-required를 이용해 Init 함수를 최초에 호출시킬수도 있다. # --signature-policy_, --channel-config-policy는 체인코드 보증 정책을 지정한다. ## 결과 로그 ## 2022-08-08 15:58:47.898 KST [chaincodeCmd] ClientWait -> INFO 001 txid [9cf85cbc269c8071b267f02dd8928b8e00b6374f6d623a06340901c2c047651a] committed with status (VALID) at localhost:9051 # 조직의 Admin이 다음 환경 변수를 설정한다. export CORE_PEER_LOCALMSPID="Org1MSP" export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt export CORE_PEER_ADDRESS=localhost:7051 # 이제 체인코드 정의를 Org1으로 승인할 수 있다. peer lifecycle chaincode approveformyorg -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com \ --channelID mychannel --name basic --version 1.0 --package-id $CC_PACKAGE_ID --sequence 1 --tls \ --cafile "${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem" ## 결과 로그 ## 2022-08-08 16:01:02.567 KST [chaincodeCmd] ClientWait -> INFO 001 txid [1bfb9563acfffefba41b99183a9b114dd5d732eca1f03fc4f90341b3a9075c14] committed with status (VALID) at localhost:7051

Step four: Committing the chaincode definition to the channel

# 채널 구성원들이 동일한 체인코드 정의를 승인했는지 확인 peer lifecycle chaincode checkcommitreadiness --channelID mychannel --name basic --version 1.0 --sequence 1 --tls --cafile "${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem" --output json ## 결과 로그 - 다음과 같이 조직이 정의를 승인해야 한다. ## { "approvals": { "Org1MSP": true, "Org2MSP": true } } #체인코드 커밋 - 조직 Admin이 제출해야 함. peer lifecycle chaincode commit -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --channelID mychannel --name basic --version 1.0 --sequence 1 --tls --cafile "${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem" --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" # 체인코드 정의가 채널에 commit됐는지 확인 peer lifecycle chaincode querycommitted --channelID mychannel --name basic --cafile "${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem"
 
 
 

체인코드 호출

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":[]}' # 결과 2020-02-12 18:22:20.576 EST [chaincodeCmd] chaincodeInvokeOrQuery -> INFO 001 Chaincode invoke successful. result: status:200 # 쿼리 peer chaincode query -C mychannel -n basic -c '{"Args":["GetAllAssets"]}'
 

체인코드 업그레이드

이미 채널에 배포된 체인코드를 업그레이드 할 수 있다.
→ 새 패키지 ID, 새 체인코드 버전, 1 증가된 sequence
cd ../asset-transfer-basic/chaincode-javascript npm install cd ../../test-network # 체인코드 패키징 export PATH=${PWD}/../bin:$PATH export FABRIC_CFG_PATH=$PWD/../config/ export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp peer lifecycle chaincode package basic_2.tar.gz --path ../asset-transfer-basic/chaincode-javascript/ --lang node --label basic_2.0 # Org1 env 설정 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 # Org1 Peer에 체인코드 설치 peer lifecycle chaincode install basic_2.tar.gz # 새 패키지 ID 찾기 -> NEW_CC_PACKAGE_ID로 저장 peer lifecycle chaincode queryinstalled export NEW_CC_PACKAGE_ID=basic_2.0:1d559f9fb3dd879601ee17047658c7e0c84eab732dca7c841102f20e42a9e7d4 # Org1에 새 체인코드 정의 승인 peer lifecycle chaincode approveformyorg -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --channelID mychannel --name basic --version 2.0 --package-id $NEW_CC_PACKAGE_ID --sequence 2 --tls --cafile "${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem" # Org2에도 동일한 작업 수행 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 peer lifecycle chaincode install basic_2.tar.gz peer lifecycle chaincode approveformyorg -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --channelID mychannel --name basic --version 2.0 --package-id $NEW_CC_PACKAGE_ID --sequence 2 --tls --cafile "${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem" # 업그레이드한 체인코드가 채널에 커밋할 준비가 되었는지 확인 peer lifecycle chaincode checkcommitreadiness --channelID mychannel --name basic --version 2.0 --sequence 2 --tls --cafile "${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem" --output json # 체인코드 커밋, 성공 시 새 체인코드가 즉시 시작됨. peer lifecycle chaincode commit -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --channelID mychannel --name basic --version 2.0 --sequence 2 --tls --cafile "${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem" --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" # 쿼리 실행 peer chaincode query -C mychannel -n basic -c '{"Args":["GetAllAssets"]}'
 
Share article

Tom의 TIL 정리방