比较核心的数据结构。
type chainSupport struct {
bundleSource *resourcesconfig.BundleSource
channelconfig.Resources
channelconfig.Application
ledger ledger.PeerLedger
fileLedger *fileledger.FileLedger
}
核心方法,包括:
- Apply:尝试将一个configtx配置应用到新配置中;
- Ledger:返回peer账本;
- GetMSPIDs:返回channel的MSPid;
- Sequence:返回序列号。
- Reader:返回区块链的读取者reader;
- Errored:返回一个通道,该通道在后台接收方出错时关闭;
两个基础结构
// chain is a local struct to manage objects in a chain
type chain struct {
cs *chainSupport
cb *common.Block
committer committer.Committer
}
// chains is a local map of chainID->chainObject
var chains = struct {
sync.RWMutex
list map[string]*chain
}{list: make(map[string]*chain)}
peer初始化核心方法之一,在账本和gossip服务ready后调用,是在peer node start命令中调用的此函数。功能是从永久存储中恢复并建立所有的区块链。
- 首先创建一个新的加权信号量,其有并发访问的最大组合权重;
- 区块链初始化函数赋值;
- 区块链账本管理器初始化,并取出所有账本id;针对每个账本进行如下操作:打开账本,读取账本配置块,使用配置块创建账本的区块链,初始化区块链。
从账本中读取区块链配置块。
- 先用账本取得区块链的基本信息;
- 再使用GetBlockByNumber获得最后一个区块;
- 从最后一个区块的metadata中获得最后一个配置区块的index
- 最后使用GetBlockByNumber获得最后一个配置区块返回
使用账本配置和区块配置创建一个区块链chain,并插入到本地的chains链表中。
依次初始化chainSupport和commiter,然后加入配置块构成chain结构。这其中包含了p2p协议gossip的初始化和事件处理函数配置。