본문 바로가기

Hyperledger Fabric

Hyperledger Fabric 2.0 체인코드 배포하기(번역 및 실습)

체인코드 배포하기

기본환경은 아래 byfn 을 구동한 상태입니다.

https://hyperledger-fabric.readthedocs.io/en/latest/build_network.html#building-your-first-network

 

Building Your First Network — hyperledger-fabricdocs master documentation

Docs » Tutorials » Building Your First Network Edit on GitHub Building Your First Network The build your first network (BYFN) scenario provisions a sample Hyperledger Fabric network consisting of two organizations, each maintaining two peer nodes. It also

hyperledger-fabric.readthedocs.io

 

 

 

1. 스마트 컨트렉트 패키지

▣ Chaincode is packaged on peer0.org1

 

peer lifecycle chaincode package excc.tar.gz --path /opt/gopath/src/github.com/hyperledger/fabric-samples/chaincode/example/node/ --lang node --label excc_1

 

이 명령은 현재 디렉토리에 excc.tar.gz 라는 패키지를 작성합니다.


--path 플래그는 스마트 컨트렉트 코드의 위치를 제공
--lang 플래그는 체인 코드 언어를 지정하는 데 사용
--label 플래그는 체인 코드가 설치된 후 체인 코드를 식별하는 체인 코드 레이블을 지정하는 데 사용, 레이블에 체인 코드 이름과 버전을 포함하는 것이 좋습니다.

체인 코드 패키지를 만들었으므로 (테스트) 네트워크의 피어에 체인 코드를 설치할 수 있습니다.

 

2. 체인 코드 패키지 설치

excc 스마트 컨트랙트를 패키지 한 후 피어에 체인 코드를 설치할 수 있습니다. 
트랜잭션을 승인 할 모든 피어에 체인 코드를 설치해야합니다. 
Org1과 Org2의 보증을 요구하도록 보증 정책을 설정하기 때문에 두 조직이 운영하는 피어에 체인 코드를 설치해야 합니다.

- peer0.org1.example.com
- peer0.org2.example.com

먼저 Org1 피어에 체인 코드를 설치하겠습니다. 
피어 CLI를 Org1 관리자로 작동하려면 다음 환경 변수를 설정하십시오. 
CORE_PEER_ADDRESS는 Org1 피어 peer0.org1.example.com 을 가리 키도록 설정됩니다.

peer lifecycle chaincode install 명령을 실행하여 피어에 체인 코드를 설치하십시오.

 

▣ Installing chaincode on peer0.org1...

 

peer lifecycle chaincode install excc.tar.gz

 

▣ Installing chaincode on peer0.org2...

 

export CORE_PEER_TLS_ENABLED=true
export CORE_PEER_LOCALMSPID="Org2MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt
export CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin\@org2.example.com/msp/
export CORE_PEER_ADDRESS=peer0.org2.example.com:9051

peer lifecycle chaincode install excc.tar.gz

 

3. 체인코드 정의 승인

체인코드 패키지를 설치 한 후 조직의 체인 코드 정의를 승인해야 합니다.
정의에는 이름, 버전 및 체인 코드 승인 정책과 같은 체인 코드 거버넌스의 중요한 매개 변수가 포함됩니다.

체인 코드를 배포하기 전에 승인해야하는 채널 멤버 집합은 Application/Channel/lifeycleEndorsement 정책에 따라 결정됩니다. 
기본적으로 이 정책은 대부분의 채널 멤버가 체인 코드를 승인해야 채널에서 사용할 수 있습니다. 
한 채널에 2개의 조직만 있고 대부분 2는 2이므로 excc의 체인 코드 정의를 Org1 및 Org2로 승인해야합니다.

조직이 피어에 체인 코드를 설치한 경우 조직에서 승인한 체인코드 정의에 packageID를 포함해야합니다. 
패키지 ID는 피어에 설치된 체인코드를 승인된 체인코드 정의와 연결하는 데 사용되며 조직은 체인코드를 사용하여 거래를 승인 할 수 있습니다. 
peer lifecycle chaincode queryinstalled 명령을 사용하여 피어를 쿼리하여 체인 코드의 패키지 ID를 찾을 수 있습니다.

 

▣ Query installed successful on peer0.org1 on channel

 

peer lifecycle chaincode queryinstalled
 
 		
# Output : 
# Installed chaincodes on peer:
# Package ID: excc_1:b6e44aa6933ce2930bef846decb4cec1eae064447560b09ad23112df295a280d, Label: excc_1
# PackageID is excc_1:b6e44aa6933ce2930bef846decb4cec1eae064447560b09ad23112df295a280d

 

체인코드를 승인할 때 패키지 ID를 사용할 것이므로 환경 변수로 저장해보겠습니다. 피어 수명주기 체인 코드 쿼리에서 반환한 패키지 ID를 아래 명령에 붙여 넣습니다. 패키지 ID는 모든 사용자에 대해 동일하지 않을 수 있으므로 명령 창에서 반환된 패키지 ID를 사용하여 이 단계를 완료해야합니다.

 

