티스토리 뷰

네트워크 시작

test-network 디렉토리로 이동한 다음. 

./network.sh down 명령어를 통해 도커를 정리해준다

cd fabric-samples/test-network
./network.sh down

 

다음 명령을 이용하여 테스트 네트워크를 시작한다. 

./network.sh up createChannel

 

Channel 'mychannel' joined  메세지가 나오면 성공. 

 

 

Logspout 설정 (모니터링 할 수 있음)

모니터링을 위해 다른 터미널에서 아래 코드를 실행. 

cd fabric-samples/test-network
cp ../commercial-paper/organization/digibank/configuration/cli/monitordocker.sh .
find . -name monitordocker.sh
./monitordocker.sh fabric_test

 

success output

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

 

체인코드 패키징: 자바스크립트

cd fabric-samples/asset-transfer-basic/chaincode-javascript
npm install

그리고 다시 test network 로 이동

cd ../../test-network

 

cli 경로 추가

export PATH=${PWD}/../bin:$PATH
export FABRIC_CFG_PATH=$PWD/../config/

 

peer lifecycle chaincode package를 통해 체인코드 패키지를 생성

peer lifecycle chaincode package basic.tar.gz --path ../asset-transfer-basic/chaincode-javascript/ --lang node --label basic_1.0
살펴보면
peer lifecycle chaincode package basic.tar.gz 
--path ../asset-transfer-basic/chaincode-javascript/  //체인코드의 위치
--lang node  //체인코드의 언어를 지정하는 데 사용되는 플래그
--label basic_1.0 // 설치된 후 체인코드를 식별하는 데 사용되는 플래그

 

채인코드 패키지 설치

체인코드를 패키징한 후 피어에 체인코드를 설치할 수 있다. 체인코드는 트랜잭션을 보증할 모든 피어에 설치해야 한다. 

Org1 과 Org2의 승인을 요구하도록 승인정책을 설정할 예정. 

따라서 두 조직에서 운영하는 피어에 체인코드를 설치해야한다. 

 

먼저 Org1 피어에 체인코드 설치

peer CLI를 Org1의 피어로 가리키도록 환경변수 설정. 

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.tar.gz

 

마찬가지로 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

 

체인코드 정의 승인 

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

 

조직이 피어에 체인코드를 설치한 경우 조직에서 승인한 체인코드 정의에 packageID 를 포함해야 한다. 패키지 ID는 피어에 설치된 체인코드를 승인된 체인코드 정의와 연결하는 데 사용되며 조직이 체인코드를 사용하여 트랜잭션을 승인할 수 있도록 한다. 

 

peer lifecycle chaincode queryinstalled 명령을 이용해서 체인코드의 패키지 ID를 찾을 수 있다. 

 

체인코드를 승인할 때까지 패키지 ID를 사용할 것이므로 환경변수로 저장한다. 

export CC_PACKAGE_ID=basic_1.0:5ea79870eac7493b454fd377ae75e5c683683a7784a3cd367d5142af5e246101

 

지금 CLI는 Org2를 운영하도록 환경변수를 설정했기 때문에 , 체인코드의 정의를 Org2로 승인할 수 있다. 

Chaincode는 조직 수준에서 승인되므로 명령은 하나의 피어만 대상으로 하면된다.(Org2 조직에는 피어가 하나밖에 없긴 하지만;; ) 승인은 가십을 통해 조직 내의 다른 peer에게 배포된다. 

 

peer lifecycle chaincode acceptformyorg 명령을 사용하여 체인코드 정의를 승인한다. 

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

 

이제 Org1으로 체인코드 정의를 승인한다. 

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

 

체널에 체인코드 정의 커밋

충분한 수의 조직에서 체인코드 정의를 승인한 후 한 조직에서 채널에 체인코드 정의를 커밋할 수 있다. 대다수의 채널 구성원이 정의를 승인하면 커밋 트랜잭션이 성공하고, 체인코드 정의에서 동의한 매개변수가 채널에 구현된다. 

 

peer lifecycle chaincode checkcommitreadiness 명령을 사용하여 채널 구성원이 동인한 체인코드 정의를 승인했는지 확인할 수 있다. 

 

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

 

success output

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

채널의 구성원인 두 조직이 동일한 매개변수를 승인했기 때문에 체인코드 정의는 채널에 커밋할 준비가 되어있다. 

peer lifecycle chaincode commit을 사용해서 체인코드 정의를 채널에 커밋할 수 있다. 

 

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"

 

