Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

NEL发布NEO Key-Value数据库LightDB

不明白不知道
114 0 0
有一部分是要改造NEO的存储部分为网络存储,并且可以用轻型节点直接找网络数据库去执行InvokeScript
4 l; @( D2 a: p也就是把Neo的一个节点一个进程的模式,改造为一个节点一个集群。
6 W) L" w+ U7 t  ~" `3 A  \2 M; F完成这个目标的基础,就是这个网络数据库需要一个类似的很低成本的读snapshot支持。
$ D' O( t) U* f- j所以我选择了rocksdb作为这个基础,rocksdb是facebook 基于leveldb魔改的一个改进版本。8 v3 S, W+ H2 N. g( s
那么为什么要追加数据类型和表的概念?7 R4 e& v9 d. [+ U- v
因为leveldb使用中存储的东西都是byte[],而很多时候我们使用neo中得到的byte[] 都不知道是什么东西,要靠相应的约定。
6 `5 C9 _3 O/ n: z& A我觉得这个很不方便,所以我们存储的单位不是byte[] 而是一个结构体 DBValue,他可以描述自己是什么数据类型,整数,string,byte[],bigint,小数,等等。
, ?6 B) R) L* }, T  t# h$ |6 b这个结构体里面还预留了给每一个值附加信息的功能,也记录了这个值最终修改的时间戳(存储高度)
7 ]+ H$ T  S0 w! X9 B5 z" ^至于表就更好理解了,这是使用leveldb的一个自然需求,keyvalue数据库是一个字典,可是我们存进去的东西,从逻辑上是分为几个字典的,交易字典,utxo字典,等等等。9 J0 D- S7 M7 {, N  M  u
我们只是把这个分字典的自然需求,在数据库层面直接提供了。
: J5 o7 t( b- u) J3 k5 b, B然后是网络层,选择了websocket作为通讯方法,完全是基于将来是网页的天下的考虑。因为存储这个功能被独立出来,甚至可以写一条链,他完全是在网页中运行的。% B" o, {3 U/ j. U- {4 j
当然目前还没有想那么多,但可以预见到越来越多的业务会在网络中运行,因为这个数据库的出现,nel目前的至少50%的查询需求可以不通过后台服务器,js直接完成。
& I3 ?7 @, D" ]+ S0 Y比如nep5资产的blanceof,比如交易UTXO数据的确认。
& _0 c+ Z6 `- n( T. j: V% }) x其三,数据库的存储模仿了区块链的结构,以taskblock为单位,首尾相接。毕竟一开始这个项目的名字就叫lightchain.
- |7 w, R6 ]6 j后来一想,这个名字有点烂大街了,数据库还是老老实实的叫DB吧; G& {0 ~2 i2 v$ n
为什么要以taskblock为单位呢,因为便于同步。数据库读写分离是性能扩展的必然走向,而把每一个操作记录下来,从数据库只要从主数据库取得每一个block,自己执行一遍,就同步完了。3 C0 H( Z7 r* y- S* R1 c: X
对了还有一点也很像NEO区块链,我们的写入权限控制不是用密码,而是用私钥,而且还是和NEO完全兼容的私钥
  ^, ]+ i# x& O8 l/ b2 a最后,还有一个很重要的功能,checkpoint,这也是rocksdb提供的礼物,可以快速的在本地产生一个新的数据库副本。这样我们做链上数据快照的手段就更多了,传统手段是用爬虫爬取要快照的数据,爬到指定高度,停。现在又多了一个手段,约定时间快照,到时间了,啪,一个checkpoint,整个数据库都备份下来了。
$ M3 Q6 l( k/ j不过当数据量达到G的级别,这个checkpoint性能是怎样的,还是需要测试确认的0 N$ E" O# V' {0 I! W0 l! I4 K
项目使用方法
) ^* Q) Q; F9 W0 ^3 H) I一、开服务器: n; r) p5 J! g2 c9 X- V5 V
获取lightdb.server,生成( _2 c* a$ ^, x! G* A
启动之前看一下config
% [) s8 ~4 ~4 g9 l, e4 E; y: F0 [0 n' ?3 o$ V, \, B7 d% x
Server_port 服务端口% f( G6 k; X, C% G
Server_storage_path 数据库存储路径$ C6 t, W" H2 s
Server_type 读写分离用,从机模式还没开发呢,只能Master
2 f6 W6 [# Q  ]1 ~( U' k- eStorage_maindb_magic 提供一个魔法字串,好让这个库特立独行3 W1 |- X% P2 j4 U* N: `0 Y4 _& w8 h
会写入库中,数据库创建之后,改这个值就没意义了
0 e/ ?: N+ d& T, ]2 @2 D. a9 tStorage_maindb_firstwriter_address 提供一个NEO地址,他将成为第一个有写入权限的人,实际上还没开发追加写入人的功能,他就是唯一一个。2 n# O3 ]7 g8 B9 f+ S/ J' r& ?$ R
会写入库中,数据库创建之后,改这个值就没意义了* E  I- @, S+ |1 G6 j# K" N2 e$ m
然后启动server,支持linux windows,在win10,unbutu,centos测试过,linux下需安装依赖库,参考facebook rocksdb项目的说明, f- {$ s" k6 ~$ c6 M8 D+ M
https://github.com/facebook/rocksdb/blob/master/INSTALL.md% [; i+ K- X8 ^% Y
中的Supported platforms一节
5 x! O' E4 Q$ P6 |7 B1 h/ \1 D: L: b
- o" Y) z1 b1 x* `# y
如果路径里没有创建过数据库会新建,否则会打开2 o6 ]8 u# C7 R: Q* b' ~
- Q$ C5 n! \# k' [, x# J
控制台目前只有db.state 和 db.block 两个功能
& k: v: d( d# n' ^2 H7 F  Q' k: J. D: {: D
Db.block 会把block解析开,我们可以看到每个block都干了些啥,value都是DBvalue,用DBValue结构体去查看就能看到类型' g+ c$ {, ?5 w$ G1 T
二、客户端使用' N2 Z2 g# _7 L" s, T9 M: |
首先引用lightdb.sdk,可以下源码,可以nuget
; E3 q0 K* ^4 n
& p6 L" Q0 C* N; T3 g5 H5 ~# GNew一个client对象# g" J, e; S: H

. N4 H2 B- J: k$ X2 u5 f3 i  x注册,断线事件,然后Connect
2 f8 N4 L5 y$ Y) G' y% E; g! g" W如果连接成功,就OK' A) }, c: q# n( C- x8 a0 o' U9 R
不需要登陆啥的,读随便,写的时候,需要你先签好名+ x; G7 S, @* p) o  w' u
Ping 与dbstate3 Y; p6 E# O6 q; J

( g" |) i7 \$ {所有的读操作都是通过snap来进行的% _, [; f# _* a

5 w7 G' B, ?7 j7 N4 d所以先要获取一个snapshot/ O: p6 b) i8 ~! p
然后就可以getblock1 |+ @0 V% P" E9 w& y7 W# ^$ l0 M

% `$ V- n( k5 B2 R3 w9 vGetblockhash
. K5 m2 [6 }5 z9 E: q9 @8 Q
5 g' m& ~; U* {3 ~, tGetvalue$ C( U" u$ R% R) }4 Q+ p
client.Post_snapshot_getvalue(snapshotid, tableid, key);
( E  T) o+ @. v2 b, G, X. I要写数据就比较复杂了& J9 ?4 D3 U# S6 Y: P! E2 |* \
6 ?- E- v& F9 Q( a% l; F4 h9 L- {4 g
首先创建个writetask对象,所有的写入,都通过writetask对象完成,
+ B( h' B$ f% S3 x$ d然后创建signdata对象,进行签名
  S2 \6 c; m1 B9 l然后将这两个东西post给服务器。有对应的私钥才能完成签名,成功写入数据。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

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

    0

  • 关注

    0

  • 主题

    1