하이퍼레저 패브릭 - Deploying a smart contract to a channel
Jun 29, 2024
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단계 절차로 이루어진다.
- 체인코드 패키징
- 피어에 체인코드 설치
- 조직의 체인코드 정의 승인
- 채널에 체인코드 정의 커밋
• 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