[BlockChain/Hyperledger Fabric] peer lifecycle chaincode

yujeongkwon·2023년 8월 8일
2

BlockChain

목록 보기
5/10

피어 수명 주기 체인코드

  • 체인코드를 패키징 -> 피어에 설치 -> 조직에 대한 체인코드 정의를 승인 -> 정의를 채널에 커밋
  • peer lifecycle chaincode 명령 Syntax
    • package
    • install
    • queryinstalled
    • getinstalledpackage
    • calculatepackageid
    • approveformyorg
    • queryapproved
    • checkcommitreadiness
    • commit
    • querycommitted
  • 명령어에 대한 자세한 내용 : peer lifecycle chaincode


사용 예

피어 수명 주기 체인코드 패키지 예제

  • peer lifecycle chaincode package 명령 : 피어에 설치 전, 먼저 (Go) 체인코드 패키징
    • --path 플래그 : 체인코드의 위치를 나타냄.
      • 경로는 정규화된 경로이거나 현재 작업 디렉터리에 상대적인 경로여야 함.
    • --label 플래그 : 조직에서 패키지를 식별하는 데 사용할 myccv1의 체인코드 패키지 레이블을 제공
      peer lifecycle chaincode package mycc.tar.gz --path $CHAINCODE_DIR --lang golang --label myccv1

피어 라이프사이클 체인코드 설치 예시

  • peer chaincode install 명령 : 체인코드가 패키징된 후 피어에 체인코드 설치
    • peer0.org1.example.com:7051(--peerAddresses에 정의된 피어인)에 mycc.tar.gz 패키지 설치
    peer lifecycle chaincode install mycc.tar.gz --peerAddresses peer0.org1.example.com:7051
  • 성공하면 패키지 식별자를 반환함.
    • 패키지 ID는 피어가 가져온 체인코드 패키지의 해시와 결합된 패키지 레이블
    2019-03-13 13:48:53.691 UTC [cli.lifecycle.chaincode] submitInstallProposal -> INFO 001 Installed remotely: response:<status:200 payload:"\nEmycc:ebd89878c2bbccf62f68c36072626359376aa83c36435a058d453e8dbfd894cc" >
    2019-03-13 13:48:53.691 UTC [cli.lifecycle.chaincode] submitInstallProposal -> INFO 002 Chaincode code package identifier: mycc:a7ca45a7cc85f1d89c905b775920361ed089a364e12a9b6d55ba75c965ddd6a9

피어 수명 주기 체인코드 queryinstalled 예

  • peer lifecycle chaincode queryinstalled : 설치한 체인코드의 패키지 ID를 찾기

    • 조직에 대한 체인코드 정의를 승인하려면, 체인코드 패키지 식별자를 사용해야 함.
    peer lifecycle chaincode queryinstalled --peerAddresses peer0.org1.example.com:7051
  • 성공하면 명령은 패키지 레이블과 연결된 패키지 ID를 반환

    Get installed chaincodes on peer:
    Package ID: myccv1:a7ca45a7cc85f1d89c905b775920361ed089a364e12a9b6d55ba75c965ddd6a9, Label: myccv1
  • --output 플래그 : CLI가 출력을 JSON으로 형식화

    peer lifecycle chaincode queryinstalled --peerAddresses peer0.org1.example.com:7051 --output json
  • 성공하면 명령은 JSON으로 설치한 체인코드를 반환

    {
      "installed_chaincodes": [
        {
          "package_id": "mycc_1:aab9981fa5649cfe25369fce7bb5086a69672a631e4f95c4af1b5198fe9f845b",
          "label": "mycc_1",
          "references": {
            "mychannel": {
              "chaincodes": [
                {
                  "name": "mycc",
                  "version": "1"
                }
              ]
            }
          }
        }
      ]
    }

피어 라이프사이클 체인코드 getinstalledpackage 예제

  • peer lifecycle chaincode getinstalledpackage : 피어에서 설치된 체인코드 패키지 검색
    • queryinstalled 에서 반환한 패키지 식별자를 사용
  • --package-id 플래그: 체인코드 패키지 식별자 전달
  • --output-directory 플래그 : 체인코드 패키지를 작성할 위치를 지정
    • 출력 디렉토리를 지정하지 않으면 체인코드 패키지가 현재 디렉토리에 작성됨.

peer lifecycle chaincode getinstalledpackage 
--package-id myccv1:a7ca45a7cc85f1d89c905b775920361ed089a364e12a9b6d55ba75c965ddd6a9 
--output-directory /tmp --peerAddresses peer0.org1.example.com:7051