export CC_PACKAGE_ID=excc_1:b6e44aa6933ce2930bef846decb4cec1eae064447560b09ad23112df295a280d

 

환경 변수가 피어 CLI를 Org2 관리자로 작동하도록 설정되었으므로 excc r의 체인 코드 정의를 Org2로 승인 할 수 있습니다. 
체인 코드는 조직 수준에서 승인되므로 명령은 하나의 피어 만 대상으로 지정하면 됩니다. 
승인은 가십을 사용하여 조직 내 다른 동료에게 배포됩니다. 
peer lifecycle chaincode approveformyorg 명령을 사용하여 체인 코드 정의를 승인하십시오.

 

▣ Chaincode definition approved on peer0.org2 on channel 'mychannel'

 

peer lifecycle chaincode approveformyorg --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem --channelID mychannel --name excc --version 1 --init-required --package-id $CC_PACKAGE_ID --sequence 1 --waitForEvent

 

위의 명령은 
--package-id 플래그를 사용하여 체인 식별자 정의에 패키지 식별자를 포함시킵니다.
--sequence 매개 변수는 체인 코드가 정의 또는 업데이트 된 횟수를 추적하는 정수입니다. 체인 코드가 채널에 처음으로 배포되므로 시퀀스 번호는 1입니다. excc 체인 코드가 업그레이드되면 시퀀스 번호가 2로 증가합니다.
 --init-required 플래그를 사용하여 다음을 요청합니다. 다른 함수를 사용하여 원장과 상호 작용하기 전에 초기화 함수를 호출하여 체인 코드를 초기화하십시오. 기본적으로 Init 기능을 실행할 필요는 없습니다. 체인 코드를 초기화하기 위해 Init 함수를 호출하도록 요구할 필요는 없습니다. excc 체인 코드는 Fabric 계약 API를 사용하기 때문에 체인 코드에서 함수를 호출하여 체인 코드를 초기화 할 수 있으며 Init 함수가 백그라운드에서 호출됩니다.
체인 코드 보증 정책을 지정하기 위해 --signature-policy 또는 --channel-config-policy 인수를 approveformyorg 명령에 제공 할 수 있습니다.
보증 정책은 서로 다른 채널 멤버에 속한 피어가 몇 개의 체인 코드에 대해 트랜잭션을 검증해야하는지 지정합니다. 
정책을 설정하지 않았기 때문에 Fabcar의 정의는 기본 승인 정책을 사용하므로 트랜잭션을 제출할 때 참석한 대부분의 채널 구성원이 트랜잭션을 승인해야 합니다. 
즉, 새 조직이 채널에서 추가 또는 제거되면 승인 정책이 자동으로 업데이트되어 더 많거나 적은 보증이 필요합니다.
이 자습서에서는 기본 정책에 2 개 중 2 개 중 다수가 필요하며 Org1 및 Org2의 피어가 트랜잭션을 승인해야합니다. 
사용자 지정 승인 정책을 지정하려는 경우 보증 정책 작업 가이드를 사용하여 정책 구문에 대해 배울 수 있습니다.

관리자 역할이있는 ID로 체인 코드 정의를 승인해야합니다. 
결과적으로 CORE_PEER_MSPCONFIGPATH 변수는 Admin ID가 포함된 MSP 폴더를 가리켜야 합니다. 
클라이언트 사용자로 체인코드 정의를 승인 할 수 없습니다. 
승인은 오더링 서비스에 제출되어야 하며, 그러면 Admin 서명이 유효한지 확인한 후 승인을 peer 에게 배포합니다.

체인 코드 정의를 Org1로 승인해야합니다. Org1 관리자로 작동하도록 다음 환경 변수를 설정하십시오.

 

▣ Chaincode definition approved on peer0.org1 on channel 'mychannel'

 

export CORE_PEER_TLS_ENABLED=true
export CORE_PEER_LOCALMSPID="Org1MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
export CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin\@org1.example.com/msp/
export CORE_PEER_ADDRESS=peer0.org1.example.com:7051

peer lifecycle chaincode approveformyorg --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem --channelID mychannel --name excc --version 1 --init-required --package-id $CC_PACKAGE_ID --sequence 1 --waitForEvent

 

이제 excc 체인코드를 채널에 배포하는 데 필요한 대다수를 확보했습니다. 
대부분의 조직 만이 체인코드 정의를 승인해야 하지만 (기본 정책 사용) 모든 조직은 체인코드 정의를 승인하여 피어에서 체인 코드를 시작해야 합니다. 
채널 멤버가 체인코드를 승인하기 전에 정의를 커밋하면 조직에서 거래를 승인 할 수 없습니다. 
결과적으로 모든 채널 멤버는 체인코드 정의를 커밋하기 전에 체인코드를 승인하는 것이 좋습니다.

 

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

