Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

NEL发布NEO Key-Value数据库LightDB

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

1 h, t8 a& t  K) b% T7 c" i* |; `2 |: O. D5 z
如果路径里没有创建过数据库会新建,否则会打开" K& g6 Z& a' n% ?/ [1 K

3 t3 I- Y7 j! E' S- v( B1 |5 y; c控制台目前只有db.state 和 db.block 两个功能
# J2 O8 M2 k7 u7 M$ e1 D2 F, g5 @# w9 K3 h; m
Db.block 会把block解析开,我们可以看到每个block都干了些啥,value都是DBvalue,用DBValue结构体去查看就能看到类型
* \' w+ P, `4 y1 h& x* J二、客户端使用
( G5 x; F; p4 B, @% b  p首先引用lightdb.sdk,可以下源码,可以nuget
% Z- Q3 L6 Y- u- e
, q4 p4 G' ^. P2 _+ I; E5 {6 uNew一个client对象# Y# ^5 B* s9 _8 ?1 Z( O

. |- ^' ~9 o! ^2 P9 j; s注册,断线事件,然后Connect
8 y( p, o5 Z9 K; F如果连接成功,就OK
9 a# m2 j& e( p5 |不需要登陆啥的,读随便,写的时候,需要你先签好名
# S0 Z  s& z* YPing 与dbstate2 ^2 Z" C- S* b% y
1 I5 S6 h7 \  T! ]# f, U0 y# p
所有的读操作都是通过snap来进行的
: Z! g) [: l# F; ?+ ?9 _5 q% S9 ]" ?) A( D
所以先要获取一个snapshot: G5 @% z. W+ B. H: q" [
然后就可以getblock
. d, e$ a2 {2 Z& L. |6 I$ w) s/ |1 m3 P5 g5 u4 u5 N1 `; I
Getblockhash/ u9 [5 C1 Y; U% v

3 r' L$ X3 T% O" o1 f' {/ cGetvalue; C9 T' u4 o* t8 ]8 T+ h: T
client.Post_snapshot_getvalue(snapshotid, tableid, key);/ c6 Q$ g4 N9 F) @; H, ?- K
要写数据就比较复杂了+ R4 B; ~- a4 B; A

9 n; J7 O$ A( G0 ], \首先创建个writetask对象,所有的写入,都通过writetask对象完成,0 o1 m, j( w. r  `6 Y* _
然后创建signdata对象,进行签名$ a; t" |' f9 f0 h0 C) T3 g+ D$ U
然后将这两个东西post给服务器。有对应的私钥才能完成签名,成功写入数据。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

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

    0

  • 关注

    0

  • 主题

    1