피어 수명 주기 체인코드 calculatepackageid 예

  • peer lifecycle chaincode calculatepackageid : 피어에 체인코드를 설치하지 않고 패키지된 체인코드에서 패키지 ID 계산

    • 동일한 레이블 이름을 가진 체인코드 패키지가 여러 개 설치된 경우, 나중에 어떤 ID가 어떤 패키지에 해당하는지 식별 가능
    • 해당 패키지를 설치하지 않고 특정 체인코드 패키지가 설치되어 있는지 여부를 확인 가능
  • mycc.tar.gz. 패키지 의 패키지 ID를 계산

    peer lifecycle chaincode calculatepackageid mycc.tar.gz
  • 성공적인 명령은 패키징된 체인코드의 패키지 ID를 반환

    myccv1:cc7bb5f50a53c207f68d37e9423c32f968083282e5ffac00d41ffc5768dc187
  • --output 플래그 : CLI가 출력을 JSON으로 형식화

    peer lifecycle chaincode calculatepackageid mycc.tar.gz --output json
  • 성공하면 명령은 체인코드 패키지 ID를 JSON으로 반환

    {
      "package_id": "myccv1:cc7bb5f50a53c207f68d37e9423c32f968083282e5ffac00d41ffc5768dc1873"
    }

피어 수명 주기 체인코드 approveformyorg 예

  • 체인코드 패키지가 피어에 설치 -> 조직에 대한 체인코드 정의를 승인

  • 체인코드 정의에는 체인코드 이름, 버전 및 보증 정책을 포함하여 체인코드 거버넌스의 중요한 매개변수가 포함

  • peer lifecycle chaincode approveformyorg : mychannel 채널의 1.0 버전에서 mycc 로 명명된 체인코드의 정의를 승인

  • --package-id 플래그: 체인코드 패키지 식별자를 전달

  • --signature-policy 플래그 : 체인코드에 대한 보증 정책 정의

  • init-required 플래그 : 다른 체인코드 함수를 호출하기 전에 초기화 함수 실행

    export ORDERER_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
    
    peer lifecycle chaincode approveformyorg  -o orderer.example.com:7050 --tls --cafile $ORDERER_CA --channelID mychannel --name mycc --version 1.0 
    --init-required 
    --package-id myccv1:a7ca45a7cc85f1d89c905b775920361ed089a364e12a9b6d55ba75c965ddd6a9 --sequence 1 
    --signature-policy "AND ('Org1MSP.peer','Org2MSP.peer')"
    
    2019-03-18 16:04:09.046 UTC [cli.lifecycle.chaincode] InitCmdFactory -> INFO 001 Retrieved channel (mychannel) orderer endpoint: orderer.example.com:7050
    2019-03-18 16:04:11.253 UTC [chaincodeCmd] ClientWait -> INFO 002 txid [efba188ca77889cc1c328fc98e0bb12d3ad0abcda3f84da3714471c7c1e6c13c] committed with status (VALID) at peer0.org1.example.com:7051
  • --channel-config-policy 플래그: 채널 구성 내부의 정책을 체인코드 보증 정책으로 사용O

    • Channel/Application/Endorsement : 기본 보증 정책
    export ORDERER_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
    
    peer lifecycle chaincode approveformyorg -o orderer.example.com:7050 --tls --cafile $ORDERER_CA --channelID mychannel --name mycc --version 1.0 --init-required --package-id myccv1:a7ca45a7cc85f1d89c905b775920361ed089a364e12a9b6d55ba75c965ddd6a9 --sequence 1 --channel-config-policy Channel/Application/Admins
    
    2019-03-18 16:04:09.046 UTC [cli.lifecycle.chaincode] InitCmdFactory -> INFO 001 Retrieved channel (mychannel) orderer endpoint: orderer.example.com:7050
    2019-03-18 16:04:11.253 UTC [chaincodeCmd] ClientWait -> INFO 002 txid [efba188ca77889cc1c328fc98e0bb12d3ad0abcda3f84da3714471c7c1e6c13c] committed with status (VALID) at peer0.org1.example.com:7051

