区块链教程Fabric1.0源代码分析ledgerID数据库-兄弟连区块链教程
1、idStore概述
- Fabric支持创建多个Ledger,不同Ledger以ledgerID区分。
- 多个ledgerID及其创世区块存储在idStore数据库中,idStore数据库基于leveldb实现。
- idStore默认使用路径:/var/hyperledger/production/ledgersData/ledgerProvider/。
- idStore库中特殊key "underConstructionLedgerKey",用于标志最新在建的ledgerID,ledgerID创建成功后或失败时该标志将清除,另外此标志也用于异常时按ledgerID恢复数据。
- idStore相关代码集中在core/ledger/kvledger/kv_ledger_provider.go。
2、idStore结构体定义
leveldbhelper更详细内容,参考:Fabric 1.0源代码笔记 之 LevelDB(KV数据库)
type idStore struct { db *leveldbhelper.DB } //代码在core/ledger/kvledger/kv_ledger_provider.go
3、idStore方法定义
func openIDStore(path string) *idStore //按path创建并打开leveldb数据库 func (s *idStore) setUnderConstructionFlag(ledgerID string) error //设置ledgerID在建标志,将key为"underConstructionLedgerKey",value为ledgerID写入库 func (s *idStore) unsetUnderConstructionFlag() error //取消ledgerID在建标志(确认构建失败时),删除key"underConstructionLedgerKey" func (s *idStore) getUnderConstructionFlag() (string, error) //获取ledgerID在建标志(按ledgerID恢复时),按key"underConstructionLedgerKey",取ledgerID func (s *idStore) createLedgerID(ledgerID string, gb *common.Block) error //创建LedgerID,即以ledgerID为key,将创世区块写入库 func (s *idStore) ledgerIDExists(ledgerID string) (bool, error) //查找ledgerID是否存在,即查库中key为ledgerID是否存在 func (s *idStore) getAllLedgerIds() ([]string, error) //获取ledgerID列表 func (s *idStore) close() //关闭idStore leveldb数据库 func (s *idStore) encodeLedgerKey(ledgerID string) []byte //为ledgerID添加前缀即"l" func (s *idStore) decodeLedgerID(key []byte) string //解除ledgerID前缀 //代码在core/ledger/kvledger/kv_ledger_provider.go
func (s idStore) createLedgerID(ledgerID string, gb common.Block) error代码如下:
将ledgerID和Block入库,并清除ledgerID在建标志。
func (s *idStore) createLedgerID(ledgerID string, gb *common.Block) error { key := s.encodeLedgerKey(ledgerID) //为ledgerID添加前缀即"l" var val []byte var err error if val, err = proto.Marshal(gb); err != nil { //Block序列化 return err } if val, err = s.db.Get(key); err != nil { return err } if val != nil { return ErrLedgerIDExists //ledgerID已存在 } batch := &leveldb.Batch{} batch.Put(key, val) //ledgerID和Block入库 batch.Delete(underConstructionLedgerKey) //清除ledgerID在建标志 return s.db.WriteBatch(batch, true) //提交执行 } //代码在core/ledger/kvledger/kv_ledger_provider.go
感谢关注兄弟连区块链教程分享!
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
区块链教程Fabric1.0源代码分析Ledger historydb历史数据库
1、historydb概述 historydb,用于存储所有块读写集中写集的内容。代码分布在core/ledger/kvledger/history/historydb目录下,目录结构如下: historydb.go,定义核心接口HistoryDBProvider和HistoryDB。 histmgr_helper.go,historydb工具函数。 historyleveldb目录,historydb基于leveldb的实现。* historyleveldb.go,HistoryDBProvider和HistoryDB接口实现,即historyleveldb.HistoryDBProvider和historyleveldb.historyDB结构体及方法。 * historyleveldb_query_executer.go,定义LevelHistoryDBQueryExecutor和historyScanner结构体及方法。 2、核心接口定义 HistoryDBProvider接口定义: type HistoryDBProvider interface { GetDBHandle(...
- 下一篇
Java学习----Collection总结
Java----Collection总结 集合,存储多个元素的容器----大小不定。 在集合这块主要的内容有: 接口:CollectionIteratorList SetMap 类:ArrayList LinkedList stackqueue hashMap hashTable 本篇为Collection的总结,才开始学习Java,在集合这块看资料总是感觉一团乱麻。所以写这个总结,一方面把自己知道的东西梳理一下,另一方面初学水平有限,如果有错误还请各位大神能够指点,还有就是刚开始玩社区,希望能够获取一点积分,嘿嘿。希望有一天,能够学习JAVA,加入Ali。 Collection接口 Collection是集合层次的根接口。由于泛型的限制,集合中只能存储对象。泛型只能表示引用类型。 Collection定义中的主要方法,就是说当要实现一个Collection的时候,要先实现以下方法(不全,可以查看API稳定): public interface Collection<E> extends Iterable<E>{ int size(); boolean isEm...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS7设置SWAP分区,小内存服务器的救世主