tron
的数据库设计是在基于leveldb
的基础上抽像自己的相关业务,设计出基于自己的业务数据操作类。
有两大块分别是:
从两个角度进行梳理:
数据库相关的接口比较多,有些关系结构看起来功能相似,反而不容易区分出差异。下面按照功能职责划分。
作用:提供基础数据库基础操作方法。
put
、get
、delete
等相关操作,包含两个抽象类。作用:提供基于可回退的数据库操作。提供内存快照功能,管理指针对Session的处理:
相关接口、类如下:
db.version = 1
, 方式:向数据库写入数据之前,将修改过程保存到内存,然后再将数据写到数据库,当需要数据回退的时候,根据内存保存的数据修改过程,还原数据库中的数据。
b. db.version = 2
,方式:向数据库写入的数据都是不可回退的数据,而将可回退的数据写入到内存,当可回退的数据变成不可回退的时候即固化,再将数据写入到数据库。
c. db.version=1
这种方式,如果服务出现异常,回退就丢失了,不利于回退。作用:维护session状态,包括:创建、合并、刷盘等操作。 顶层接口:RevokingDatabase,数据库模型:构建内存快照链表。 使用可回退数据库模型TronStoreWithRevoking,未固化块均存在于内存快照中,固化块存在于底层数据库LevelDB或者rocksDB中。 基于SnapshotRoot快照模型
每一个Snapshot
就是内存当中的一个数据结构,是当前整个数据库的状态,是整个数据库的状态。
就是说,每一个Snapshot保存的是某个块高的快照状态。
怎么理解? 首先,状态只跟区块有关,每个Snapshot对应一个当前区块状态,如: Snapshot1 对应 block=10001。
比如:block=10001的状态是: account1=100 account2=222
Snapshot2 对应 block=10002。
比如:block=10001的状态是: account1=110 account2=333
至于为什么是这样对应,为什么要这样设计,这样设计的用意、为了解决什么问题、好处、可能出现的问题,后面讲。