Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

NEL发布NEO Key-Value数据库LightDB

不明白不知道
115 0 0
有一部分是要改造NEO的存储部分为网络存储,并且可以用轻型节点直接找网络数据库去执行InvokeScript
4 ]9 H9 A: b  _+ D& G也就是把Neo的一个节点一个进程的模式,改造为一个节点一个集群。# x+ o6 k* h/ J5 Y
完成这个目标的基础,就是这个网络数据库需要一个类似的很低成本的读snapshot支持。; ^$ ?! j4 t4 o- I& A- U* d# q
所以我选择了rocksdb作为这个基础,rocksdb是facebook 基于leveldb魔改的一个改进版本。* R: w7 s% U5 ?1 k1 y
那么为什么要追加数据类型和表的概念?$ }* t% A; a. L. W6 Y9 L
因为leveldb使用中存储的东西都是byte[],而很多时候我们使用neo中得到的byte[] 都不知道是什么东西,要靠相应的约定。
/ q$ A4 X! L# X. W! _我觉得这个很不方便,所以我们存储的单位不是byte[] 而是一个结构体 DBValue,他可以描述自己是什么数据类型,整数,string,byte[],bigint,小数,等等。
* j7 i6 Y0 F# w  l这个结构体里面还预留了给每一个值附加信息的功能,也记录了这个值最终修改的时间戳(存储高度)
$ f1 }1 m- b: |+ ~至于表就更好理解了,这是使用leveldb的一个自然需求,keyvalue数据库是一个字典,可是我们存进去的东西,从逻辑上是分为几个字典的,交易字典,utxo字典,等等等。; v, @, C/ a  h
我们只是把这个分字典的自然需求,在数据库层面直接提供了。
: r: m6 c* v* l; W然后是网络层,选择了websocket作为通讯方法,完全是基于将来是网页的天下的考虑。因为存储这个功能被独立出来,甚至可以写一条链,他完全是在网页中运行的。
" s/ C9 ?( k+ R% g* _9 w当然目前还没有想那么多,但可以预见到越来越多的业务会在网络中运行,因为这个数据库的出现,nel目前的至少50%的查询需求可以不通过后台服务器,js直接完成。
9 {/ v# q' H( n比如nep5资产的blanceof,比如交易UTXO数据的确认。( X4 R$ _- D8 n% f! G
其三,数据库的存储模仿了区块链的结构,以taskblock为单位,首尾相接。毕竟一开始这个项目的名字就叫lightchain.
' X; K* Q& _8 c后来一想,这个名字有点烂大街了,数据库还是老老实实的叫DB吧
* z8 c3 e8 {) J8 z' D$ d3 J, ^; ^. b为什么要以taskblock为单位呢,因为便于同步。数据库读写分离是性能扩展的必然走向,而把每一个操作记录下来,从数据库只要从主数据库取得每一个block,自己执行一遍,就同步完了。8 E- X8 U- \% l5 q/ h( n9 A
对了还有一点也很像NEO区块链,我们的写入权限控制不是用密码,而是用私钥,而且还是和NEO完全兼容的私钥
& ?& P/ P5 u% g' v  C$ }1 T最后,还有一个很重要的功能,checkpoint,这也是rocksdb提供的礼物,可以快速的在本地产生一个新的数据库副本。这样我们做链上数据快照的手段就更多了,传统手段是用爬虫爬取要快照的数据,爬到指定高度,停。现在又多了一个手段,约定时间快照,到时间了,啪,一个checkpoint,整个数据库都备份下来了。5 q. }( T$ I6 Y0 m3 r
不过当数据量达到G的级别,这个checkpoint性能是怎样的,还是需要测试确认的
8 [( v0 y& X7 Q1 d项目使用方法
8 D5 `$ m" z4 Z0 \: V2 L, l1 X1 @" R一、开服务器6 P1 ~  x( {9 X; ~
获取lightdb.server,生成
. n/ m9 y/ E2 [启动之前看一下config! n$ ]8 `/ m3 u+ @% t; F

2 D+ ^" b5 s, \Server_port 服务端口: ?6 P9 @4 r2 X/ ^
Server_storage_path 数据库存储路径" y7 h8 L5 b; Q' F3 P* }& {% l/ i
Server_type 读写分离用,从机模式还没开发呢,只能Master0 v, t& m/ |/ v5 B1 w/ O* F
Storage_maindb_magic 提供一个魔法字串,好让这个库特立独行# c5 V; E2 q% G. H- l: k
会写入库中,数据库创建之后,改这个值就没意义了
( b1 w: ]- N( j$ W! j( x* `. @/ P# xStorage_maindb_firstwriter_address 提供一个NEO地址,他将成为第一个有写入权限的人,实际上还没开发追加写入人的功能,他就是唯一一个。
/ A0 |# `) ]8 e; Q会写入库中,数据库创建之后,改这个值就没意义了2 L8 {4 F6 K/ ]
然后启动server,支持linux windows,在win10,unbutu,centos测试过,linux下需安装依赖库,参考facebook rocksdb项目的说明: e* W1 B# k8 R: U. h. [
https://github.com/facebook/rocksdb/blob/master/INSTALL.md/ D5 }- B; a. m2 ~. w' @; d
中的Supported platforms一节
" D$ P6 o8 {3 }: B  @( A$ `
( k# A5 v& {5 O7 U) }
$ l8 p8 q5 w! F% z如果路径里没有创建过数据库会新建,否则会打开
. B- h- J5 b* R% i0 K  ^
( F' C. n6 }- i) e) M* c控制台目前只有db.state 和 db.block 两个功能' ^: s: Q/ ~% |
: u3 k8 W3 R3 n& }; ~
Db.block 会把block解析开,我们可以看到每个block都干了些啥,value都是DBvalue,用DBValue结构体去查看就能看到类型
8 ~% A7 {; M9 W. Z" m  _二、客户端使用
1 C/ e/ Q$ j# a; \( q; j首先引用lightdb.sdk,可以下源码,可以nuget
" ^3 o* }9 F" l; @9 x1 i! i: E2 d4 D, e% H4 H% Y; u4 Q8 Q
New一个client对象* J; K9 h/ R( A# s( r$ `2 t# e

3 ^5 h7 J. S! T1 A; ^4 Y注册,断线事件,然后Connect
" N/ H4 L9 L6 m4 ~! k2 a0 y6 P, f6 X如果连接成功,就OK& ^3 @, E0 Y% ?# g1 m+ a+ C
不需要登陆啥的,读随便,写的时候,需要你先签好名( k% X+ l" @: E8 Z( F  D0 C
Ping 与dbstate8 {6 _. _' P: Z) E# I, |
5 w$ G0 }. S3 A+ G' _+ A  M
所有的读操作都是通过snap来进行的5 T4 g0 z/ C8 u% F; l6 _
) _$ _- P0 O' {
所以先要获取一个snapshot
' Y1 a3 m8 j/ O3 ]然后就可以getblock; A: R0 g# G6 V, d) Y

# q- W7 c: J2 [, g6 n/ TGetblockhash
" k$ I9 _' z# h/ B; P( a
1 M, i4 l2 z! z5 M# N. g0 K0 ^, XGetvalue0 o8 \& j  n1 M% K* z
client.Post_snapshot_getvalue(snapshotid, tableid, key);& w) @8 M8 n' `1 Q( x- n
要写数据就比较复杂了+ Y+ U4 i% A( \! c; ~2 l

2 z* i6 W6 Q; K* i% F* |首先创建个writetask对象,所有的写入,都通过writetask对象完成,
9 L. r* x' r# J* E然后创建signdata对象,进行签名
7 J4 s4 R0 X/ ^* X  \然后将这两个东西post给服务器。有对应的私钥才能完成签名,成功写入数据。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

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

    0

  • 关注

    0

  • 主题

    1