Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

NEL发布NEO Key-Value数据库LightDB

不明白不知道
143 0 0
有一部分是要改造NEO的存储部分为网络存储,并且可以用轻型节点直接找网络数据库去执行InvokeScript
4 Z# }8 |  }& G% `, J6 k也就是把Neo的一个节点一个进程的模式,改造为一个节点一个集群。# Y7 {, }2 K- O/ S% H) \9 m3 q& n
完成这个目标的基础,就是这个网络数据库需要一个类似的很低成本的读snapshot支持。
# b  e/ f5 T" H' }所以我选择了rocksdb作为这个基础,rocksdb是facebook 基于leveldb魔改的一个改进版本。
6 J0 h3 a$ A5 ~5 E那么为什么要追加数据类型和表的概念?- i. l: e5 V% i1 A4 O1 D1 J6 P7 L& D
因为leveldb使用中存储的东西都是byte[],而很多时候我们使用neo中得到的byte[] 都不知道是什么东西,要靠相应的约定。* N$ K1 }9 w6 V
我觉得这个很不方便,所以我们存储的单位不是byte[] 而是一个结构体 DBValue,他可以描述自己是什么数据类型,整数,string,byte[],bigint,小数,等等。$ w+ R: T9 y4 g: M
这个结构体里面还预留了给每一个值附加信息的功能,也记录了这个值最终修改的时间戳(存储高度)
* G# @& D5 c/ c9 k# f至于表就更好理解了,这是使用leveldb的一个自然需求,keyvalue数据库是一个字典,可是我们存进去的东西,从逻辑上是分为几个字典的,交易字典,utxo字典,等等等。3 A/ n! t! m1 h* L
我们只是把这个分字典的自然需求,在数据库层面直接提供了。  g" k6 l# c0 W3 ~5 B+ A
然后是网络层,选择了websocket作为通讯方法,完全是基于将来是网页的天下的考虑。因为存储这个功能被独立出来,甚至可以写一条链,他完全是在网页中运行的。
6 ^( v0 `" }5 h# y当然目前还没有想那么多,但可以预见到越来越多的业务会在网络中运行,因为这个数据库的出现,nel目前的至少50%的查询需求可以不通过后台服务器,js直接完成。
4 o3 F  ]! z! Y比如nep5资产的blanceof,比如交易UTXO数据的确认。5 M, \( f$ i, N8 F$ ?) W6 i1 l
其三,数据库的存储模仿了区块链的结构,以taskblock为单位,首尾相接。毕竟一开始这个项目的名字就叫lightchain.4 h. u2 p" y  _: J0 \
后来一想,这个名字有点烂大街了,数据库还是老老实实的叫DB吧$ h' H- o! g% b9 f+ U
为什么要以taskblock为单位呢,因为便于同步。数据库读写分离是性能扩展的必然走向,而把每一个操作记录下来,从数据库只要从主数据库取得每一个block,自己执行一遍,就同步完了。
# C  {) h5 G8 F3 Q对了还有一点也很像NEO区块链,我们的写入权限控制不是用密码,而是用私钥,而且还是和NEO完全兼容的私钥- v& O9 ]+ k' J9 Y, }0 l- B
最后,还有一个很重要的功能,checkpoint,这也是rocksdb提供的礼物,可以快速的在本地产生一个新的数据库副本。这样我们做链上数据快照的手段就更多了,传统手段是用爬虫爬取要快照的数据,爬到指定高度,停。现在又多了一个手段,约定时间快照,到时间了,啪,一个checkpoint,整个数据库都备份下来了。% ]! p3 M) f  i! w$ Z
不过当数据量达到G的级别,这个checkpoint性能是怎样的,还是需要测试确认的$ k3 v/ t. H( C7 \; ]( m8 h$ k
项目使用方法9 {+ |! p" W0 ^
一、开服务器
- @; ^  @9 V2 T, t0 I8 w- @" L; p获取lightdb.server,生成
. u9 `) j& p1 `, C" w6 o7 N启动之前看一下config
- K0 ?8 b8 _- c' {3 o; l. y# n4 s. B! H
Server_port 服务端口
. ]6 m2 o- W) {Server_storage_path 数据库存储路径6 \. e, K2 x" P& m  T  H
Server_type 读写分离用,从机模式还没开发呢,只能Master
. j0 S& M+ h. V2 iStorage_maindb_magic 提供一个魔法字串,好让这个库特立独行
% C: q9 d7 f7 [# m$ y会写入库中,数据库创建之后,改这个值就没意义了; @& c& }4 K% G+ I
Storage_maindb_firstwriter_address 提供一个NEO地址,他将成为第一个有写入权限的人,实际上还没开发追加写入人的功能,他就是唯一一个。
7 V& t2 s4 b6 c- }& @会写入库中,数据库创建之后,改这个值就没意义了" z8 U5 r/ Z; l, E! h) I/ f
然后启动server,支持linux windows,在win10,unbutu,centos测试过,linux下需安装依赖库,参考facebook rocksdb项目的说明+ @' p$ z) A  z% q9 [. V, f
https://github.com/facebook/rocksdb/blob/master/INSTALL.md8 X! l4 q$ k, s. L2 k1 P4 e
中的Supported platforms一节
# ~- t; b% D& ~2 T) u& X, c
/ i6 s! c1 V5 D; m1 d' c
) N! c, f7 y4 a; p0 p如果路径里没有创建过数据库会新建,否则会打开8 y/ a# ^  _  |! o) q1 y8 r

0 x5 R, I- i6 G& d! {' a4 F控制台目前只有db.state 和 db.block 两个功能
, f6 X, _0 j5 d; n
- z; M! N' C7 \3 }Db.block 会把block解析开,我们可以看到每个block都干了些啥,value都是DBvalue,用DBValue结构体去查看就能看到类型
7 _6 _/ q# D+ m; H二、客户端使用) t, L  q: l# V& N0 z# a
首先引用lightdb.sdk,可以下源码,可以nuget; A# n4 n% |5 u* {! P! N! O

( e) V0 I1 [& N$ uNew一个client对象
2 m' R( u# t, i: f/ ]
4 `" _) N; }" r$ s" ~2 c( P/ i注册,断线事件,然后Connect- s$ ^  e' B7 l6 E
如果连接成功,就OK' J+ ~: e$ t0 Y& [) e
不需要登陆啥的,读随便,写的时候,需要你先签好名6 }+ D6 g; b8 i
Ping 与dbstate
$ g+ u+ X9 {: y8 F  N  O- Z8 }- n) M& ~% q! y
所有的读操作都是通过snap来进行的
4 m! b4 W  d- c5 I! ?+ W
+ B% K- U2 S6 q8 X7 r所以先要获取一个snapshot5 |) Q$ z% b9 G5 u2 n1 g
然后就可以getblock
# x$ T1 Z9 B# W3 Z# y( ?
% i% l" l8 Q, r1 i$ }; e% |Getblockhash% X( V1 ~/ o- C7 ?0 g6 ~
! p( u6 }0 W8 B5 U4 \! P: _6 O, O
Getvalue
7 h' s6 t! a+ O# T9 ]2 rclient.Post_snapshot_getvalue(snapshotid, tableid, key);+ u/ L7 P: ]: n! \5 O, Z
要写数据就比较复杂了- Z  Q) |+ _  O6 G4 `

% G5 }7 n/ K& F( j) v首先创建个writetask对象,所有的写入,都通过writetask对象完成,
! y0 E% t7 b8 n% p" f- O, r然后创建signdata对象,进行签名* D3 P& H6 Q% D/ H/ G  W6 t0 k8 [
然后将这两个东西post给服务器。有对应的私钥才能完成签名,成功写入数据。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

不明白不知道 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    1