Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

NEL发布NEO Key-Value数据库LightDB

不明白不知道
123 0 0
有一部分是要改造NEO的存储部分为网络存储,并且可以用轻型节点直接找网络数据库去执行InvokeScript
/ l1 G! `+ P, h3 `! ^8 F3 H也就是把Neo的一个节点一个进程的模式,改造为一个节点一个集群。. _8 y5 v. v& ]) @
完成这个目标的基础,就是这个网络数据库需要一个类似的很低成本的读snapshot支持。( l  H9 q9 M9 x4 p3 v
所以我选择了rocksdb作为这个基础,rocksdb是facebook 基于leveldb魔改的一个改进版本。
0 Z, E2 H0 y; Q) T0 y那么为什么要追加数据类型和表的概念?
- e* L& k+ r! t( n: W4 P因为leveldb使用中存储的东西都是byte[],而很多时候我们使用neo中得到的byte[] 都不知道是什么东西,要靠相应的约定。5 r, y  |( f( J% |* d4 g
我觉得这个很不方便,所以我们存储的单位不是byte[] 而是一个结构体 DBValue,他可以描述自己是什么数据类型,整数,string,byte[],bigint,小数,等等。
! {/ X2 O) J9 q! r0 G* S; K; A这个结构体里面还预留了给每一个值附加信息的功能,也记录了这个值最终修改的时间戳(存储高度)1 [, X+ Q. i2 v% U2 w+ |1 z3 _0 K9 `
至于表就更好理解了,这是使用leveldb的一个自然需求,keyvalue数据库是一个字典,可是我们存进去的东西,从逻辑上是分为几个字典的,交易字典,utxo字典,等等等。2 X, T7 L, ~) ~- V9 Z: \
我们只是把这个分字典的自然需求,在数据库层面直接提供了。, G7 }3 d0 C5 n5 F1 k
然后是网络层,选择了websocket作为通讯方法,完全是基于将来是网页的天下的考虑。因为存储这个功能被独立出来,甚至可以写一条链,他完全是在网页中运行的。
9 B& y5 R4 C! N8 P' o当然目前还没有想那么多,但可以预见到越来越多的业务会在网络中运行,因为这个数据库的出现,nel目前的至少50%的查询需求可以不通过后台服务器,js直接完成。0 y% U2 |" j* g
比如nep5资产的blanceof,比如交易UTXO数据的确认。) H, p3 e' ^9 W2 k
其三,数据库的存储模仿了区块链的结构,以taskblock为单位,首尾相接。毕竟一开始这个项目的名字就叫lightchain.4 h! M# F# {  ?  p* Y
后来一想,这个名字有点烂大街了,数据库还是老老实实的叫DB吧
0 z- e$ T# _8 |为什么要以taskblock为单位呢,因为便于同步。数据库读写分离是性能扩展的必然走向,而把每一个操作记录下来,从数据库只要从主数据库取得每一个block,自己执行一遍,就同步完了。
" @4 e2 y6 b: F& T( K对了还有一点也很像NEO区块链,我们的写入权限控制不是用密码,而是用私钥,而且还是和NEO完全兼容的私钥
2 W) l) {$ a  _5 v# C, W最后,还有一个很重要的功能,checkpoint,这也是rocksdb提供的礼物,可以快速的在本地产生一个新的数据库副本。这样我们做链上数据快照的手段就更多了,传统手段是用爬虫爬取要快照的数据,爬到指定高度,停。现在又多了一个手段,约定时间快照,到时间了,啪,一个checkpoint,整个数据库都备份下来了。$ K) U' N8 L; u  W
不过当数据量达到G的级别,这个checkpoint性能是怎样的,还是需要测试确认的& R$ k4 S: d# {  e$ u$ t
项目使用方法1 v* [0 Q' |9 m- ]$ C3 h
一、开服务器) M, I5 F- F' E, b
获取lightdb.server,生成
+ t  q; Y" P- K; i0 R$ Z/ i启动之前看一下config
7 K2 ?1 z: l9 S3 W7 D
8 p* j( d5 o" S2 LServer_port 服务端口
* }. f" k3 Y. n3 Y3 _+ q' iServer_storage_path 数据库存储路径5 w6 |" V/ d. ]: J: N+ O; v  T; `6 |
Server_type 读写分离用,从机模式还没开发呢,只能Master
; I- X6 b- r( U9 B9 WStorage_maindb_magic 提供一个魔法字串,好让这个库特立独行$ F" J4 c: c1 G9 R# |0 w
会写入库中,数据库创建之后,改这个值就没意义了
! a6 D5 O: G8 f: L8 {4 |* hStorage_maindb_firstwriter_address 提供一个NEO地址,他将成为第一个有写入权限的人,实际上还没开发追加写入人的功能,他就是唯一一个。
# \  }2 H3 h* p0 k1 G会写入库中,数据库创建之后,改这个值就没意义了* y( z5 a+ S' Y$ w) O1 j
然后启动server,支持linux windows,在win10,unbutu,centos测试过,linux下需安装依赖库,参考facebook rocksdb项目的说明
8 y! Y5 {. Y1 n) \6 C8 |+ Zhttps://github.com/facebook/rocksdb/blob/master/INSTALL.md2 Q+ b. w0 N' ~% C8 _, a7 u1 J
中的Supported platforms一节- h3 P6 k7 I* Y2 F

  i& y, `- Q. g) h
% c9 _  j; e- ^" N9 b/ f9 L如果路径里没有创建过数据库会新建,否则会打开% u; l8 I! V, o

* [) A5 p4 G) U- E' m7 `控制台目前只有db.state 和 db.block 两个功能" m% M3 t& A& i4 f

! d/ t. z& J; T8 d/ r6 bDb.block 会把block解析开,我们可以看到每个block都干了些啥,value都是DBvalue,用DBValue结构体去查看就能看到类型; H* j+ H6 ?" X* _. q% d" _/ T8 ]6 c
二、客户端使用
7 }1 E. v7 i; }4 M9 M首先引用lightdb.sdk,可以下源码,可以nuget1 W) ?$ a+ R' T

! Y+ m; `8 e% iNew一个client对象) B# Z! L6 A2 C& @+ ~
1 a# j' Z; e, Y1 a
注册,断线事件,然后Connect
4 f2 _- c  q4 x/ I2 J# m如果连接成功,就OK% s. u: @; f: \0 L  s5 g7 A
不需要登陆啥的,读随便,写的时候,需要你先签好名
) I! }$ |9 I& ^% X5 o( IPing 与dbstate
$ x0 \! m) ~- P  N3 k
8 G: T! |" L# d5 b) r" R& V, V% A* ]所有的读操作都是通过snap来进行的9 ]0 O  \, e" Y( \8 Y

9 q- S* j' L( C所以先要获取一个snapshot
! H: e5 w1 r- a然后就可以getblock: K* U: ^+ j( o9 H

" c, F; M: @5 [Getblockhash* z' s4 G$ V0 N+ D* w

2 y/ z3 ~* {( |% oGetvalue
6 }0 h; o- ]! W* f" a7 Cclient.Post_snapshot_getvalue(snapshotid, tableid, key);$ c2 L1 A6 E, }7 m
要写数据就比较复杂了8 ^/ K, v% b4 ]) ^9 G/ x7 O3 j5 [

$ M$ n, s* X* D3 B! Z( s首先创建个writetask对象,所有的写入,都通过writetask对象完成,
3 m! W3 W6 u# s9 M7 h1 |- E  g, C$ x然后创建signdata对象,进行签名" Q; R2 n) Y- N& A* e& l
然后将这两个东西post给服务器。有对应的私钥才能完成签名,成功写入数据。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

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

    0

  • 关注

    0

  • 主题

    1