피어 수명 주기 체인코드 queryapproved 예

  • peer lifecycle chaincode queryapproved 명령 : 조직의 승인된 체인코드 정의 쿼리

    • 승인된 체인코드 정의의 세부 정보(패키지 ID 포함) 확인 가능
  • ex: mychannel channel 의 시퀀스 번호 1mycc로 명명된 체인코드의 승인된 정의를 쿼리

    • 승인된 정의에 패키지가 지정되지 않은 경우 , 빈 패키지 ID를 표시
    peer lifecycle chaincode queryapproved -C mychannel -n mycc --sequence 1
    
    Approved chaincode definition for chaincode 'mycc' on channel 'mychannel':
    sequence: 1, version: 1, init-required: true, package-id: mycc_1:d02f72000e7c0f715840f51cb8d72d70bc1ba230552f8445dded0ec8b6e0b830, endorsement plugin: escc, validation plugin: vscc
  • 가장 최근에 승인된 정의(최신: 현재 정의된 시퀀스 번호와 다음 시퀀스 번호 중 더 새로운 것)를 쿼리하기 위해 시퀀스 번호를 지정하지 않고 이 명령을 사용할 수도 있습니다.

    peer lifecycle chaincode queryapproved -C mychannel -n mycc
    
    Approved chaincode definition for chaincode 'mycc' on channel 'mychannel':
    sequence: 3, version: 3, init-required: false, package-id: mycc_1:d02f72000e7c0f715840f51cb8d72d70bc1ba230552f8445dded0ec8b6e0b830, endorsement plugin: escc, validation plugin: vscc
  • --output플래그 : CLI가 출력을 JSON으로 형식화

    • 패키지가 지정된 승인된 체인코드 정의를 쿼리할 때
      peer lifecycle chaincode queryapproved -C mychannel -n mycc --sequence 1 --output json
    • 성공하면 명령은 mychannel channel 의 1 시퀀스 번호에서 mycc 체인코드에 대해 승인된 체인코드 정의가 있는 JSON을 반환
      {
        "sequence": 1,
        "version": "1",
        "endorsement_plugin": "escc",
        "validation_plugin": "vscc",
        "validation_parameter": "EiAvQ2hhbm5lbC9BcHBsaWNhdGlvbi9FbmRvcnNlbWVudA==",
        "collections": {},
        "init_required": true,
        "source": {
          "Type": {
            "LocalPackage": {
              "package_id": "mycc_1:d02f72000e7c0f715840f51cb8d72d70bc1ba230552f8445dded0ec8b6e0b830"
            }
          }
        }
      }
  • 패키지가 지정되지 않은 승인된 체인코드 정의를 쿼리할 때

    peer lifecycle chaincode queryapproved -C mychannel -n mycc --sequence 2 --output json
  • 성공하면 명령은 mychannel channel 의2시퀀스 번호에서mycc 체인코드에 대해 승인된 체인코드 정의가 있는 JSON을 반환

    {
      "sequence": 2,
      "version": "2",
      "endorsement_plugin": "escc",
      "validation_plugin": "vscc",
      "validation_parameter": "EiAvQ2hhbm5lbC9BcHBsaWNhdGlvbi9FbmRvcnNlbWVudA==",
      "collections": {},
      "source": {
        "Type": {
          "Unavailable": {}
        }
      }
    }

피어 수명 주기 체인코드 checkcommitreadiness 예

  • peer lifecycle chaincode checkcommitreadiness : 체인코드 정의를 커밋할 준비가 되었는지 확인

    • 정의의 후속 커밋이 성공할 것으로 예상되면 성공적으로 반환
    • 체인코드 정의를 승인한 조직을 출력
    • 조직이 명령에 지정된 체인코드 정의를 승인한 경우, 명령은 true 값을 반환
    • 정의를 채널에 커밋하기 전, 충분한 채널 구성원이 /Channel/Application/Endorsement 정책(기본적으로 다수)을 충족하기 위해 체인코드 정의를 승인했는지 확인 가능
  • mychannel channel 에서 1.0 version 이라는 이름의 mycc 체인코드를 확인하는 명령 peer lifecycle chaincode checkcommitreadiness 의 예

    export ORDERER_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
    
    peer lifecycle chaincode checkcommitreadiness -o orderer.example.com:7050 --channelID mychannel --tls --cafile $ORDERER_CA --name mycc --version 1.0 --init-required --sequence 1
  • 성공하면 명령은 체인코드 정의를 승인한 조직을 반환

    Chaincode definition for chaincode 'mycc', version '1.0', sequence '1' on channel
    'mychannel' approval status by org:
    Org1MSP: true
    Org2MSP: true
  • --output 플래그를 사용하여 CLI가 출력을 JSON으로 형식화

    export ORDERER_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
    
    peer lifecycle chaincode checkcommitreadiness -o orderer.example.com:7050 --channelID mychannel --tls --cafile $ORDERER_CA --name mycc --version 1.0 --init-required --sequence 1 --output json
  • 성공하면 명령은 조직이 체인코드 정의를 승인했는지 여부를 보여주는 JSON 맵을 반환

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

피어 수명 주기 체인코드 커밋 예시

  • peer lifecycle chaincode commit : 충분한 수의 조직이 조직에 대한 체인코드 정의를 승인하면 한 조직은 채널 정의 커밋 가능.

    • 정의에 대한 조직 보증을 수집하기 위해 채널에 있는 다른 조직의 피어를 대상으로 함.

      export ORDERER_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
      
      peer lifecycle chaincode commit -o orderer.example.com:7050 --channelID mychannel --name mycc --version 1.0 --sequence 1 --init-required --tls --cafile $ORDERER_CA --peerAddresses peer0.org1.example.com:7051 --peerAddresses peer0.org2.example.com:9051
      
      2019-03-18 16:14:27.258 UTC [chaincodeCmd] ClientWait -> INFO 001 txid [b6f657a14689b27d69a50f39590b3949906b5a426f9d7f0dcee557f775e17882] committed with status (VALID) at peer0.org2.example.com:9051
      2019-03-18 16:14:27.321 UTC [chaincodeCmd] ClientWait -> INFO 002 txid [b6f657a14689b27d69a50f39590b3949906b5a426f9d7f0dcee557f775e17882] committed with status (VALID) at peer0.org1.example.com:7051

