공부 기록

하이퍼레저 패브릭 - 3: 채널에 스마트 계약 배포하기 - 2

by 너나나

모든 건 공식문서를 따라간다!!!!!!!!

https://guiyum.tistory.com/115

 

하이퍼레저 패브릭 - 3: 채널에 스마트 계약 배포하기 - 1

모든 건 공식문서를 따라간다!!!!!!!! https://guiyum.tistory.com/114 하이퍼레저 패브릭 실습 - 2: test network 모든 건 공식문서를 따라간다!!!! 공식문서와 같이 보는것을 추천!!!! 환경 설정은 https://gui..

guiyum.tistory.com

 

4. 채널에 체인코드 정의 커밋

체인코드 정의를 충분한 숫자의 조직이 승인한 후에, 한 조직이 채널에 체인코드 정의를 커밋할 수 있다. 과반수의 채널 멤버들이 정의를 승인하면 커밋 트랜잭션이 성공하고 체인코드 정의에서 동의한 parameter가 채널에서 구현된다.

채널 멤버가 같은 체인코드 정의를 승인했는지 체크하기 위해 peer lifecycle chaincode checkcommitreadiness 명령을 사용할 수 있다. checkcommitreadiness 명령에 사용되는 플래그는 조직의 체인코드를 승인하는 데 사용되는 플래그와 동일하지만 --package-id 플래그는 포함하지 않아도 된다.

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

이 명령은 채널 구성원이 checkcommitreadiness 명령에 지정된 parameter을 승인했는지 표시하는 JSON 맵을 보여준다.

{
        "approvals": {
                "Org1MSP": true,
                "Org2MSP": true
        }
}

채널의 멤버인 두 조직이 같은 파라미터를 승인했기때문에 체인코드 정의를 채널에 커밋할 준비가 됐다. 

채널에 체인코드 정의를 커밋하는데 peer lifecycle chaincode commit 명령을 사용할 수 있다. commit 명령도 조직 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"

위의 트랜잭션은 --peerAddresses 플래그를 사용하여 Org1의 peer0.org1.example.com과 Org2의 peer0.org2.example.com을 타겟으로 지정한다. commit transaction은 피어를 운영하는 조직에서 승인한 체인코드 정의를 쿼리하기 위해 채널에 가입한 피어에게 제출된다. 이 명령은 체인코드 배포 정책을 충족하기 위해 충분한 수의 조직에서 피어를 대상으로 해야 한다. 승인은 각 내에서 배포되기 때문에 채널의 멤버에 속한 아무 피어를 대상으로 지정할 수 있다.

 

채널 멤버에게 보증된 체인코드 정의는 블록에 추가되고 채널에 배포되기 위해 오더링 서비스에 제출된다. 채널의 피어들은 체인코드 정의를 충분한 수의 조직이 승인하였는지 확인한다. peer lifecycle chaincode commit 명령은 응답을 반환하기 전에 피어의 확인을 기다린다.

 

체인코드 정의가 채널에 커밋되었는지를 확인하기 위해 peer lifecycle chaincode querycommitted 명령을 사용할 수 있다.

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"

체인코드가 채널에 성공적으로 커밋됐다면 querycommitted 명령은 아래처럼 sequence와 체인코드 정의의 version을 리턴한다.

Committed chaincode definition for chaincode 'basic' on channel 'mychannel':
Version: 1.0, Sequence: 1, Endorsement Plugin: escc, Validation Plugin: vscc, Approvals: [Org1MSP: true, Org2MSP: true]

 

체인코드 호출

체인코드 정의를 채널에 커밋한 후에 체인코드는 체인코드가 설치된 채널에 조인한 피어에서 시작된다. asset-transfer (basic) 체인코드는 이제 클라이언트 애플리케이션에서 호출될 준비가 됐다. 아래 명령을 사용하여 원장에 초기 에셋을 생성한다. 호출 명령은 체인코드 보증 정책을 충족시키기 위해 충분한 숫자의 피어를 대상으로 해야 한다. (CLI는 Fabric Gateway peer에 접근하지 않으므로 각 보증 피어를 지정해야 한다.)

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":[]}'

