区块链教程Fabric1.0源代码分析Ledger(账本)二
区块链教程 Fabric1.0源代码分析Ledger(账本)二。
Fabric 1.0源代码笔记 之 Ledger(账本)
补充PeerLedger接口嵌入的commonledger.Ledger接口定义如下:
type Ledger interface {GetBlockchainInfo() (*common.BlockchainInfo, error) //获取blockchain基本信息GetBlockByNumber(blockNumber uint64) (*common.Block, error) //按给定高度获取Block,给定math.MaxUint64将获取最新BlockGetBlocksIterator(startBlockNumber uint64) (ResultsIterator, error) //获取从startBlockNumber开始的迭代器(包含startBlockNumber),迭代器是阻塞迭代,直到ledger中下一个block可用Close() //关闭ledgerCommit(block *common.Block) error //提交新block}//代码在common/ledger/ledger_interface.go
ValidatedLedger接口暂未定义方法,从PeerLedger筛选出无效交易后,ValidatedLedger表示最终账本。暂时忽略。
QueryExecutor接口定义:用于执行查询。
其中Get*方法用于支持KV-based数据模型,ExecuteQuery方法用于支持更丰富的数据和查询支持。
type QueryExecutor interface {GetState(namespace string, key string) ([]byte, error) //按namespace和key获取value,对于chaincode,chaincodeId即为namespaceGetStateMultipleKeys(namespace string, keys []string) ([][]byte, error) //一次调用获取多个key的值//获取迭代器,返回包括startKey、但不包括endKeyd的之间所有值GetStateRangeScanIterator(namespace string, startKey string, endKey string) (commonledger.ResultsIterator, error)ExecuteQuery(namespace, query string) (commonledger.ResultsIterator, error) //执行查询并返回迭代器,仅用于查询statedbDone() //释放QueryExecutor占用的资源}//代码在core/ledger/ledger_interface.go
HistoryQueryExecutor接口定义:执行历史记录查询。
type HistoryQueryExecutor interface {GetHistoryForKey(namespace string, key string) (commonledger.ResultsIterator, error) //按key查历史记录}//代码在core/ledger/ledger_interface.go
TxSimulator接口定义:在"尽可能"最新状态的一致快照上模拟交易。
其中Set*方法用于支持KV-based数据模型,ExecuteUpdate方法用于支持更丰富的数据和查询支持。
type TxSimulator interface {QueryExecutor //嵌入QueryExecutor接口SetState(namespace string, key string, value []byte) error //按namespace和key写入valueDeleteState(namespace string, key string) error //按namespace和key删除SetStateMultipleKeys(namespace string, kvs map[string][]byte) error //一次调用设置多个key的值ExecuteUpdate(query string) error //ExecuteUpdate用于支持丰富的数据模型GetTxSimulationResults() ([]byte, error) //获取模拟交易的结果}//代码在core/ledger/ledger_interface.go
4、kvledger.kvLedger结构体及方法(实现PeerLedger接口)
kvLedger结构体定义:
type kvLedger struct {ledgerID string //ledgerIDblockStore blkstorage.BlockStore //blkstoragetxtmgmt txmgr.TxMgr //txmgrhistoryDB historydb.HistoryDB //historyDB}//代码在core/ledger/kvledger/kv_ledger.go
涉及方法如下:
//构造kvLedgerfunc newKVLedger(ledgerID string, blockStore blkstorage.BlockStore,versionedDB statedb.VersionedDB, historyDB historydb.HistoryDB) (*kvLedger, error)//按最后一个有效块恢复statedb和historydbfunc (l *kvLedger) recoverDBs() error//检索指定范围内的块, 并将写入集提交给状态 db 或历史数据库, 或同时func (l *kvLedger) recommitLostBlocks(firstBlockNum uint64, lastBlockNum uint64, recoverables ...recoverable) error//按交易ID获取交易func (l *kvLedger) GetTransactionByID(txID string) (*peer.ProcessedTransaction, error)//获取BlockchainInfofunc (l *kvLedger) GetBlockchainInfo() (*common.BlockchainInfo, error)//按区块编号获取块func (l *kvLedger) GetBlockByNumber(blockNumber uint64) (*common.Block, error)//按起始块获取块迭代器func (l *kvLedger) GetBlocksIterator(startBlockNumber uint64) (commonledger.ResultsIterator, error)//获取块哈希func (l *kvLedger) GetBlockByHash(blockHash []byte) (*common.Block, error)//按交易ID获取块func (l *kvLedger) GetBlockByTxID(txID string) (*common.Block, error)//按交易ID获取交易验证代码func (l *kvLedger) GetTxValidationCodeByTxID(txID string) (peer.TxValidationCode, error)func (l *kvLedger) Prune(policy commonledger.PrunePolicy) error //暂未实现//创建交易模拟器func (l *kvLedger) NewTxSimulator() (ledger.TxSimulator, error)//创建查询执行器func (l *kvLedger) NewQueryExecutor() (ledger.QueryExecutor, error)func (l *kvLedger) NewHistoryQueryExecutor() (ledger.HistoryQueryExecutor, error)//提交有效块,块写入blkstorage,块中写集加入批处理并更新statedb,写集本身入historyDBfunc (l *kvLedger) Commit(block *common.Block) error//创建历史记录查询执行器func (l *kvLedger) Close() //关闭//代码在core/ledger/kvledger/kv_ledger.go
5、kvledger.Provider结构体及方法(实现PeerLedgerProvider接口)
Provider结构体定义:
type Provider struct {idStore *idStore //idStoreblockStoreProvider blkstorage.BlockStoreProvider //blkstoragevdbProvider statedb.VersionedDBProvider //statedbhistorydbProvider historydb.HistoryDBProvider //historydb}//代码在core/ledger/kvledger/kv_ledger_provider.go
idStore更详细内容,参考:Fabric 1.0源代码笔记 之 Ledger #idStore(ledgerID数据库)
blkstorage更详细内容,参考:Fabric 1.0源代码笔记 之 Ledger #blkstorage(block文件存储)
statedb更详细内容,参考:Fabric 1.0源代码笔记 之 Ledger #statedb(状态数据库)
historydb更详细内容,参考:Fabric 1.0源代码笔记 之 Ledger #historydb(历史数据库)
涉及方法如下:
//分别构造idStore、blockStoreProvider、vdbProvider和historydbProvider,并用于构造Provider,并恢复之前未完成创建的Ledgerfunc NewProvider() (ledger.PeerLedgerProvider, error)//按创世区块创建并打开Ledger,提交创世区块(块入blkstorage,写集更新statedb,写集本身写入historydb),创建ledgerIDfunc (provider *Provider) Create(genesisBlock *common.Block) (ledger.PeerLedger, error)//调用provider.openInternal(ledgerID),打开Ledgerfunc (provider *Provider) Open(ledgerID string) (ledger.PeerLedger, error)//按ledgerID打开blkstorage、statedb和historydb,并创建kvledgerfunc (provider *Provider) openInternal(ledgerID string) (ledger.PeerLedger, error)//ledgerID是否存在func (provider *Provider) Exists(ledgerID string) (bool, error)//获取ledgerID列表,调取provider.idStore.getAllLedgerIds()func (provider *Provider) List() ([]string, error)//关闭idStore、blkstorage、statedb、historydbfunc (provider *Provider) Close()//检查是否有之前未完成创建的Ledger,并恢复func (provider *Provider) recoverUnderConstructionLedger()func (provider *Provider) runCleanup(ledgerID string) error //暂时没有实现func panicOnErr(err error, mgsFormat string, args ...interface{}) //panicOnErr//代码在core/ledger/kvledger/kv_ledger_provider.go
6、ledgermgmt(Ledger管理函数)
全局变量:
var openedLedgers map[string]ledger.PeerLedger //Ledger map,Key为ChainID(即ChannelId或LedgerId)var ledgerProvider ledger.PeerLedgerProvider //LedgerProvider//代码在core/ledger/ledgermgmt/ledger_mgmt.go
Ledger管理函数:
func Initialize() //Ledger初始化,调用initialize(),once.Do确保仅调用一次func initialize() //Ledger初始化,包括初始化openedLedgers及ledgerProvider//调用ledgerProvider.Create(genesisBlock)创建Ledger,并加入openedLedgersfunc CreateLedger(genesisBlock *common.Block) (ledger.PeerLedger, error) //按id取Ledger,并调用ledgerProvider.Open(id)打开Ledgerfunc OpenLedger(id string) (ledger.PeerLedger, error) //获取ledgerID列表,调取ledgerProvider.List()func GetLedgerIDs() ([]string, error)//关闭ledgerProviderfunc Close()//构造closableLedgerfunc wrapLedger(id string, l ledger.PeerLedger) ledger.PeerLedger//代码在core/ledger/ledgermgmt/ledger_mgmt.go
closableLedger:
type closableLedger struct {id stringledger.PeerLedger}func (l *closableLedger) Close() //调取l.closeWithoutLock()func (l *closableLedger) closeWithoutLock() //delete(openedLedgers, l.id)//代码在core/ledger/ledgermgmt/ledger_mgmt.go
欢迎继续关注兄弟连区块链教程分享!
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/31557831/viewspace-2218252/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/31557831/viewspace-2218252/
区块链教程Fabric1.0源代码分析Ledger(账本)二相关推荐
- 区块链教程Fabric1.0源代码分析Ledger statedb(状态数据库)
Fabric 1.0源代码笔记 之 Ledger #statedb(状态数据库) 1.statedb概述 statedb,或VersionedDB,即状态数据库,存储了交易(transaction)日 ...
- 区块链教程Fabric1.0源代码分析scc(系统链码)
区块链教程Fabric1.0源代码分析scc(系统链码),2018年下半年,区块链行业正逐渐褪去发展之初的浮躁.回归理性,表面上看相关人才需求与身价似乎正在回落.但事实上,正是初期泡沫的渐退,让人们更 ...
- 区块链教程Fabric1.0源代码分析Tx(Transaction 交易)一
区块链教程Fabric1.0源代码分析Tx(Transaction 交易)一,2018年下半年,区块链行业正逐渐褪去发展之初的浮躁.回归理性,表面上看相关人才需求与身价似乎正在回落.但事实上,正是初期 ...
- 区块链教程Fabric1.0源代码分析Peer peer channel命令及子命令实现
区块链教程Fabric1.0源代码分析Peer peer channel命令及子命令实现,2018年下半年,区块链行业正逐渐褪去发展之初的浮躁.回归理性,表面上看相关人才需求与身价似乎正在回落.但事实 ...
- 兄弟连区块链教程Fabric1.0源代码分析configupdate处理通道配置更新
区块链教程Fabric1.0源代码分析configupdate处理通道配置更新,2018年下半年,区块链行业正逐渐褪去发展之初的浮躁.回归理性,表面上看相关人才需求与身价似乎正在回落.但事实上,正是初 ...
- 兄弟连区块链教程Fabric1.0源代码分析Peer peer根命令入口及加载子命令一
区块链教程Fabric1.0源代码分析Peer peer根命令入口及加载子命令,2018年下半年,区块链行业正逐渐褪去发展之初的浮躁.回归理性,表面上看相关人才需求与身价似乎正在回落.但事实上,正是初 ...
- 区块链教程Fabric1.0源代码分析流言算法Gossip服务端二
区块链教程Fabric1.0源代码分析流言算法Gossip服务端二 Fabric 1.0源代码笔记 之 gossip(流言算法) #GossipServer(Gossip服务端) 5.2.commIm ...
- 区块链教程Fabric1.0源代码分析configtx#genesis-兄弟连
区块链教程Fabric1.0源代码分析configtx#genesis,2018年下半年,区块链行业正逐渐褪去发展之初的浮躁.回归理性,表面上看相关人才需求与身价似乎正在回落.但事实上,正是初期泡沫的 ...
- 区块链教程Fabric1.0源代码分析配置交易-生成通道配置二
兄弟连区块链教程Fabric1.0源代码分析配置交易-生成通道配置二.Generator接口实现,即bootstrapper. type bootstrapper struct {channelGro ...
- gossip 区块链_区块链教程Fabric1.0源代码分析流言算法Gossip服务端一兄弟连区块链教程-阿里云开发者社区...
区块链教程Fabric1.0源代码分析流言算法Gossip服务端一,2018年下半年,区块链行业正逐渐褪去发展之初的浮躁.回归理性,表面上看相关人才需求与身价似乎正在回落.但事实上,正是初期泡沫的渐退 ...
最新文章
- PostgreSQL 异步IO实测
- iframe中跨域页面访问parent的方法
- PIN码 Adsense在线身份验证
- 数据库笔记03:管理数据表中的数据
- shell脚本统计httpd进程和子进程占用的CPU、内存大小,要求每隔5s统计一次
- Android——处理设备旋转Activity销毁时临时数据丢失的问题
- 阿里笔试的一道算法题
- Android View添加 Listener 小技巧示例
- 拼多多2018校招内推编程-大整数相乘
- idea关联mysql数据库具体操作
- DEV控件之ChartControl用法
- Sutton and Barto 教材中多臂老虎机(k-armed bandit testbed)模拟
- 网易互娱2017实习生招聘在线笔试第一场-1电子数字
- Carboxyrhodamine 110-PEG4-DBCO,羧罗丹明110-PEG4-DBCO是一种荧光标记染料
- matlab 输出矩阵 逗号隔开,在MATLAB中自定义矩阵时,矩阵同行元素之间用逗号隔开,而每一行元素之间用分号隔开。...
- 如何禁用笔记本电脑触摸板_您如何永久禁用笔记本电脑上的触摸板?
- 用matlab画图像,用MATLAB画出图像的幅度和方向角的图像并画出它们的直方图
- java实现商品sku_jquery实现商品sku多属性选择功能(商品详情页)
- 《C#高级编程第6版》 读书笔记 (张迅雷闪击C#系列)
- MapReduce中的自定义多目录/文件名输出转
热门文章
- centos6系统下载--国内镜像站点
- 分享深度学习的视频网址
- 启动docker-compose时报/usr/lib/python2.7/site-packages/requests/__init__.py:91: RequestsDependencyWarnin
- 计算机应用参考文献,计算机应用领域英文参考文献 哪里有计算机应用领域参考文献...
- Mysql 数据补位
- 老式十字锁自动碰锁,换锁芯
- 2021-2027全球与中国环卫云平台市场现状及未来发展趋势
- 学计算机土味情话,很套路的土味情话
- 给Testerhome测试小道消息做个硬广告
- Ubuntu VirtualBox虚拟机安装win7 win10全过程