Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

NEL发布NEO Key-Value数据库LightDB

不明白不知道
117 0 0
有一部分是要改造NEO的存储部分为网络存储,并且可以用轻型节点直接找网络数据库去执行InvokeScript
+ W/ l" ]1 C, }也就是把Neo的一个节点一个进程的模式,改造为一个节点一个集群。
" E+ i: \) R  _) l完成这个目标的基础,就是这个网络数据库需要一个类似的很低成本的读snapshot支持。/ E. e& z) F( p  G; r
所以我选择了rocksdb作为这个基础,rocksdb是facebook 基于leveldb魔改的一个改进版本。. b3 K3 {8 q3 L! @+ y+ {+ B( o
那么为什么要追加数据类型和表的概念?  }" ?- \" x+ p. D
因为leveldb使用中存储的东西都是byte[],而很多时候我们使用neo中得到的byte[] 都不知道是什么东西,要靠相应的约定。% b" [+ P' R1 A) H& D
我觉得这个很不方便,所以我们存储的单位不是byte[] 而是一个结构体 DBValue,他可以描述自己是什么数据类型,整数,string,byte[],bigint,小数,等等。9 \  I( r7 \7 Q
这个结构体里面还预留了给每一个值附加信息的功能,也记录了这个值最终修改的时间戳(存储高度)" @: f7 o( }) w: h
至于表就更好理解了,这是使用leveldb的一个自然需求,keyvalue数据库是一个字典,可是我们存进去的东西,从逻辑上是分为几个字典的,交易字典,utxo字典,等等等。6 u$ R( I0 s9 n' s
我们只是把这个分字典的自然需求,在数据库层面直接提供了。, j9 x3 R$ a& F: p/ S3 \
然后是网络层,选择了websocket作为通讯方法,完全是基于将来是网页的天下的考虑。因为存储这个功能被独立出来,甚至可以写一条链,他完全是在网页中运行的。
& h9 f5 T: r; O% J$ K当然目前还没有想那么多,但可以预见到越来越多的业务会在网络中运行,因为这个数据库的出现,nel目前的至少50%的查询需求可以不通过后台服务器,js直接完成。
& ]3 p% i8 q8 [9 e6 ]$ k1 f. o比如nep5资产的blanceof,比如交易UTXO数据的确认。
  Z8 ]7 G$ Z  \9 ^: e5 s% F% d  Y其三,数据库的存储模仿了区块链的结构,以taskblock为单位,首尾相接。毕竟一开始这个项目的名字就叫lightchain.& J9 F) }( {, ]0 y" F
后来一想,这个名字有点烂大街了,数据库还是老老实实的叫DB吧
: ^: p  b7 ?- R为什么要以taskblock为单位呢,因为便于同步。数据库读写分离是性能扩展的必然走向,而把每一个操作记录下来,从数据库只要从主数据库取得每一个block,自己执行一遍,就同步完了。6 f+ ~& _0 S& `% T
对了还有一点也很像NEO区块链,我们的写入权限控制不是用密码,而是用私钥,而且还是和NEO完全兼容的私钥4 q8 C) ^/ w6 g$ V2 d# |
最后,还有一个很重要的功能,checkpoint,这也是rocksdb提供的礼物,可以快速的在本地产生一个新的数据库副本。这样我们做链上数据快照的手段就更多了,传统手段是用爬虫爬取要快照的数据,爬到指定高度,停。现在又多了一个手段,约定时间快照,到时间了,啪,一个checkpoint,整个数据库都备份下来了。
( g: H9 R# |( ~4 `% M不过当数据量达到G的级别,这个checkpoint性能是怎样的,还是需要测试确认的8 E# g3 {) |% ]1 l: {
项目使用方法3 ~$ r: j: i6 s
一、开服务器
  j' Q! b$ R9 l0 t+ V* _获取lightdb.server,生成* k9 @9 o1 Y* H
启动之前看一下config& a! |4 W# J9 j3 Y6 u0 h3 j( M' R* a
' D0 c9 \+ a" g9 E) N
Server_port 服务端口3 i% |+ m5 c1 M: ^% X7 i3 L, ?
Server_storage_path 数据库存储路径
; Z9 i# g, f& z# @( ~Server_type 读写分离用,从机模式还没开发呢,只能Master
- E0 s# ^2 O. N+ e  IStorage_maindb_magic 提供一个魔法字串,好让这个库特立独行
0 y1 y( B2 e: H$ @会写入库中,数据库创建之后,改这个值就没意义了
! e7 {& H4 o; c/ p( l; g  eStorage_maindb_firstwriter_address 提供一个NEO地址,他将成为第一个有写入权限的人,实际上还没开发追加写入人的功能,他就是唯一一个。9 _, Q8 Y2 S! V" J
会写入库中,数据库创建之后,改这个值就没意义了
& ^; N6 a. e% u# s! D5 X然后启动server,支持linux windows,在win10,unbutu,centos测试过,linux下需安装依赖库,参考facebook rocksdb项目的说明9 @& l8 H- o. E# w3 O- J( E
https://github.com/facebook/rocksdb/blob/master/INSTALL.md
# m$ P% L+ c% ~( Y中的Supported platforms一节
" w. l$ a" o5 p( q2 x% c4 E5 x9 \& O9 \- n( y
, j3 l/ A2 r7 O. q
如果路径里没有创建过数据库会新建,否则会打开' h5 Z. f5 ~. j& ]

" P% F% h# @2 g6 x$ T$ E控制台目前只有db.state 和 db.block 两个功能( k3 z8 [) w. l5 F6 w4 H& K
; \5 A+ _- b) ^& d7 H
Db.block 会把block解析开,我们可以看到每个block都干了些啥,value都是DBvalue,用DBValue结构体去查看就能看到类型
! K1 U1 l9 R! z; k$ ^1 P1 G二、客户端使用3 k$ |* k1 l2 O
首先引用lightdb.sdk,可以下源码,可以nuget
; Z, f0 P  u5 s. W! z
' @# b! W7 b3 T6 p! z. `) t. rNew一个client对象
, [& J+ q8 k3 I. a9 B! @& i  j) x8 q* ?  m4 Y! C# {4 \  l
注册,断线事件,然后Connect) Q0 f6 N; p7 T( [) ~
如果连接成功,就OK; E( G8 B$ C: ]. v
不需要登陆啥的,读随便,写的时候,需要你先签好名
$ \; }* i" Y1 f6 I7 B' l" qPing 与dbstate" {" k' m5 J. f" M$ t

0 O( T" n% N1 o' E" V  B所有的读操作都是通过snap来进行的3 Z1 d- O7 E9 i, s& B7 {9 v, p% a( q$ p
6 f) j2 k' F+ r& U
所以先要获取一个snapshot5 N! g7 @5 r4 ~: C+ Y
然后就可以getblock; W1 h3 }: M9 o# X* L* o
5 j: w% S) K' @$ {  n& z6 M# i
Getblockhash
) M: G, p* |( x" m" ~& v1 ^; z
9 i9 _$ D2 }0 x+ d$ hGetvalue
& j7 |; @8 B) M6 {" y/ }  V+ G# `client.Post_snapshot_getvalue(snapshotid, tableid, key);
% ]+ _! E( y- [1 ~! K# T要写数据就比较复杂了
% }) \- `. v9 z
! _& |0 Q4 Q0 c0 C5 \, D首先创建个writetask对象,所有的写入,都通过writetask对象完成,( z) G# S2 V$ m/ X7 u+ t. I+ m
然后创建signdata对象,进行签名6 m, x4 {( O0 U% a" h0 o. X
然后将这两个东西post给服务器。有对应的私钥才能完成签名,成功写入数据。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

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

    0

  • 关注

    0

  • 主题

    1