명령이 성공했다면 아래와 비슷한 응답을 볼 수 있다!!

chaincodeInvokeOrQuery -> Chaincode invoke successful. result: status:200

쿼리 기능을 사용하여 체인코드에 의해 생성된 자동차 세트를 읽어보자!!

peer chaincode query -C mychannel -n basic -c '{"Args":["GetAllAssets"]}'

 

스마트 계약 업그레이드

동일한 Fabric chaincode lifecycle process를 사용해 이미 채널에 배포된 체인코드를 업그레이드할 수 있다. 채널 멤버들은 새로운 체인코드 패키지를 설치한 다음 새로운 패키지 ID와 새로운 체인코드 버전, 그리고 1 증가된 sequence number로 체인코드 정의를 승인하여 체인코드를 업그레이드할 수 있다. 새로운 체인코드는 체인코드 정의가 채널에 커밋된 후에 사용될 수 있다. 이 과정을 통해 채널 구성원은 체인코드가 업그레이드될 때 조정하고 채널에 배포하기 전에 충분한 수의 채널 멤버가 새 체인코드를 사용할 준비가 되었는지 확인할 수 있다.

이 업그레이드 과정을 사용해 체인코드 보증 정책을 바꿀 수도 있다. 새로운 보증 정책으로 체인코드 정의를 승인하고 채널에 체인코드 정의를 승인함으로써 채널 멤버는 새 체인코드 패키지를 설치하지 않고도 체인코드를 관리하는 보증 정책을 수정할 수 있다.

방금 배포한 asset-transfer (basic) 체인코드를 업그레이드하는 시나리오를 제공하기 위해 Org1과 Org2가 다른 언어로 작성된 체인코드 버전을 설치하려 한다고 가정해 보자. 얘네들은 체인코드 버전을 업데이트하기 위해 Fabric chaincode lifecycle 사용하고 새 체인코드가 채널에 활성화되기 전에 두 조직이 새 체인코드를 설치했는지 확인한다.

처음에 Org1과 Org2이 asset-transfer 체인코드의 Go 버전으로 설치했지만 JS로 작성된 체인코드로 작업하는 것이 더 편하다고 가정해보자!!이런 경우 자바스크립트로 작성한 체인코드 패키징 단계에 따라 새 체인코드 바이너리로 설치할 수 있다.

 

test-network 디렉토리에서 아래 명령을 실행하여 체인코드 디팬던시를 설치하자!

cd ../asset-transfer-basic/chaincode-javascript
npm install
cd ../../test-network

아래 명령으로 자바스크립트 체인코드를 패키징할 수 있다. 터미널을 닫은 경우 피어 CLI를 다시 사용하는데 필요한 환경 변수를 설정한다.

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 admin으로 피어 CLI를 작동하기 위해 변수를 지정한다.

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 lifecycle chaincode install basic_2.tar.gz

새 체인코드 패키지는 새 패키지 ID를 생성한다. 피어를 쿼리하여 새 패키지 ID를 찾을 수 있다.

peer lifecycle chaincode queryinstalled
Installed chaincodes on peer:
Package ID: basic_1.0:dee2d612e15f5059478b9048fa4b3c9f792096554841d642b9b59099fa0e04a4, Label: basic_1.0
Package ID: basic_2.0:59043455ebdea5026e9b934b4b50f0ab9938d7f4998acdc13a2aa43346814ff9, Label: basic_2.0

패키지 라벨을 사용하여 새 체인코드 패키지 ID를 찾을 수 있고 새 환경변수로 저장할 수 있다. 위에서 찾은 패키지ID를 넣으면 된다!

export NEW_CC_PACKAGE_ID=basic_2.0:59043455ebdea5026e9b934b4b50f0ab9938d7f4998acdc13a2aa43346814ff9

새 체인코드 정의는 자바스크립트 체인코드 패키지의 패키지 ID를 사용하고 체인코드 버전을 업데이트한다. sequence parameter는 Fabric chaincode lifecycle에서 체인코드 업그레이드를 추적하는 데 사용되기 때문에 Org1도 sequence number을 1에서 2로 증가시켜야 한다. 채널에 마지막으로 커밋된 체인코드의 sequence를 찾기 위해 peer lifecycle chaincode querycommitted를 사용할 수 있다.

