Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
S
share
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
JIRA
JIRA
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
张振华
share
Commits
44844bbe
Commit
44844bbe
authored
Sep 03, 2018
by
张振华
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
增加对mvcc机制的简要介绍
parent
00ff43ff
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
26 additions
and
4 deletions
+26
-4
Store新增支持MVCC的KVDB实现.md
Store新增支持MVCC的KVDB实现.md
+26
-4
No files found.
Store新增支持MVCC的KVDB实现.md
View file @
44844bbe
# 一、现状 #
# 一、关于MVCC机制的简要说明 #
# 一、现状 #
# 一、关于MVCC机制的简要说明 #
## 1.以太坊中的StateDB
Store模块的Mavl Tree和以太坊的StateDB的实现方式比较类似:
以太坊的StateDB在设计上并不会每生成一个块的时候都复制一份,而是重用树节点,在新块生成的时候,只改变发生状态变化的节点(通过写dirty标记),然后引用原来未变化的节点,重新计算变化节点到根路径上所有节点的哈希,即相当于生成一颗新树(State Root Hash发生了变化):

有了StateDB的这种设计,在区块链代码中的业务实现逻辑就会非常简单,如果需要修改账户数据(余额变更、新增合约、废弃合约等),直接操作内存中的StateDB即可,在块生成之前,系统会根据变更的信息,重新生成哈希,并将变更写到数据库。
StateDB的这种设计使用起来非常方便,但是也存在一定的问题:
(1)因为它保存了所有的数据,随着时间的增长,这棵树会越来越大,占用越来越多的磁盘空间。
(2)对于历史数据,需要根据特定区块的State Root Hash建立起树形结构,并查找相关kv信息,并不能做到KV数据库的根据主键直接查询的快速简捷。
## 2.Chain33中的MVCC机制
而Chain33当前引入的MVCC机制,借鉴了数据库设计中的MVCC理念(Multi-Version Concurrency Control 多版本并发控制),并结合区块链数据的特点:
(1)历史数据多(历史区块及交易数据),当前修改的数据少(当前正在生成的区块及交易数据);
(2)历史数据不能修改,修改只发生在当前正在生成的区块上;
(3)读历史数据的比例高(对历史区块数据的读取),写数据的比例低(新生成区块中修改数据);

根据上图示意:
主键为Key的变量值在区块高度101、102中均发生变化,对应的在KVDB中有Key:101->value101和Key:102->value102两个历史版本数据,在当前区块104中正在写入新值Key:104->value104;
那么对于历史数据Key:101、Key:102可以有很多并发的读,对于Key:104有唯一的当前写,这些读写操作可以并发互不影响的执行,并且这些数据可以平铺存储在普通的KVDB中,读写只要根据块高作为版本号与Key构成唯一主键即可(Key:version或者Key:height),不需要构建树形结构来读取历史值和改变当前值,这对于数据读写的效率提升会有比较大的帮助。
# 二、Chain33中的Store及MVCC实现现状 #
## 1.Store与外部的交互消息接口 ##
## 1.Store与外部的交互消息接口 ##


...
@@ -92,12 +114,12 @@ TotalFeeKey:hash->fee
...
@@ -92,12 +114,12 @@ TotalFeeKey:hash->fee
# 二、需求 #
# 二、
Store模块支持MVCC的KVDB的
需求 #
针对Store模块,需要建立一种支持MVCC机制的KVDB实现,达到以下目的:
针对Store模块,需要建立一种支持MVCC机制的KVDB实现,达到以下目的:
1.
历史数据可以保留下来,供查询使用,并能够支持数据回滚。
1.
历史数据可以保留下来,供查询使用,并能够支持数据回滚。
2.
支持MVCC机制,除了保留下来历史版本数据,还可以把多版本数据存储在结构是线性平铺的KV数据库中,不需要使用复杂的树形结构来维护数据,对于系统性能提升有帮助,即使数据量达到一定程度,系统性能不发生明显的下降。
2.
支持MVCC机制,除了保留下来历史版本数据,还可以把多版本数据存储在结构是线性平铺的KV数据库中,不需要使用复杂的树形结构来维护数据,对于系统性能提升有帮助,即使数据量达到一定程度,系统性能不发生明显的下降。
# 三、方案描述(正在实现) #
# 三、
具体
方案描述(正在实现) #
##配置文件中和Store相关的如下配置增加取值
##配置文件中和Store相关的如下配置增加取值
[
store
]
[
store
]
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment