블록체인/HYPERLEDGER FABRIC

HYPERLEDGER FABRIC - Developing Applications - Application design elements - Transaction handlers

펭귀니 :) 2020. 9. 3. 17:03

독자 : Architects, Application and smart contract developers

 

트랜잭션 핸들러를 사용하면 스마트 계약 개발자는 application과 스마트 계약이 서로 상호작용하는 동안 주요 지점에서 공통 처리를 정의합니다.

트랜잭션 핸들러는 선택사항이지만 만약 정의되어있다면 스마트 계약에 있는 모든 트랜잭션이 호출되기 전이나 후에 제어를 받게 될것입니다.

스마트 계약 안에 정의되어 있지 않은 트랜잭션을 부르는 요청이 있을 때 제어를 받는 구체적인 핸들러도 있습니다.

 

여기에 기업 어음 스마트 계약 샘플(Developing Applications » Smart Contract Processing)의 트랜잭션 핸들러 예제가 있습니다.

before, after, unknown 트랜잭션 핸들러. 이 예에서, beforeFunction()issue, buy, redeem 트랜잭션 전에 호출됩니다. afterFunction()은 오직 issue, buy, redeem 트랜잭션 후에 호출됩니다. unknownFunction()은 오직 요청이 스마트 계약안에 정의되어있지 않은 트랜잭션이 불려질때 호출됩니다. (다이어그램은 각각 트랜잭션에 BeforeFuncionAfterFunction 박스가 반복되지 않아 단순화되었습니다.)

 

Types of handler

application과 스마트 계약 사이에 상호작용의 다양한 측면을 다루는 세가지 트랜잭션 핸들러가 있습니다.

  • Before handler : 모든 스마트 계약 트랜잭션이 적용되기 전에 호출됩니다. 핸들러는 일반적으로 트랜잭션에서 사용될 트랜잭션 컨텍스트를 수정합니다. 핸들러는 전체 Fabric API에 접근할 수 있습니다. 예를들어 getState()put State().
  • After handler : 모든 스마트 계약 트랜잭션이 적용된 후에 호출됩니다. 핸들러는 일반적으로 모든 트랜잭션에 공통적인 사후처리를 진행하며, 모든 Fabric API에 접근할 수 있습니다.
  • Unknown handler : 스마트 계약에 정의되지 않은 트랜잭션을 호출하려고 시도하면 호출됩니다. 일반적으로 핸들러는 관리자의 후속 처리를 위해 실패를 기록합니다. 핸들러는 모든 Fabric API에 접근할 수 있습니다.

 

Defining a handler

트랜잭션 핸들러는 스마트 계약에 잘 정의된 이름의 메소드로 추가됩니다.

여기에 각 유형의 핸들러가 추가된 예제가 있습니다.

CommercialPaperContract extends Contract {

    ...

    async beforeTransaction(ctx) {
        // Write the transaction ID as an informational to the console
        console.info(ctx.stub.getTxID());
    };

    async afterTransaction(ctx, result) {
        // This handler interacts with the ledger
        ctx.stub.cpList.putState(...);
    };

    async unknownTransaction(ctx) {
        // This handler throws an exception
        throw new Error('Unknown transaction function');
    };

}

트랜잭션 핸들러 정의의 형식은 모든 핸들러 유형에서 비슷하지만, 어떻게 afterTransaction(ctx, result)가 트랜잭션에서 반환한 결과도 받는 방법을 확인하세요.

 

Handler processing

핸들러가 스마트 계약에 추가되면, 트랜잭션 처리 중에 호출될 수 있습니다.

처리 중에 핸들러는 ctx와 트랜잭션 컨텍스트를 받고, 일부 처리를 수행하며 완료하면서 제어권을 반환합니다.

처리는 아래와 같이 진행됩니다.

  • Before handler : 핸들러가 성공적으로 완료하면, 트랜잭션은 업데이트된 컨텍스트를 호출합니다. 핸들러에서 예외가 발생하면, 트랜잭션은 호출되지 않고, 스마트 계약은 예외 에러 메세지와 함께 실패합니다.
  • After handler : 핸들러가 성공적으로 완료하면, 스마트 계약은 호출된 트랜잭션에 따라 스마트 계약이 완료됩니다. 핸들러에서 예외가 발생하면, 트랜잭션은 예외 에러 메세지와 함께 실패합니다.
  • Unknown handler : 핸들러는 필수 에러 메세지와 함께 예외를 발생시켜 완료시킵니다. Unknown handler가 지정되지 않았거나 예외가 그것에 의해 던져지지 않았다면, 합리적인 기본 처리가 있습니다. 스마트 계약은 unknown transaction 에러 메세지와 함께 실패합니다.

핸들러가 함수와 매개변수에 접근해야하는경우, 다음과 같이 쉽게 수행할 수 있습니다.

async beforeTransaction(ctx) {
    // Retrieve details of the transaction
    let txnDetails = ctx.stub.getFunctionAndParameters();

    console.info(`Calling function: ${txnDetails.fcn} `);
    console.info(util.format(`Function arguments : %j ${stub.getArgs()} ``);
}

 

Multiple handlers

스마트 계약의 각 유형의 핸들러에 오직 하나만 정의할 수 있습니다.

만약 스마트 계약이 before, after, unknown 핸들링 중 여러 기능을 호출하기 윈한다면, 적절한 기능내에서 조정해야합니다.

 

출처 ] 

hyperledger-fabric.readthedocs.io/en/release-1.4/developapps/transactionhandler.html