Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

NEL发布NEO Key-Value数据库LightDB

不明白不知道
162 0 0
有一部分是要改造NEO的存储部分为网络存储,并且可以用轻型节点直接找网络数据库去执行InvokeScript
4 v8 d0 S2 e( J8 C# ~5 b也就是把Neo的一个节点一个进程的模式,改造为一个节点一个集群。
8 H2 X' o; j% p6 Z: C$ \1 U完成这个目标的基础,就是这个网络数据库需要一个类似的很低成本的读snapshot支持。5 u; V9 Y4 B  g# C
所以我选择了rocksdb作为这个基础,rocksdb是facebook 基于leveldb魔改的一个改进版本。
7 H( a1 ]! W8 p: n# t那么为什么要追加数据类型和表的概念?
; J4 q5 P) F% s4 L. `% _& \因为leveldb使用中存储的东西都是byte[],而很多时候我们使用neo中得到的byte[] 都不知道是什么东西,要靠相应的约定。( q0 Y: k* V; w+ l
我觉得这个很不方便,所以我们存储的单位不是byte[] 而是一个结构体 DBValue,他可以描述自己是什么数据类型,整数,string,byte[],bigint,小数,等等。# e* X) X$ S0 J
这个结构体里面还预留了给每一个值附加信息的功能,也记录了这个值最终修改的时间戳(存储高度)
6 C* [# [5 ~( N, l: V2 \$ M至于表就更好理解了,这是使用leveldb的一个自然需求,keyvalue数据库是一个字典,可是我们存进去的东西,从逻辑上是分为几个字典的,交易字典,utxo字典,等等等。( ^* U& o' h. n  j) j0 Z3 E
我们只是把这个分字典的自然需求,在数据库层面直接提供了。
; k' {- M, O9 w' G5 b3 S然后是网络层,选择了websocket作为通讯方法,完全是基于将来是网页的天下的考虑。因为存储这个功能被独立出来,甚至可以写一条链,他完全是在网页中运行的。
9 V' E: [& j. q' y: p当然目前还没有想那么多,但可以预见到越来越多的业务会在网络中运行,因为这个数据库的出现,nel目前的至少50%的查询需求可以不通过后台服务器,js直接完成。, `! Y" W6 R, z# G' U
比如nep5资产的blanceof,比如交易UTXO数据的确认。
% J0 ~) {1 V9 Z# O" G) r  w其三,数据库的存储模仿了区块链的结构,以taskblock为单位,首尾相接。毕竟一开始这个项目的名字就叫lightchain.
6 V2 z( Y# m! p* a' n7 O" B  \. o! W后来一想,这个名字有点烂大街了,数据库还是老老实实的叫DB吧
8 I3 v) {% V' D; k为什么要以taskblock为单位呢,因为便于同步。数据库读写分离是性能扩展的必然走向,而把每一个操作记录下来,从数据库只要从主数据库取得每一个block,自己执行一遍,就同步完了。! f5 J8 R# Z, Y( K6 {% x
对了还有一点也很像NEO区块链,我们的写入权限控制不是用密码,而是用私钥,而且还是和NEO完全兼容的私钥
8 e" g- e: @/ m# Q% u/ [& @0 {最后,还有一个很重要的功能,checkpoint,这也是rocksdb提供的礼物,可以快速的在本地产生一个新的数据库副本。这样我们做链上数据快照的手段就更多了,传统手段是用爬虫爬取要快照的数据,爬到指定高度,停。现在又多了一个手段,约定时间快照,到时间了,啪,一个checkpoint,整个数据库都备份下来了。' c4 R6 ?' k3 O, Y8 x( s4 y
不过当数据量达到G的级别,这个checkpoint性能是怎样的,还是需要测试确认的
4 p$ K- D( V$ U9 f项目使用方法9 L7 W+ s; [8 {$ {/ Z5 q8 ~2 l$ A- x
一、开服务器
1 X8 n5 c) q0 X" t获取lightdb.server,生成
& i+ N& r  ~/ Q$ W. B) h# {启动之前看一下config4 a% c- e1 D) y$ i' d2 I! X: c
  N* f4 f& ~, q9 j; k8 F
Server_port 服务端口
4 E5 ^& v2 }8 C7 S5 q( X; [! o/ LServer_storage_path 数据库存储路径5 L' t6 T9 a: L4 U  K
Server_type 读写分离用,从机模式还没开发呢,只能Master
# y/ h* E5 T$ H0 RStorage_maindb_magic 提供一个魔法字串,好让这个库特立独行
: r0 d: f: `( v/ |; A9 \! Y会写入库中,数据库创建之后,改这个值就没意义了
: q, w; F0 F0 }& N( D+ a* S7 MStorage_maindb_firstwriter_address 提供一个NEO地址,他将成为第一个有写入权限的人,实际上还没开发追加写入人的功能,他就是唯一一个。
4 y1 U, B: B7 F) a6 n会写入库中,数据库创建之后,改这个值就没意义了5 X/ \" P( H* d0 B2 y" P
然后启动server,支持linux windows,在win10,unbutu,centos测试过,linux下需安装依赖库,参考facebook rocksdb项目的说明
; \/ y" W5 L) l" {https://github.com/facebook/rocksdb/blob/master/INSTALL.md4 G+ b6 I" ]% G' s1 O
中的Supported platforms一节' t% j7 R( i7 k$ Y3 u
7 w3 a$ \5 C- Q

( \* z% k! I4 Z, ]  ^5 j. P3 L" ?如果路径里没有创建过数据库会新建,否则会打开7 G, M% p8 [0 T! m( r2 R

. l, [; w1 N3 M3 K. `: v- J- v  n( ]控制台目前只有db.state 和 db.block 两个功能2 v: G7 x0 j1 h9 G+ B6 t

0 p" b5 B* L; Y; J/ vDb.block 会把block解析开,我们可以看到每个block都干了些啥,value都是DBvalue,用DBValue结构体去查看就能看到类型
) u+ ]! m2 [+ K& L7 [$ R二、客户端使用
, j6 j" d0 e9 W5 z3 B首先引用lightdb.sdk,可以下源码,可以nuget7 C/ K; r  R" @% U& w/ @, N

7 l  V8 {( P- O3 J9 v# i* HNew一个client对象
$ ~6 Y( B6 R) r  T# Y$ X
/ d2 p8 C! g) L; ~) Z4 w; v+ ]注册,断线事件,然后Connect$ N& ~( F6 T1 g/ W, f1 q
如果连接成功,就OK
' C7 a4 S) y5 j2 m, o. s! Y不需要登陆啥的,读随便,写的时候,需要你先签好名
" ?6 u( `. }% b& SPing 与dbstate. x. M/ W; M( S" Z7 }/ a

8 [8 Q2 M. Z- p所有的读操作都是通过snap来进行的
$ p3 p" i% t, O; n. }
+ P  b' r9 ]* ^' J# Z: P/ z所以先要获取一个snapshot
3 c; P4 \/ Z$ x! G然后就可以getblock2 e2 w. B3 l2 @1 s: ^

, C$ U1 k5 f9 r7 d8 zGetblockhash7 `" b( E" c5 s0 }; M5 U: Y

4 {" R6 h5 f' C7 b# ]- ]Getvalue! D, g4 [6 K* q# I
client.Post_snapshot_getvalue(snapshotid, tableid, key);
' p4 X- ]+ W1 l: ~* L要写数据就比较复杂了* V% _& D3 x# v# F

& q4 L3 E2 t9 [7 \  f首先创建个writetask对象,所有的写入,都通过writetask对象完成,' L1 z- g& D6 U/ \* m
然后创建signdata对象,进行签名
- u& E) T$ s- e3 k; X然后将这两个东西post给服务器。有对应的私钥才能完成签名,成功写入数据。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

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

    0

  • 关注

    0

  • 主题

    1