Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

NEL发布NEO Key-Value数据库LightDB

不明白不知道
113 0 0
有一部分是要改造NEO的存储部分为网络存储,并且可以用轻型节点直接找网络数据库去执行InvokeScript
: b( g5 F+ f) O- \也就是把Neo的一个节点一个进程的模式,改造为一个节点一个集群。
, A) n  p; I9 y' M1 h完成这个目标的基础,就是这个网络数据库需要一个类似的很低成本的读snapshot支持。% l' K" u* Q$ u" D& v( X. E
所以我选择了rocksdb作为这个基础,rocksdb是facebook 基于leveldb魔改的一个改进版本。1 E: F& E/ v8 h) d
那么为什么要追加数据类型和表的概念?, T, b# T- S7 ^. U4 |
因为leveldb使用中存储的东西都是byte[],而很多时候我们使用neo中得到的byte[] 都不知道是什么东西,要靠相应的约定。
# v- Z3 j* s" [4 |1 |% ~0 ^1 F我觉得这个很不方便,所以我们存储的单位不是byte[] 而是一个结构体 DBValue,他可以描述自己是什么数据类型,整数,string,byte[],bigint,小数,等等。7 |3 o& G: }+ ~: K
这个结构体里面还预留了给每一个值附加信息的功能,也记录了这个值最终修改的时间戳(存储高度)
. T- _# W1 P. S" H$ f6 x至于表就更好理解了,这是使用leveldb的一个自然需求,keyvalue数据库是一个字典,可是我们存进去的东西,从逻辑上是分为几个字典的,交易字典,utxo字典,等等等。( S3 O6 }$ Z& C' K
我们只是把这个分字典的自然需求,在数据库层面直接提供了。
$ x- `$ t2 c3 @然后是网络层,选择了websocket作为通讯方法,完全是基于将来是网页的天下的考虑。因为存储这个功能被独立出来,甚至可以写一条链,他完全是在网页中运行的。
+ g5 }! \  e: F1 t: E& i当然目前还没有想那么多,但可以预见到越来越多的业务会在网络中运行,因为这个数据库的出现,nel目前的至少50%的查询需求可以不通过后台服务器,js直接完成。: k7 P8 v- t, p1 W& O
比如nep5资产的blanceof,比如交易UTXO数据的确认。9 V  ~8 |* N  J& a5 U
其三,数据库的存储模仿了区块链的结构,以taskblock为单位,首尾相接。毕竟一开始这个项目的名字就叫lightchain.( H% Y- B6 ?4 @# [: a: P: a: o' X& y) ]
后来一想,这个名字有点烂大街了,数据库还是老老实实的叫DB吧
4 x* d4 e/ ^( |4 _5 D+ C为什么要以taskblock为单位呢,因为便于同步。数据库读写分离是性能扩展的必然走向,而把每一个操作记录下来,从数据库只要从主数据库取得每一个block,自己执行一遍,就同步完了。* V' }& m& |. K5 }: s/ w) N; k; o
对了还有一点也很像NEO区块链,我们的写入权限控制不是用密码,而是用私钥,而且还是和NEO完全兼容的私钥1 a# g0 z1 h- [$ w2 A
最后,还有一个很重要的功能,checkpoint,这也是rocksdb提供的礼物,可以快速的在本地产生一个新的数据库副本。这样我们做链上数据快照的手段就更多了,传统手段是用爬虫爬取要快照的数据,爬到指定高度,停。现在又多了一个手段,约定时间快照,到时间了,啪,一个checkpoint,整个数据库都备份下来了。; x5 v1 Q, g/ V: V2 w0 J+ `- |7 s
不过当数据量达到G的级别,这个checkpoint性能是怎样的,还是需要测试确认的8 s) P8 o5 y2 Q0 X; l. }0 X1 J( q0 U# Q
项目使用方法; E- r2 L7 R$ Q
一、开服务器
0 Q) q+ F  w6 U获取lightdb.server,生成
  Y, h7 ?9 q+ Q启动之前看一下config6 a9 f4 b8 l2 j% ?0 M  [

+ \" v  c" z& @Server_port 服务端口
6 b7 }9 ?2 _' @2 ~+ `( _. H5 w/ gServer_storage_path 数据库存储路径4 D' h; ]; f# t2 Y
Server_type 读写分离用,从机模式还没开发呢,只能Master
) N6 P1 T9 [7 ^$ I  N9 @Storage_maindb_magic 提供一个魔法字串,好让这个库特立独行4 l/ L3 c. ?2 y# W: D
会写入库中,数据库创建之后,改这个值就没意义了, ]! q3 t  w8 z  [+ Q
Storage_maindb_firstwriter_address 提供一个NEO地址,他将成为第一个有写入权限的人,实际上还没开发追加写入人的功能,他就是唯一一个。+ K$ m# y0 c5 h- D' X& @6 G. n
会写入库中,数据库创建之后,改这个值就没意义了
1 S' P  H; y) T. ]* \1 I然后启动server,支持linux windows,在win10,unbutu,centos测试过,linux下需安装依赖库,参考facebook rocksdb项目的说明
9 m5 x5 w  {5 H# G8 Z' R, {https://github.com/facebook/rocksdb/blob/master/INSTALL.md
  |  n1 M# `1 _& M+ x1 C中的Supported platforms一节
  }& L7 X% m" n
3 V; ^. K; ?9 W( ~6 Q- c1 l
) X2 S, Q* K# r0 t4 _5 m0 g! ^如果路径里没有创建过数据库会新建,否则会打开
4 \9 A( L8 {- M! p
- v$ }- e4 Y- S3 i. v5 o, O' A& @控制台目前只有db.state 和 db.block 两个功能& ]5 q5 F* A$ |7 t4 V
- a0 r" s& i8 T7 F1 r8 e* J
Db.block 会把block解析开,我们可以看到每个block都干了些啥,value都是DBvalue,用DBValue结构体去查看就能看到类型* @9 s- `$ \7 u- K
二、客户端使用
! u- E' ?% M+ s! D( b4 `首先引用lightdb.sdk,可以下源码,可以nuget/ y" S% ]; @( a! j$ A

9 a' l+ V7 y; J3 X" a3 iNew一个client对象
5 ?* U2 k& N/ B2 o! Y3 T( n/ e
. m) u4 o8 F* u% j6 s4 }. J注册,断线事件,然后Connect# B, h* C1 a- m
如果连接成功,就OK/ I4 e3 H9 I$ V: E
不需要登陆啥的,读随便,写的时候,需要你先签好名
( ?  k' V# l  [7 `0 pPing 与dbstate
0 ~. q( ^( J$ g' R, H. A) ]6 i: Q8 E+ ^: U2 _% {& m' r( ]$ ~
所有的读操作都是通过snap来进行的9 v" j; y6 |* G$ ]
  B% b2 O6 z$ r+ f0 F" O
所以先要获取一个snapshot
6 x9 t7 u% j3 ?( d然后就可以getblock
2 C# E' U2 Q) Q/ w( y: G4 A8 {- t1 i5 g
Getblockhash
9 l" N! c0 ~9 M" Q5 x6 _2 O- G0 R3 v* ^  }# _! }+ D, k( E* t
Getvalue& s' b' }/ V) S  @" w0 R! e
client.Post_snapshot_getvalue(snapshotid, tableid, key);! |9 T: T& C2 q% Z: A9 g
要写数据就比较复杂了3 b) e  x+ s( f

1 u' @5 e! _! ~1 w! R3 K+ J首先创建个writetask对象,所有的写入,都通过writetask对象完成,
. S4 Q' f! u9 Y" h然后创建signdata对象,进行签名: S: [! Z' Q& N1 f0 }. d% G/ d
然后将这两个东西post给服务器。有对应的私钥才能完成签名,成功写入数据。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

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

    0

  • 关注

    0

  • 主题

    1