채널 구성원에 의해 체인코드 정의 보증은 블록에 추가되고 채널에 배포될 주문 서비스에 제출된다. 그런 다음 채널의 피어는 충분한 수의 조직이 체인코드 정의를 승인했는지 확인한다. 명령은 응답을 반환하기 저에 피어의 유효성 검사를 기다린다. 

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"

 

 success output

 

체인코드가 채널에 성공적으로 커밋되면 체인코드 정의의 시퀀스와 버전을 반환한다. 

 

체인코드 호출

체인코드 정의가 채널에 커밋된 후 체인코드는 체인코드가 설치된 채널에 합류한 피어에 시작된다. 클라이언트 어플리케이션은 이제 체인코드를 호출할 수 있다. 

 

먼저 원장에 초기 자산 세트를 생성한다.  invoke 명령은 체인코드 보증 정책을 충족하기 위해 충분한 수의 피어를 대상으로 해야한다. CLI는 Fabric Gateway 피어에 액세스하지 않으므로 각 보증 피어를 지정해야한다. 

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

 

success output

2022-01-24 15:25:25.850 KST 0001 INFO [chaincodeCmd] chaincodeInvokeOrQuery -> Chaincode invoke successful. result: status:200

 

 

쿼리 기능을 사용하여 체인코드에 의해 생성된 초기 자산 세트를 읽을 수 있다. 

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

 

 

스마트 계약 업그레이드

Fabric chaincode lifecycle 프로세스를 사용하여 이미 채널에 배포된 체인코드를 업그레이드할 수 있다. 채널 구성원은 새 체인코드 패키지를 설치한 다음 새 패키지 ID, 새 체인코드 버전 및 1 증가된 시퀀스 번호로 체인코드 정의를 승인하여 체인코드를 업그레이드 할 수 있다. 새 체인코드는 체인코드 정의가 채널에 커밋된 후에 사용할 수 있다. 이 프로세스를 통해 채널 구성원은 체인코드가 업그레이드될 때 조정하고 채널에 배포하기 전에 충분한 수의 채널 구성원이 새 체인코드를 사용할 준비가 되었는지 확인해야한다. 

 

채널 구성원은 업그레이드 프로세스를 사용하여 체인코드 보증 정책을 변경할 수도 있다. 새로운 보증 정책으로 체인코드를 승인하고 채널에 체인코드 정의를 커밋하여 채널 구성원은 새 체인코드 패키지를 설치하지 않고도 체인코드를 관리하는 보증정책을 변경할 수 있다. 

 

위에서 배포한 체인코드를 업그레이드 하기 위해 Org1 과 Org2가 다른 언어로 작성된 체인코드 버전을 설치해보자. 

이번에는 타입스크립트로 패키징한다. 

cd ../asset-transfer-basic/chaincode-typescript
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

 

peer CLI를 Org1 관리자로 이동한다. 

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

새 체인코드 패키지는 새 패키지 ID를 생성한다.  peer 쿼리를 통해 새 패키지 ID를 찾을 수 있다. 

peer lifecycle chaincode queryinstalled

 

새로운 패키지 ID를 찾아 환경변수로 저장한다. 

 export NEW_CC_PACKAGE_ID=basic_2.0:281415230c74dbd9f549cfb07b6ee3a21e9738bdaccf9407ef00a20e44024bc8

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"

 

새 체인코드 정의는 Typescript 체인코드 패키지의 패키지 ID를 사용하고 체인코드 버전을 업데이트한다. 시퀀스 매개변수는 패브릭 체인코드 라이프사이클에서 체인코드 업그레이드를 추적하는 데 사용된다. 

 

이제 새로운 체인코드 정의를 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_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가 새 체인코드에 대한 정의를 승인할 수 있다. 

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 명령을 사용하여 체인코드 시퀀스 2의 정의가 채널에 커밋할 준비가 되었는지 확인한다. 

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

 

새 체인코드 정의가 커밋된 후 채널에서 체인코드가 업그레이드 된다. 그때까지 이전 체인코드는 두 조직의 피어에서 계속 실행된다. 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 실행을 요청하지 않았기 떄문에 새 자동차를 생성하여 새  Typescript 체인코드를 테스트할 수 있다. 

 

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

 

 

Clear

이제 끝.

docker stop logspout
docker rm logspout
./network.sh down

 

728x90

'블록체인' 카테고리의 다른 글

IPFS 실습  (0) 2022.04.02
Hyperledger Fabric Tutorial3: Running a Fabric Application  (0) 2022.01.24
HyperLedger Fabric Peers(node) 개념  (0) 2022.01.14
Geth) Geth 콘솔  (0) 2021.12.27
Geth) 노드 첫 실행, DAG 파일 생성  (0) 2021.12.27
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함