区块链教程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将获取最新Block
    GetBlocksIterator(startBlockNumber uint64) (ResultsIterator, error) //获取从startBlockNumber开始的迭代器(包含startBlockNumber),迭代器是阻塞迭代,直到ledger中下一个block可用
    Close() //关闭ledger
    Commit(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即为namespace
    GetStateMultipleKeys(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) //执行查询并返回迭代器,仅用于查询statedb
    Done() //释放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写入value
    DeleteState(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 //ledgerID
    blockStore blkstorage.BlockStore //blkstorage
    txtmgmt    txmgr.TxMgr //txmgr
    historyDB  historydb.HistoryDB //historyDB
}
//代码在core/ledger/kvledger/kv_ledger.go

涉及方法如下:

//构造kvLedger
func newKVLedger(ledgerID string, blockStore blkstorage.BlockStore,versionedDB statedb.VersionedDB, historyDB historydb.HistoryDB) (*kvLedger, error)
//按最后一个有效块恢复statedb和historydb
func (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)
//获取BlockchainInfo
func (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,写集本身入historyDB
func (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 //idStore
    blockStoreProvider blkstorage.BlockStoreProvider //blkstorage
    vdbProvider        statedb.VersionedDBProvider //statedb
    historydbProvider  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,并恢复之前未完成创建的Ledger
func NewProvider() (ledger.PeerLedgerProvider, error)
//按创世区块创建并打开Ledger,提交创世区块(块入blkstorage,写集更新statedb,写集本身写入historydb),创建ledgerID
func (provider *Provider) Create(genesisBlock *common.Block) (ledger.PeerLedger, error)
//调用provider.openInternal(ledgerID),打开Ledger
func (provider *Provider) Open(ledgerID string) (ledger.PeerLedger, error)
//按ledgerID打开blkstorage、statedb和historydb,并创建kvledger
func (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、historydb
func (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,并加入openedLedgers
func CreateLedger(genesisBlock *common.Block) (ledger.PeerLedger, error) 
//按id取Ledger,并调用ledgerProvider.Open(id)打开Ledger
func OpenLedger(id string) (ledger.PeerLedger, error) 
//获取ledgerID列表,调取ledgerProvider.List()
func GetLedgerIDs() ([]string, error)
//关闭ledgerProvider
func Close()
//构造closableLedger
func wrapLedger(id string, l ledger.PeerLedger) ledger.PeerLedger
//代码在core/ledger/ledgermgmt/ledger_mgmt.go

closableLedger:

type closableLedger struct {
    id string
    ledger.PeerLedger
}

func (l *closableLedger) Close() //调取l.closeWithoutLock()
func (l *closableLedger) closeWithoutLock() //delete(openedLedgers, l.id)
//代码在core/ledger/ledgermgmt/ledger_mgmt.go
相关文章
|
28天前
|
安全 区块链
区块链积分商城系统开发详细指南//需求功能/指南教程/源码流程
Developing a blockchain points mall system involves multiple aspects such as blockchain technology, smart contracts, front-end development, and business logic design. The following is the general process for developing a blockchain points mall system
|
24天前
|
供应链 区块链 数据安全/隐私保护
探索区块链技术在金融领域的应用与前景分析
本文将深入探讨区块链技术在金融领域的具体应用场景,分析其优势与挑战,并展望未来发展趋势。通过案例分析和技术解析,揭示区块链技术在金融行业中的革新意义及前景。
|
1月前
|
安全 区块链
区块链游戏系统开发步骤需求丨功能逻辑丨规则玩法丨指南教程丨源码详细
Developing blockchain game systems has been a highly anticipated field in recent years. By combining blockchain technology and game mechanics, players can enjoy a brand new gaming experience and higher game credibility.
|
7月前
|
区块链
区块链的发币流程技术分析
区块链现在是发展的如火如荼,很多人都想趁着这个风口,投入区块链创业的浪潮中。 那么我们该怎么做才能抓住这个机会呢? 进行区块链发币要求是很多的,主要有以下几个步骤。
|
7月前
|
安全 算法 区块链
区块链交易所开发技术说明:智能合约设计与实现步骤实现分析
智能合约是区块链技术的核心应用,其能够自动执行、验证和执行合同,并以可验证的方式进行操作。在区块链交易所中,智能合约扮演着重要的角色,它们保证了交易的透明性、效率和安全性。作为一名专业的交易所开发团队一员,在交易所开发这块拥有相对成熟的开发技术,目前已经有成熟的区块链交易所开发案例。本文将介绍如何设计和实现可靠的智能合约来支持区块链交易所。
|
7月前
|
区块链 安全 数据安全/隐私保护
区块链LP流动性SWAP博饼交易所系统开发分析模式
Web3在生态的每一个要素中,都体现出了去中心化的特点。
|
7月前
|
SQL 安全 区块链
交易所系统开发(案例项目)丨区块链交易所系统开发(稳定版)/成熟技术/步骤逻辑/源码教程
The development of a blockchain exchange system involves complex technologies and functions.
|
8月前
|
区块链
区块链DAO众筹资金模式合约开发源代码详情
// 众筹函数,向DAO众筹资金 function contribute() public { uint contributionAmount = (unitPrice * msg.value).div(10 ether); // 计算贡献金额,最小单位为0.01ETH
|
8月前
|
安全 Go 区块链
区块链游戏链游系统开发功能详情丨方案逻辑丨开发项目丨案例分析丨源码规则
 In recent years, with the continuous development of blockchain technology, NFTs (non homogeneous tokens) and DAPPs (decentralized applications) have emerged in the gaming industry.
|
9月前
|
存储 前端开发 JavaScript
区块链交易所系统开发(正式版)丨DEX/DEFI/SWAP去中心化智能合约系统开发详细案例/方案项目/技术分析/源码功能
  去中心化存储技术是一种新型存储技术,它改变了传统的集中式存储技术,将数据从单一位置移到多个位置,这样就消除了存储数据的中心机构或服务器的责任,增加了安全性和数据的有效存储,确保用户的数据安全性。

热门文章

最新文章