Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

NEL发布NEO Key-Value数据库LightDB

不明白不知道
90 0 0
有一部分是要改造NEO的存储部分为网络存储,并且可以用轻型节点直接找网络数据库去执行InvokeScript( o& W- j: R( V
也就是把Neo的一个节点一个进程的模式,改造为一个节点一个集群。  N6 L8 N/ j; o
完成这个目标的基础,就是这个网络数据库需要一个类似的很低成本的读snapshot支持。2 l! u5 H6 z8 j
所以我选择了rocksdb作为这个基础,rocksdb是facebook 基于leveldb魔改的一个改进版本。, H% C' s# p- J" R5 ^" V
那么为什么要追加数据类型和表的概念?
- i3 G; S3 n) H3 E# }6 W4 w- M因为leveldb使用中存储的东西都是byte[],而很多时候我们使用neo中得到的byte[] 都不知道是什么东西,要靠相应的约定。
2 w" Z2 I# e) O! ^# n我觉得这个很不方便,所以我们存储的单位不是byte[] 而是一个结构体 DBValue,他可以描述自己是什么数据类型,整数,string,byte[],bigint,小数,等等。
% R* i7 }6 o! j1 q这个结构体里面还预留了给每一个值附加信息的功能,也记录了这个值最终修改的时间戳(存储高度)
6 o- g# F! V0 n2 h至于表就更好理解了,这是使用leveldb的一个自然需求,keyvalue数据库是一个字典,可是我们存进去的东西,从逻辑上是分为几个字典的,交易字典,utxo字典,等等等。, e- {: X( g$ @& B5 y3 X, c) t! O
我们只是把这个分字典的自然需求,在数据库层面直接提供了。
/ ]3 C& l: H7 A. ]# |* S然后是网络层,选择了websocket作为通讯方法,完全是基于将来是网页的天下的考虑。因为存储这个功能被独立出来,甚至可以写一条链,他完全是在网页中运行的。
; o' L* ^/ E9 p0 L& f- s当然目前还没有想那么多,但可以预见到越来越多的业务会在网络中运行,因为这个数据库的出现,nel目前的至少50%的查询需求可以不通过后台服务器,js直接完成。
- s0 j5 l! f0 J" W# V& b2 h) T9 A比如nep5资产的blanceof,比如交易UTXO数据的确认。+ s0 X$ p( \: ^* l. I/ u
其三,数据库的存储模仿了区块链的结构,以taskblock为单位,首尾相接。毕竟一开始这个项目的名字就叫lightchain.. F2 Y' M) L8 ?) x. v9 F: K# `# g
后来一想,这个名字有点烂大街了,数据库还是老老实实的叫DB吧
- A7 j# @" Y  P/ G+ b1 h, ~为什么要以taskblock为单位呢,因为便于同步。数据库读写分离是性能扩展的必然走向,而把每一个操作记录下来,从数据库只要从主数据库取得每一个block,自己执行一遍,就同步完了。
( V7 v) B5 r1 H9 H对了还有一点也很像NEO区块链,我们的写入权限控制不是用密码,而是用私钥,而且还是和NEO完全兼容的私钥, R7 Z4 }* n0 V5 t* T5 r$ K' b
最后,还有一个很重要的功能,checkpoint,这也是rocksdb提供的礼物,可以快速的在本地产生一个新的数据库副本。这样我们做链上数据快照的手段就更多了,传统手段是用爬虫爬取要快照的数据,爬到指定高度,停。现在又多了一个手段,约定时间快照,到时间了,啪,一个checkpoint,整个数据库都备份下来了。( w+ }3 }8 h( O' |
不过当数据量达到G的级别,这个checkpoint性能是怎样的,还是需要测试确认的
3 n$ g! N9 T3 [  }5 M; j# J- P7 ?项目使用方法) U+ k3 {; R5 V8 g/ u( O6 o! W
一、开服务器- Z) N0 {4 Y6 K$ Q8 P
获取lightdb.server,生成
$ x0 J3 g5 P! c6 B) A8 o2 K启动之前看一下config
# A$ g5 `6 }2 J- d; j( \7 w4 ~, M; R% [) B) G# |
Server_port 服务端口
$ ~1 }: P, v$ B+ UServer_storage_path 数据库存储路径
. O8 v, U6 O6 T5 g' R5 VServer_type 读写分离用,从机模式还没开发呢,只能Master6 }6 ^8 t1 p; q( R! v
Storage_maindb_magic 提供一个魔法字串,好让这个库特立独行1 M: E( t! A, T, m7 I$ G6 Y$ l
会写入库中,数据库创建之后,改这个值就没意义了
* h0 ~4 g" h8 p$ A- A; ]Storage_maindb_firstwriter_address 提供一个NEO地址,他将成为第一个有写入权限的人,实际上还没开发追加写入人的功能,他就是唯一一个。' S" d- M3 y* w, g3 B* v+ y
会写入库中,数据库创建之后,改这个值就没意义了
# o9 m8 R/ F! j8 N( I7 k然后启动server,支持linux windows,在win10,unbutu,centos测试过,linux下需安装依赖库,参考facebook rocksdb项目的说明& y, [7 B' V  Z
https://github.com/facebook/rocksdb/blob/master/INSTALL.md7 a8 \) Q" V5 |1 ^' G6 p
中的Supported platforms一节% `$ c% O/ M/ M
" H& k5 H9 G; m' P# h4 k
) q  f/ \1 K: W8 V) X( @$ M# u/ K
如果路径里没有创建过数据库会新建,否则会打开
+ }: `# f0 k5 c* Z$ |+ Q- w8 T& R2 _
控制台目前只有db.state 和 db.block 两个功能
; s1 }/ P7 I) Z2 h. E$ D4 X- }, {
  G$ M# {: j: I  oDb.block 会把block解析开,我们可以看到每个block都干了些啥,value都是DBvalue,用DBValue结构体去查看就能看到类型
! O; T2 R9 {) I3 e$ n二、客户端使用
/ K; I. |' n. `: t# G8 D# t首先引用lightdb.sdk,可以下源码,可以nuget9 B" W- L# I$ ?8 |

; {0 b: F* Y! s% x2 a/ T) [) yNew一个client对象
- [, a. {6 R, h3 v5 |! i. m; ]- N4 b8 A
注册,断线事件,然后Connect
. e3 @' v3 f4 {) m! @$ v* f如果连接成功,就OK
& s5 g! v) e  t  y: S, t3 F不需要登陆啥的,读随便,写的时候,需要你先签好名
' a' j) o! e; m0 d) ZPing 与dbstate
) B1 |! M7 ], k1 X& @% j+ h% ]0 g* n" b( j- L% ?1 h; e
所有的读操作都是通过snap来进行的
' X0 a8 a6 N% m& v$ b: B* l2 V% |7 e) ?6 i6 l& P/ A
所以先要获取一个snapshot
0 y  Y- E& Q7 K) v然后就可以getblock' j9 D7 q$ U$ j( r  V" v
; ~6 C$ r) V, y4 z. I# ?1 y1 b$ P
Getblockhash
6 W7 J8 V' k, h$ ]/ y6 b* g
7 p4 W% G$ Y2 [Getvalue6 I7 G; g' D& f, i2 y" j
client.Post_snapshot_getvalue(snapshotid, tableid, key);/ y. H1 T$ F4 `8 D& y( Z
要写数据就比较复杂了
+ d4 G$ o/ I# v
; X7 L% M/ b6 B4 ?6 I首先创建个writetask对象,所有的写入,都通过writetask对象完成,8 O$ ]3 o" K, i$ z! ?8 u
然后创建signdata对象,进行签名
) d& Z8 L0 T% b6 E- C/ P然后将这两个东西post给服务器。有对应的私钥才能完成签名,成功写入数据。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

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

    0

  • 关注

    0

  • 主题

    1