Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

NEL发布NEO Key-Value数据库LightDB

不明白不知道
116 0 0
有一部分是要改造NEO的存储部分为网络存储,并且可以用轻型节点直接找网络数据库去执行InvokeScript2 s: Z8 Y6 e3 l6 l. O) h& n: P
也就是把Neo的一个节点一个进程的模式,改造为一个节点一个集群。
5 B& i! u/ Z. s4 N3 e+ B' A# t完成这个目标的基础,就是这个网络数据库需要一个类似的很低成本的读snapshot支持。) b% X$ \' z- Y1 W6 F" Y$ C' q; A
所以我选择了rocksdb作为这个基础,rocksdb是facebook 基于leveldb魔改的一个改进版本。3 i* B" K/ W  O5 F' Q4 `
那么为什么要追加数据类型和表的概念?
5 V# w% f+ l+ D" z因为leveldb使用中存储的东西都是byte[],而很多时候我们使用neo中得到的byte[] 都不知道是什么东西,要靠相应的约定。
  ~% }  U; |: S: v' d9 d; a% |我觉得这个很不方便,所以我们存储的单位不是byte[] 而是一个结构体 DBValue,他可以描述自己是什么数据类型,整数,string,byte[],bigint,小数,等等。
  o' @. y6 m) o2 ~这个结构体里面还预留了给每一个值附加信息的功能,也记录了这个值最终修改的时间戳(存储高度)