체인코드를 업그레이드하기 위해 체인코드 패키지를 설치하고 체인코드 정의를 Org2로 승인해야 한다. 피어 CLI를 Org2 admin으로 실행하기 위해 변수를 변경한다.

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_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

다음 명령을 실행하여 Org2 피어에 새 체인코드 패키지를 설치하자.

peer lifecycle chaincode install basic_2.tar.gz

Org2에 대한 새 체인코드 정의를 승인할 수 있다.

 

sequnce 2의 체인코드 정의가 채널에 커밋될 준비가 됐는지 확인하기 위해 peer lifecycle chaincode checkcommitreadiness 명령을 사용한다.

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
{
        "approvals": {
                "Org1MSP": false,
                "Org2MSP": true
        }
}

읭 이렇게 떴다!!! 이러면 Org1은 체인코드 정의를 승인하지 않은 거니까 다시 Org1 admin으로 피어 CLI를 실행하기 위해 변수를 바꿔주고 체인코드 정의를 승인했다!! (위에 Org1 과정 다시 하면 된다!!)

{
        "approvals": {
                "Org1MSP": true,
                "Org2MSP": true
        }
}

다시 Org2 admin으로 변수 바꿔주고!!!

새 체인코드 정의가 커밋된 후 채널에서 체인코드가 업그레이드된다. 그때까지 이전 체인코드는 두 조직의 피어에서 계속 실행된다. Org2는 다음 명령을 사용하여 체인코드를 업그레이드 할 수 있다!!

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"

커밋 트랜잭션이 성공하면 바로 새 체인코드를 시작한다. 체인코드 정의가 보증 정책을 변경하면 새 정책이 시행된다. docker ps 명령을 통해 피어에서 새 체인코드가 시작하는지 확인할 수 있다!

--init-required 플래그를 사용한 경우 업그레이드된 체인코드를 사용하기 전에 init 함수를 호출해야 한다. 해당 플래그를 사용하지 않았으므로 init 함수 호출 없이 새 자동차를 만들어 자바스크립트 체인코드를 테스트할 수 있다.

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":"CreateAsset","Args":["asset8","blue","16","Kelley","750"]}'

원장에 모든 차를 쿼리하여 새 차를 보자

peer chaincode query -C mychannel -n basic -c '{"Args":["GetAllAssets"]}'
[
    {"AppraisedValue":300,"Color":"blue","ID":"asset1","Owner":"Tomoko","Size":5},
    {"AppraisedValue":400,"Color":"red","ID":"asset2","Owner":"Brad","Size":5},
    {"AppraisedValue":500,"Color":"green","ID":"asset3","Owner":"Jin Soo","Size":10},
    {"AppraisedValue":600,"Color":"yellow","ID":"asset4","Owner":"Max","Size":10},
    {"AppraisedValue":700,"Color":"black","ID":"asset5","Owner":"Adriana","Size":15},
    {"AppraisedValue":800,"Color":"white","ID":"asset6","Owner":"Michel","Size":15},
    {"AppraisedValue":"750","Color":"blue","ID":"asset8","Owner":"Kelley","Size":"16"}
]

추가한 새 자동차(asset8)를 볼 수 있다!!

 

마무리

체인코드 사용을 마치면 다음 명령을 사용하여 Logspout toll을 지울 수 있다.

docker stop logspout
docker rm logspout

test-network에서 다음 명령을 실행하여 테스트 네트워크를 종료하자!!

./network.sh down

참고 자료

https://hyperledger-fabric.readthedocs.io/en/latest/deploy_chaincode.html

 

Deploying a smart contract to a channel — hyperledger-fabricdocs main documentation

End users interact with the blockchain ledger by invoking smart contracts. In Hyperledger Fabric, smart contracts are deployed in packages referred to as chaincode. Organizations that want to validate transactions or query the ledger need to install a chai

hyperledger-fabric.readthedocs.io

 

블로그의 정보

공부 기록

너나나

활동하기