

![执行器调用框架示意图](./resource/excutor-call-back-framework.png)  

## 1.执行器初始化时注册到全局map中被后续业务处理逻辑调用  
全局map：registedExecDriver  
每个执行器的init函数中，会调用dapp.Register接口，向registedExecDriver进行注册。
当需要使用执行器时，需调用dapp.LoadDriverAllow（最终调用dapp.LoadDriver）来创建执行器对象。

## 2.查询接口  
以GetAddrOverview为例，会触发Executor来调用LoadDriver得到对应的执行器，并执行该执行器对应的Query_XXX方法。  

## 3.生成区块  
当blockchain模块调用到execBlock时，ExecTx函数会通过EventExecTxList消息触发Executor来调用LoadDriver得到对应的执行器，并执行该执行器对应的Exec_XXX方法，具体调用哪一个方法，根据交易中的action信息来定。  

当blockchain模块调用到AddTxs时，getLocalKV函数会通过EventAddBlock消息触发Executor来调用LoadDriver得到对应的执行器，并执行该执行器对应的ExecLocal_XXX方法，具体调用哪一个方法，根据交易中的action信息来定。  
  
## 4.删除区块
当blockchain模块调用到disconnectBlock时，DelTxs函数中的getDelLocalKV函数会通过EventDelBlock消息触发Executor来调用LoadDriver得到对应的执行器，并执行该执行器对应的ExecDelLocal_xxx方法，具体调用哪一个方法，根据交易中的action信息来定。    


通过上述几个主要过程的调用流程逻辑梳理，基本可以看清楚Chain33各模块之间是如何配合完成灵活抽象的执行器框架的几个主要接口调用的。  

执行器框架的设计，使用了go的反射机制，通过类的层次关系设计，实现了抽象灵活可插拔的编程模式，使合约开发者可以重点关注合约逻辑的实现，而不用过多分心到其他模块的内部实现细节。  

