编程语言
首页 > 编程语言> > fabric2.3版本源码记录_2

fabric2.3版本源码记录_2

作者:互联网

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?

账本管理

启发:在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
}

其中有两个比较重要:

账本提供者

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


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

标签:fabric2.3,分类帐,ledger,LedgerMgr,源码,PeerLedger,版本,go,账本
来源: https://www.cnblogs.com/dongjl/p/14588768.html