티스토리 뷰

반응형

 

■■■■■■■■■■ 기본 설명 ■■■■■■■■■■

 

참고 사이트 : Hyperledger Fabric Node.js Contract and Shim - ChaincodeStub(https://fabric-shim.github.io/release-1.4/fabric-shim.ChaincodeStub.html)

 

Hyperledger Fabric Node.js Contract and Shim Class: ChaincodeStub

Returns a HEX-encoded string of SHA256 hash of the transaction's nonce, creator and epoch concatenated, as a unique representation of the specific transaction. This value can be used to prevent replay attacks in chaincodes that need to authenticate an iden

fabric-shim.github.io

●  invokeChaincode(chaincodeName, args, channel)

 

동일한 트랜잭션 컨텍스트를 사용하여 지정된 체인코드 invoke()를 로컬에서 호출합니다. 즉, 체인코드를 호출하는 체인코드는 새 트랜잭션 메시지를 작성하지 않습니다.

호출된 체인 코드가 동일한 채널에 있으면 단순히 호출된 체인 코드 read set과 write set을 호출 트랜잭션에 추가합니다.

호출된 체인 코드가 다른 채널에 있으면 호출한 체인 코드로 응답(response)만 반환됩니다. 호출된 체인코드의 PutState 호출은 ledger에 아무런 영향을 미치지 않습니다. 즉, 다른 채널에 있는 체인 코드가 호출되면 트랜잭션에 적용된 read set과 write set이 없습니다. 호출한 체인 코드의 read set과 write set만 트랜잭션에 적용됩니다. 실제로 다른 채널에 있는 체인 코드의 호출은 후속 commit 단계에서 상태 유효성 검사(state validation check)에 참여하지 않는 'Query'입니다.

'channel'이 비어 있으면 호출자의 채널이 사용됩니다.

 

 

■■■■■■■■■■ 사용 예시 ■■■■■■■■■■

 

callcc라는 수정된 체인코드를 배포한 뒤, byfn 네트워크 실행 시 기본으로 설치 및 배포되는 mycc 체인코드의 자산 a를 query 해봅니다.

테스트를 위해 기본 byfn 네트워크가 실행중이라고 가정합니다. (./byfn.sh up 명령 실행)

 

● 체인코드 작성

 

새로운 callcc 체인코드에 다음 내용을 작성합니다.

 

'use strict';

const shim = require('fabric-shim');

let Chaincode = class {
    async Init(stub) {
        console.info('=========== Instantiated Chaincode ===========');
        return shim.success();
    }

    async Invoke(stub) {
        let ret = stub.getFunctionAndParameters();
        console.info(ret);

        let method = this[ret.fcn];
        console.info(method);
        if (!method) {
            console.log('no function of name:' + ret.fcn + ' found');
            throw new Error('Received unknown function ' + ret.fcn + ' invocation');
        }
        try {
            let payload = await method(stub, ret.params, this);
            return shim.success(payload);
        } catch (err) {
            console.log(err);
            return shim.error(err);
        }
    }

    async toChaincode(...args) {
        var valByte = [];
        for (var i = 0; i < args.length; i++) {
            valByte[i] = Buffer.from(args[i]);
        }
        return valByte;
    }

    async example(stub, args, thisClass) {
        var channel, chaincodeName, fname, assetnm;
        chaincodeName = args[0];
        fname = args[1];
        assetnm = args[2];
        if (args.length > 3) {
            channel = args[3];
        }else{
            channel ='';
        }
        let method = thisClass['toChaincode'];
        let results = await method(fname, assetnm);
        let response = await stub.invokeChaincode(chaincodeName, results, channel);

        console.log(response.status);
        return response.payload;
    }

};

shim.start(new Chaincode());

 

● 체인코드 배포

 

(기본 byfn 네트워크가 실행중인 상태라고 가정합니다.)
다른 체인코드의 데이터를 query 해오는 것이기 때문에 두 개의 체인코드가 필요합니다.
새로 작성한 callcc 체인코드를 배포합니다.
(체인코드 배포에 대한 명령어는 생략합니다.)

 

● 체인코드 실행

 

이제 callcc 체인코드의 example 함수를 이용해 mycc 체인코드의 query 함수를 실행해보겠습니다.

다른 체인코드를 호출할 때에는 query만 가능하지만, Orderer를 거쳐 qeury 결과를 가져오기 때문에 invoke 형식으로 실행되어야 하며 호출 내역에 대한 블록도 생성됩니다.

 

# cli 컨테이너 접속
docker container exec -it cli bash

# 환경변수 설정
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
export CHANNEL_NAME=mychannel
export CC_NAME=callcc

# mycc2 체인코드를 실행해 mycc의 자산 a query
peer chaincode invoke -o orderer.example.com:7050 -C $CHANNEL_NAME -n $CC_NAME -c '{"Args":["example","mycc","query","a"]}' --tls true --cafile $ORDERER_CA

 

반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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 31
글 보관함