fabrci源码记录2
writer:布羽
ProtoBuf
在fabric中,交换数据的格式采用protobuf,而非XML或者JSON。其引入了fabric-rpotos-go这个底层项目。
https://github.com/hyperledger/fabric-protos-go
协议缓冲区(Protocol Buffers)(Protobufs)像 XML 和 JSON 一样,可以让不同语言编写并在不同平台上运行的应用程序交换数据。 由Google开发。其优点是更快更小,与平台、语言无关,以及较好的兼容性。
https://github.com/protocolbuffers/protobuf/
在fabric-protos-go项目中, .proto 扩展名的文件为protobuf IDL(接口定义语言)文件,由protoc编译器生成扩展名为 .pb.go 的go源代码,这些代码的基本内容可以被复制到其他go源代码中使用。
什么情况下使用protobuf?
- 对于包含混合类型的结构化数据(且整数值相对较小)的中等大小的消息,Protobuf 明显优于 XML 和 JSON 等选项。在其他情况下,数据可能不适合 Protobuf 编码。例如,如果两个应用程序需要共享大量文本记录或大整数值,则可以采用压缩而不是编码技术。
账本管理
启发:在peer node start 的过程中会建立账本管理器
hyperledger-fabric\internal\peer\node\start.go
peerInstance.LedgerMgr = ledgermgmt.NewLedgerMgr(
&ledgermgmt.Initializer{
CustomTxProcessors: txProcessors,
DeployedChaincodeInfoProvider: lifecycleValidatorCommitter,
MembershipInfoProvider: membershipInfoProvider,
ChaincodeLifecycleEventProvider: lifecycleCache,
MetricsProvider: metricsProvider,
HealthCheckRegistry: opsSystem,
StateListeners: []ledger.StateListener{lifecycleCache},
Config: ledgerConfig(),
HashProvider: factory.GetDefault(),
EbMetadataProvider: ebMetadataProvider,
},
)
账本管理器
账本管理器结构体定义如下
hyperledger-fabric\core\ledger\ledgermgmt\ledger_mgmt.go
// LedgerMgr manages ledgers for all channels
type LedgerMgr struct {
lock sync.Mutex
openedLedgers map[string]ledger.PeerLedger
ledgerProvider ledger.PeerLedgerProvider
ebMetadataProvider MetadataProvider
}
其中有两个比较重要:
-
openedLedgers
通道名->账本。一个通道维护一个账本
-
ledgerProvider
账本提供者通过读取不同通道的创世区块配置来创建和初始化不同的账本。一个管理器拥有一个账本提供者
账本提供者
PeerLedgerProvider账本提供者接口由以下结构体实现
hyperledger-fabric\core\ledger\kvledger\kv_ledger_provider.go
type Provider struct {
idStore *idStore
blkStoreProvider *blkstorage.BlockStoreProvider
pvtdataStoreProvider *pvtdatastorage.Provider
dbProvider *privacyenabledstate.DBProvider//版本数据库
historydbProvider *history.DBProvider
configHistoryMgr *confighistory.Mgr
stateListeners []ledger.StateListener
bookkeepingProvider *bookkeeping.Provider
initializer *ledger.Initializer
collElgNotifier *collElgNotifier
stats *stats
fileLock *leveldbhelper.FileLock
}
账本提供者的成员大部分是各种数据库存储服务的提供者,作用是为通道账本建立所需的数据库。
账本管理器除了账本提供者,还提供了几个全局函数供外部使用
//CreateLedger使用给定的创世块创建一个新的分类帐。
//此功能可确保创建分类帐和提交创始块将是原子动作
//从创世块中检索到的通道ID被视为分类帐ID
func (m *LedgerMgr) CreateLedger(id string, genesisBlock *common.Block) (ledger.PeerLedger, error)
//CreateLedgerFromSnapshot使用给定的快照创建一个新的分类帐,并返回分类帐和通道ID。
//此功能保证创建分类帐和所有分类帐数据库都是原子操作。
//从快照元数据中检索的通道ID被视为分类帐ID
func (m *LedgerMgr) CreateLedgerFromSnapshot(snapshotDir string) (ledger.PeerLedger, string, error)
//根据id打开账本
func (m *LedgerMgr) OpenLedger(id string) (ledger.PeerLedger, error)
//返回账本管理器所创建的账本id列表
func (m *LedgerMgr) GetLedgerIDs() ([]string, error)
//关闭所有账本及其占用的资源
func (m *LedgerMgr) Close()
//根据id获取已经打开的账本
func (m *LedgerMgr) getOpenedLedger(ledgerID string) (ledger.PeerLedger, error)
其中一些方法返回实现PeerLedger接口的账本结构
PeerLedger
PeerLedger接口由kvledger实现
core/ledger/kvledger/kv_ledger.go
下一篇详细介绍账本管理相关的源码