피어 수명 주기 체인코드 querycommitted 예제

  • peer lifecycle chaincode querycommitted : 채널에 커밋된 체인코드 정의를 쿼리

    • 체인코드를 업그레이드하기 전에 이 명령을 사용하여 현재 정의 시퀀스 번호를 쿼리 가능
    • 특정 체인코드 정의와 이를 승인한 조직을 쿼리하려면 체인코드 이름과 채널 이름을 제공해야 함.
    export ORDERER_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
    
    peer lifecycle chaincode querycommitted -o orderer.example.com:7050 --channelID mychannel --name mycc --tls --cafile $ORDERER_CA --peerAddresses peer0.org1.example.com:7051
    
    Committed chaincode definition for chaincode 'mycc' on channel 'mychannel':
    Version: 1, Sequence: 1, Endorsement Plugin: escc, Validation Plugin: vscc
    Approvals: [Org1MSP: true, Org2MSP: true]
  • 해당 채널의 모든 체인코드 정의를 쿼리하기 위해 채널 이름만 지정할 수도 있움.

    export ORDERER_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
    
    peer lifecycle chaincode querycommitted -o orderer.example.com:7050 --channelID mychannel --tls --cafile $ORDERER_CA --peerAddresses peer0.org1.example.com:7051
    
    Committed chaincode definitions on channel 'mychannel':
    Name: mycc, Version: 1, Sequence: 1, Endorsement Plugin: escc, Validation Plugin: vscc
    Name: yourcc, Version: 2, Sequence: 3, Endorsement Plugin: escc, Validation Plugin: vscc
  • --output플래그 를 사용하여 CLI가 출력을 JSON으로 형식화

    • 특정 체인코드 정의를 쿼리하기 위해

      export ORDERER_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
      
      peer lifecycle chaincode querycommitted -o orderer.example.com:7050 --channelID mychannel --name mycc --tls --cafile $ORDERER_CA --peerAddresses peer0.org1.example.com:7051 --output json
    • 성공하면 이 명령은 채널 'mychannel'에서 체인코드 'mycc'에 대한 체인코드 정의를 커밋한 JSON을 반환

      {
        "sequence": 1,
        "version": "1",
        "endorsement_plugin": "escc",
        "validation_plugin": "vscc",
        "validation_parameter": "EiAvQ2hhbm5lbC9BcHBsaWNhdGlvbi9FbmRvcnNlbWVudA==",
        "collections": {},
        "init_required": true,
        "approvals": {
          "Org1MSP": true,
          "Org2MSP": true
        }
      }
    • validation_parameter 은 base64로 인코딩, 이를 디코딩하는 명령의 예는 다음과 같다.

      echo EiAvQ2hhbm5lbC9BcHBsaWNhdGlvbi9FbmRvcnNlbWVudA== | base64 -d
      /Channel/Application/Endorsement
    • 해당 채널의 모든 체인코드 정의를 쿼리하기 위해

      export ORDERER_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
      
      peer lifecycle chaincode querycommitted -o orderer.example.com:7050 --channelID mychannel --tls --cafile $ORDERER_CA --peerAddresses peer0.org1.example.com:7051 --output json
    • 성공하면 이 명령은 채널 'mychannel'에서 체인코드 정의를 커밋한 JSON을 반환

    {
      "chaincode_definitions": [
        {
          "name": "mycc",
          "sequence": 1,
          "version": "1",
          "endorsement_plugin": "escc",
          "validation_plugin": "vscc",
          "validation_parameter": "EiAvQ2hhbm5lbC9BcHBsaWNhdGlvbi9FbmRvcnNlbWVudA==",
          "collections": {},
          "init_required": true
        },
        {
          "name": "yourcc",
          "sequence": 3,
          "version": "2",
          "endorsement_plugin": "escc",
          "validation_plugin": "vscc",
          "validation_parameter": "EiAvQ2hhbm5lbC9BcHBsaWNhdGlvbi9FbmRvcnNlbWVudA==",
          "collections": {}
        }
      ]
    }
profile
인생 살자.

1개의 댓글

comment-user-thumbnail
2023년 8월 8일

정리가 잘 된 글이네요. 도움이 됐습니다.

답글 달기