transaciton handler允许智能合约开发人员在应用程序和智能合约交互过程中的关键点定义通用处理。transaction handler是可选的,如果定义,它们将在调用智能合约的每个事物之前或之后获得控制,还有一个特定的handler程序,该handler在发出调用智能合约中未定义的transaction时接收控制。
1、handler类型
- Before handler:在每个智能合约transaction调用之前被调用,这类handler通常修改transaction context,并拥有访问所有Fabric APIs的权限,比如它们可以请求getState()和putState()
- After handler:在每个智能合约transaction调用之后被调用,也具有对Fabric APIs的完全访问权限
- Unknown handler:尝试调用智能合约中未定义的transaction时调用,通常handler将会记录故障,以供管理员后续处理,同样,这类handler也具有对Fabric APIs的完全访问权限
一个智能合约最多可以定义每种类型的一个handler。
2、定义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)接收了一个transaction返回的结果。
3、多个handlers
注意!对于智能合约只能为每中类型定义一个处理程序,如果智能合约需要在处理之前、之后或未知期间调用多个function,则应在适当的function内进行协调。