6 R, J. i5 L! f至于表就更好理解了,这是使用leveldb的一个自然需求,keyvalue数据库是一个字典,可是我们存进去的东西,从逻辑上是分为几个字典的,交易字典,utxo字典,等等等。
5 J& X+ H% ^$ F我们只是把这个分字典的自然需求,在数据库层面直接提供了。
4 g0 t& l9 ?& y6 V, M9 A! ?& S然后是网络层,选择了websocket作为通讯方法,完全是基于将来是网页的天下的考虑。因为存储这个功能被独立出来,甚至可以写一条链,他完全是在网页中运行的。
- {: I' O' N2 U: W1 e, \* h当然目前还没有想那么多,但可以预见到越来越多的业务会在网络中运行,因为这个数据库的出现,nel目前的至少50%的查询需求可以不通过后台服务器,js直接完成。, {' @$ f" s& [9 t
比如nep5资产的blanceof,比如交易UTXO数据的确认。
8 ]+ C, L3 n) |5 w其三,数据库的存储模仿了区块链的结构,以taskblock为单位,首尾相接。毕竟一开始这个项目的名字就叫lightchain.% k' D- h3 ?/ G' y
后来一想,这个名字有点烂大街了,数据库还是老老实实的叫DB吧* Z1 j+ Q4 Z% F0 t! X* F/ ^
为什么要以taskblock为单位呢,因为便于同步。数据库读写分离是性能扩展的必然走向,而把每一个操作记录下来,从数据库只要从主数据库取得每一个block,自己执行一遍,就同步完了。
: y+ k) Y# c' K2 }) M, Z$ {对了还有一点也很像NEO区块链,我们的写入权限控制不是用密码,而是用私钥,而且还是和NEO完全兼容的私钥; Z$ g; N% S$ j
最后,还有一个很重要的功能,checkpoint,这也是rocksdb提供的礼物,可以快速的在本地产生一个新的数据库副本。这样我们做链上数据快照的手段就更多了,传统手段是用爬虫爬取要快照的数据,爬到指定高度,停。现在又多了一个手段,约定时间快照,到时间了,啪,一个checkpoint,整个数据库都备份下来了。
4 l( f$ M1 R( \不过当数据量达到G的级别,这个checkpoint性能是怎样的,还是需要测试确认的
# [1 x) X/ Q- Q! T6 Q项目使用方法5 z* K$ M6 n! }* P! t" x
一、开服务器' O9 p& C" c1 @, I6 ?0 [- y% Y
获取lightdb.server,生成
$ z* l* T& G/ T& y+ [8 `) j. I2 G启动之前看一下config* t" a6 ^# w$ }: n
0 v! m" c  M6 H* l% W6 h9 f8 N
Server_port 服务端口4 P* h7 D. n. _& l7 ?" H
Server_storage_path 数据库存储路径
+ i0 S! o% u4 @9 ?0 o' S) FServer_type 读写分离用,从机模式还没开发呢,只能Master
% v5 f( \1 C& }6 }" E7 [! I# E) oStorage_maindb_magic 提供一个魔法字串,好让这个库特立独行
8 ~% }4 g% d) K) e; `4 u会写入库中,数据库创建之后,改这个值就没意义了" `" g; _8 X8 b* ]* m, f
Storage_maindb_firstwriter_address 提供一个NEO地址,他将成为第一个有写入权限的人,实际上还没开发追加写入人的功能,他就是唯一一个。
# ?/ l! C  l& w' D会写入库中,数据库创建之后,改这个值就没意义了
. X- D7 i0 R5 ~- I: C& k然后启动server,支持linux windows,在win10,unbutu,centos测试过,linux下需安装依赖库,参考facebook rocksdb项目的说明8 [; n/ J9 M" |# Z0 U7 d, t- N
https://github.com/facebook/rocksdb/blob/master/INSTALL.md
/ v! n9 f' x: H/ H) _中的Supported platforms一节. P/ \, q8 I, L/ e

* f  Q2 h3 \6 A' N: W
: E1 w7 y2 k# P# Y# s" @如果路径里没有创建过数据库会新建,否则会打开  o3 |5 H, _$ z' Y0 o( l: v% |
% _' E2 L7 @; y! z
控制台目前只有db.state 和 db.block 两个功能2 M5 l) @: P$ j/ n

( P& _9 R9 a# t  m5 @Db.block 会把block解析开,我们可以看到每个block都干了些啥,value都是DBvalue,用DBValue结构体去查看就能看到类型/ M- g; P  z4 y- K* Z5 x9 Y2 J9 `
二、客户端使用
% J) v7 v6 x4 ^) R7 d首先引用lightdb.sdk,可以下源码,可以nuget% K8 |% T  o5 m

6 ]/ x& e) ?( c! t9 jNew一个client对象0 q4 o- Q, G4 M
  \$ L8 p: g# |2 k  c, p6 t8 J. Q
注册,断线事件,然后Connect5 V: w  i, d; `  L" x/ s
如果连接成功,就OK
9 r5 X9 R8 @* r. d* Q不需要登陆啥的,读随便,写的时候,需要你先签好名
; h1 x4 H# u$ W) u  ~) Z. U% O+ GPing 与dbstate
: j% d1 F! H$ b7 ?0 p
! v! O" f* z' L# ~/ a所有的读操作都是通过snap来进行的
) r; s. B  W% b2 s3 ?+ S/ k1 e# s1 I9 G/ A5 w1 t! ?- G5 |* `1 w
所以先要获取一个snapshot
8 F& ^) u8 l% p% _2 r) e! e! E然后就可以getblock
& v) Z& @; L7 \1 }+ O
! ?+ U0 S& k( c6 f" vGetblockhash
9 _& f8 L4 ]- h1 k* Q. _/ s) S- \/ H8 C! S( t1 X! y* f2 B
Getvalue
. ]9 h3 B2 K0 i" xclient.Post_snapshot_getvalue(snapshotid, tableid, key);* l4 `: a- P/ [& m6 Y& `
要写数据就比较复杂了
6 ~  K. x( C6 ?, D* V6 m- p8 U* e+ w: C/ ^# E! {' f1 ~) @
首先创建个writetask对象,所有的写入,都通过writetask对象完成,
$ m3 F, k1 u. y! I2 X# b4 {( H3 |! g然后创建signdata对象,进行签名
' W3 O5 c- Q$ F3 u/ A然后将这两个东西post给服务器。有对应的私钥才能完成签名,成功写入数据。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

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

    0

  • 关注

    0

  • 主题

    1