writer:布羽
ProtoBuf在fabric中,交换数据的格式采用protobuf,而非XML或者JsON。其引入了fabric-rpotos-go这个底层项目。
https://github.com/hyperledger/fabric-protos-go
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.gopeerInstance.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 channelstype 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.gotype 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被视为分类帐IDfunc (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接口的账本结构
PeerLedgerPeerLedger接口由kvledger实现
core/ledger/kvledger/kv_ledger.go
下一篇详细介绍账本管理相关的源码
总结以上是内存溢出为你收集整理的fabric2.3版本源码记录_2全部内容,希望文章能够帮你解决fabric2.3版本源码记录_2所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)