# Section2.7 接口与实现

## Event

### ExecutionConsumer

* Usage
  * consensus.Consenter接口的一部分.
  * consensus/executor.coordinatorImpl的成员变量consumer
* Implement
  * 没有单独实现的ExecutionConsumer
  * Consenter对ExecutionConsumer进行了实现

### Consenter 接收事件

* Usage
  * consensus/helper.EngineImpl的成员变量，pbft只会生成一个consensus.Consenter作为engine的成员变量
  * consensus/helper.Helper的成员变量
* Implement
  * Helper的Consenter来自于engine, engine的Consenter来自controller, controller的来自于pbft.
  * Consenter接口的实现为obcBatch，但obcBatch并没有自己实现这些函数, 而是继承自consensus/pbft/external.go中的externalEventReceiver；externalEventReceiver通过和event.Manager的直接交互来对接口进行了实现.

### coordinator

* Helper的成员变量coordinator，类型为peer.MessageHandlerCoordinator, 定义在peer中, 是初始化engine时的唯一参数, 也可以说是和节点联系的途径.&#x20;
* engine使用它获得PeerEndpoint(本节点), 然后将它传给Helper用于初始化, 自己并不保存这个变量. Helper会保存该变量, 并用它来实现了NetworkStack里的功能, 包括获取节点信息, 广播, 单播, 另外还包括获取区块链长度.

## Network

### Inquirer 获取网络信息

* Usage
  * consensus.NetworkStack接口的一部分
  * consensus/pbft.communicator接口的一部分.
* Implement
  * Inquirer的引用都是通过NetworkStack实现的

### Communicator 发送消息

* Usage
  * consensus.NetworkStack接口的一部分
  * consensus/pbft.communicator接口的一部分.
  * broadcaster结构体的成员变量&#x20;
* Implement
  * Communicator通过NetworkStack实现的

### NetworkStack

* NetworkStack只是作为Stack的一部分被使用, 并没有单独实现NetworkStack接口的结构体.&#x20;
* 对于Stack, 由Helper来实现, Helper对NetworkStack部分的实现是依赖于core/peer中定义的MessageHandlerCoordinator. 该参数在程序启动时会初始化.

### Stack

* 在pbft内部, 也定义了一个与此对应的接口innerStack, 用于内部使用.
* 只有consensus/helper/helper.go中定义的Helper实现了Stack.&#x20;

## Crypto

### SecurityUtils 加密消息

* SecurityUtils接口仅作为Stack的一部分使用, Stack是由Helper实现的, 对于SecurityUtils部分, Helper通过调用secHelper来实现, secHelper类型为crypto.Peer，实际由nodeImpl实现。

### secHelper

* 用于实现SecurityUtils接口, 类型为crypto.Peer, 通过调用coordinator.GetSecHelper()生成. 在消息传递前会进行加密, 接收后进行解密.
* 实际上, 在pbft中并没有直接使用SecurityUtils接口, 而是进行了封装.

## Blockchain

### ReadOnlyLedger

* blockchain被封装在了Ledger内, ReadOnlyLedger定义了对Blockchain的读操作, Helper使用Ledger对其进行了实现, 而Ledger内部则是调用了blockchain的对应方法, blockchain则是通过使用db进行了实现.

### LegacyExecutor

* LegacyExecutor用来对blockchain进行写操作, 实际实现只有一处, 在Helper中, 另一处在executor里虽作为一部分定义了一个新的接口, 但该接口仍是通过Helper来初始化的.&#x20;
* 在Helper中, 除func ExecTxs()是和chaincode交互实现的, 其他仍是和Ledger交互. executor的存在, 主要是为了方便收集来自obcBatch关于对blockchain写操作的消息, 集中调用Helper进行执行.

### Executor  执行Tx

* Executor作为Stack的一部分以Helper实现, Helper用executor来实现的, 本质上是由executor.coordinatorImpl来实现的.

### LedgerManager

* LedgerManager也是Stack的一部分, 用于设置Ledger的状态是否最新/合法, 会在状态转换前或检测到失效后置false, 收到stateUpdatedEvent后重新置true.