충분한 수의 조직에서 체인 코드 정의를 승인한 후 한 조직에서 체인 코드 정의를 채널에 커밋 할 수 있습니다. 
대부분의 채널 멤버가 정의를 승인한 경우 커미트 트랜잭션이 성공하고 체인코드 정의에서 동의한 매개변수가 채널에서 구현됩니다.
peer lifecycle chaincode checkcommitreadiness 명령을 사용하여 채널 구성원이 동일한 체인코드 정의를 승인했는지 확인할 수 있습니다. 
checkcommitreadiness 명령에 사용되는 플래그는 조직의 체인코드를 승인하는 데 사용되는 플래그와 동일합니다. 
--package-id 플래그를 포함 할 필요는 없습니다.

 

▣ Checking the commit readiness of the chaincode definition on peer0.org1 on channel 'mychannel'...

 

peer lifecycle chaincode checkcommitreadiness --channelID mychannel --name excc --version 1 --sequence 1 --output json --init-required

 

이 명령은 채널 구성원이 checkcommitreadiness 명령에 지정된 매개 변수를 승인 한 경우 표시되는 JSON 맵을 생성합니다.

 

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

 

채널의 멤버인 두 조직 모두 동일한 매개 변수를 승인 했으므로 체인코드 정의를 채널에 커밋 할 수 있습니다. 
peer lifecycle chaincode commit 명령을 사용하여 체인 코드 정의를 채널에 커밋 할 수 있습니다. 
commit 명령은 조직 관리자가 제출해야합니다.

 

▣ Chaincode definition committed on channel 'mychannel'

 

peer lifecycle chaincode commit -o orderer.example.com:7050 --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem --channelID mychannel --name excc --peerAddresses peer0.org1.example.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses peer0.org2.example.com:9051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt --version 1 --sequence 1 --init-required

 

위의 트랜잭션은 --peerAddresses 플래그를 사용하여 Org1의 peer0.org1.example.com을, Org2의 peer0.org2.example.com을 대상으로 합니다. 
커밋 트랜잭션은 채널에 가입한 피어에게 제출되어 피어를 운영하는 조직이 승인한 체인 코드 정의를 쿼리합니다. 
이 명령은 체인 코드 배포 정책을 만족시키기에 충분한 수의 조직에서 피어를 대상으로 해야 합니다. 
승인은 각 조직 내에서 배포되므로 채널 멤버에 속한 모든 피어를 대상으로 지정할 수 있습니다.

채널 멤버에 의한 체인 코드 정의 보증은 주문 서비스에 제출되어 블록에 추가되고 채널에 분배됩니다. 
그런 다음 채널의 피어는 충분한 수의 조직이 체인 코드 정의를 승인했는지 확인합니다. 
peer lifecycle chaincode commit 명령은 응답을 반환하기 전에 피어의 유효성 검사를 기다립니다.

 

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

 

▣ Querying chaincode definition on peer0.org1 on channel 'mychannel'...

 

peer lifecycle chaincode querycommitted --channelID mychannel --name excc

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

 

체인코드가 채널에 성공적으로 커밋된 경우 querycommitted 명령은 체인코드 정의의 순서와 버전을 반환합니다.

 

5. 체인코드 호출하기

체인코드 정의가 채널에 커밋 된 후 체인코드가 설치된 채널에 연결된 피어에서 체인 코드가 시작됩니다. 
excc 체인코드는 이제 클라이언트 응용 프로그램에 의해 호출될 준비가되었습니다.

 

peer chaincode invoke -o orderer.example.com:7050 --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/exam
ple.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n excc --peerAddresses peer0.org1.example.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fa
bric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses peer0.org2.example.com:9051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/
crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt --isInit -c '{"Args":["Init"]}'

 

체인코드 정의에 --init-required 플래그를 포함 시켰으므로 첫 번째 트랜잭션은 --isInit 플래그를 호출 명령에 전달하여 체인코드를 초기화해야합니다. 
excc 스마트 컨트렉트는 패브릭 계약 API를 사용하므로 첫 번째 트랜잭션은 체인 코드의 모든 기능을 대상으로 할 수 있습니다. 
Fabric Chaincode Shim API가 제공하는 저수준 API를 사용하는 경우 트랜잭션은 Init 함수를 대상으로해야 합니다. 
체인코드의 첫 번째 호출은 Init 또는 다른 기능에 관계없이 체인코드 보증 정책의 적용을 받습니다.

 

peer chaincode query -C mychannel -n excc -c '{"Args":["fcn","param1"]}'

 

실습

chaincode package

 

chaincode install

 

chaincode queryinstalled

 

chaincode approveformyorg

 

chaincode commit

 

chaincode invoke

 

chaincode invoke

 

참고

https://hyperledger-fabric.readthedocs.io/en/latest/build_network.html#install-and-define-a-chaincode

 

Building Your First Network — hyperledger-fabricdocs master documentation

Docs » Tutorials » Building Your First Network Edit on GitHub Building Your First Network The build your first network (BYFN) scenario provisions a sample Hyperledger Fabric network consisting of two organizations, each maintaining two peer nodes. It also

hyperledger-fabric.readthedocs.io