fabric2.3版本源码记录_2

fabric2.3版本源码记录_2,第1张

概述fabrci源码记录2writer:布羽ProtoBuf在fabric中,交换数据的格式采用protobuf,而非XML或者JSON。其引入了fabric-rpotos-go这个底层项目。https://github.com/hyperledger/fabric-protos-gofabric-protos-go分析协议缓冲区(ProtocolBuffers)(Protobufs)像XML和JSON一样,可以让 fabrci源码记录2

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接口的账本结构

PeerLedger

PeerLedger接口由kvledger实现

core/ledger/kvledger/kv_ledger.go


下一篇详细介绍账本管理相关的源码

总结

以上是内存溢出为你收集整理的fabric2.3版本源码记录_2全部内容,希望文章能够帮你解决fabric2.3版本源码记录_2所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1244331.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存