Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

NEL发布NEO Key-Value数据库LightDB

不明白不知道
133 0 0
有一部分是要改造NEO的存储部分为网络存储,并且可以用轻型节点直接找网络数据库去执行InvokeScript
" T) E7 K0 M" _$ ?' E  Q也就是把Neo的一个节点一个进程的模式,改造为一个节点一个集群。
: I, v% b( N( \& D' X/ b3 o# H" ]  o完成这个目标的基础,就是这个网络数据库需要一个类似的很低成本的读snapshot支持。, P7 W! \5 A' k* Z- b
所以我选择了rocksdb作为这个基础,rocksdb是facebook 基于leveldb魔改的一个改进版本。' j6 U) K7 f- G" x1 f3 F  Z3 z
那么为什么要追加数据类型和表的概念?
" g/ u0 b4 E5 N' E' T8 A因为leveldb使用中存储的东西都是byte[],而很多时候我们使用neo中得到的byte[] 都不知道是什么东西,要靠相应的约定。
) D8 W( ?7 t; B我觉得这个很不方便,所以我们存储的单位不是byte[] 而是一个结构体 DBValue,他可以描述自己是什么数据类型,整数,string,byte[],bigint,小数,等等。5 y0 {1 [8 N9 I& g2 f: I# v: H
这个结构体里面还预留了给每一个值附加信息的功能,也记录了这个值最终修改的时间戳(存储高度)
" |! @5 `' D  A/ k至于表就更好理解了,这是使用leveldb的一个自然需求,keyvalue数据库是一个字典,可是我们存进去的东西,从逻辑上是分为几个字典的,交易字典,utxo字典,等等等。& L0 I# ?3 H. h( S# A. O/ J$ m
我们只是把这个分字典的自然需求,在数据库层面直接提供了。
% x6 p3 W8 G% L% V4 s9 V: z然后是网络层,选择了websocket作为通讯方法,完全是基于将来是网页的天下的考虑。因为存储这个功能被独立出来,甚至可以写一条链,他完全是在网页中运行的。' }6 i0 V$ q' I1 ?2 L% B3 ~
当然目前还没有想那么多,但可以预见到越来越多的业务会在网络中运行,因为这个数据库的出现,nel目前的至少50%的查询需求可以不通过后台服务器,js直接完成。
; U& v0 k' X/ @/ l% B3 w6 d比如nep5资产的blanceof,比如交易UTXO数据的确认。
3 G% C# J, A/ D/ l+ c其三,数据库的存储模仿了区块链的结构,以taskblock为单位,首尾相接。毕竟一开始这个项目的名字就叫lightchain.
, d" E  Z  O- z/ B4 Z后来一想,这个名字有点烂大街了,数据库还是老老实实的叫DB吧; X1 F8 @7 s+ R1 e: b2 F
为什么要以taskblock为单位呢,因为便于同步。数据库读写分离是性能扩展的必然走向,而把每一个操作记录下来,从数据库只要从主数据库取得每一个block,自己执行一遍,就同步完了。
4 W7 W* E" F  J# l  i0 @对了还有一点也很像NEO区块链,我们的写入权限控制不是用密码,而是用私钥,而且还是和NEO完全兼容的私钥! Y/ @4 h) ~, ?" _. k' {
最后,还有一个很重要的功能,checkpoint,这也是rocksdb提供的礼物,可以快速的在本地产生一个新的数据库副本。这样我们做链上数据快照的手段就更多了,传统手段是用爬虫爬取要快照的数据,爬到指定高度,停。现在又多了一个手段,约定时间快照,到时间了,啪,一个checkpoint,整个数据库都备份下来了。$ l/ n/ K& V% }) {
不过当数据量达到G的级别,这个checkpoint性能是怎样的,还是需要测试确认的2 w1 c8 ?2 T% x0 G' {
项目使用方法& Q' ~3 V) B) K) g( C7 m
一、开服务器" T+ @: g' E) U+ F  |" U! X
获取lightdb.server,生成$ M) C) x" ~8 o- B4 q
启动之前看一下config& J2 O) O/ U# L" k, U; d
. m$ S, X% B2 ~+ r% [
Server_port 服务端口
% H# t# Y( V, HServer_storage_path 数据库存储路径7 Z3 t1 |# Z  U9 Z7 R
Server_type 读写分离用,从机模式还没开发呢,只能Master' j, v2 j& b5 J* L' p9 d
Storage_maindb_magic 提供一个魔法字串,好让这个库特立独行% u7 ~# Y' {9 r# ?
会写入库中,数据库创建之后,改这个值就没意义了
0 |  O# k$ b3 @7 e4 FStorage_maindb_firstwriter_address 提供一个NEO地址,他将成为第一个有写入权限的人,实际上还没开发追加写入人的功能,他就是唯一一个。
1 S7 \6 S8 S1 l3 f会写入库中,数据库创建之后,改这个值就没意义了
/ W0 M8 s" p1 Y' u然后启动server,支持linux windows,在win10,unbutu,centos测试过,linux下需安装依赖库,参考facebook rocksdb项目的说明
* r; O/ p; b; M0 m4 ?( \. y  Shttps://github.com/facebook/rocksdb/blob/master/INSTALL.md4 P3 |7 e8 S) e/ p& ]
中的Supported platforms一节/ V$ i) V& \) E
- c; I- W) Q+ |7 i8 E
% |/ i5 Y9 w. A5 o3 D- p, b
如果路径里没有创建过数据库会新建,否则会打开
9 \& G- o1 a7 z& C3 q" n: ]7 a9 k1 v8 F- i- {, r- ?& B5 @
控制台目前只有db.state 和 db.block 两个功能
: }. F5 c: d7 Q7 A
- x$ [, c. ?: S3 o* ]/ ?Db.block 会把block解析开,我们可以看到每个block都干了些啥,value都是DBvalue,用DBValue结构体去查看就能看到类型2 {; o. a1 f( S, _# P& i3 ~
二、客户端使用1 r- U4 M$ s+ q7 J$ M1 T
首先引用lightdb.sdk,可以下源码,可以nuget
% Q2 Q2 y6 H1 f2 H' D/ E. N8 Y
' v* |; c: ?- R" xNew一个client对象% @: U  `/ B2 G" U8 [) G9 L* I3 z  G

$ \9 a  v- \/ D注册,断线事件,然后Connect5 x" c+ e3 V  d8 S# d
如果连接成功,就OK( P$ L* s4 k1 e# }" {2 E3 D
不需要登陆啥的,读随便,写的时候,需要你先签好名
3 K  S& a+ k: ~5 ePing 与dbstate
* G4 _, D$ S% d  O* m: m
/ A: _, ?% F# D$ F所有的读操作都是通过snap来进行的
$ e5 f) A' _$ L% n5 v4 U; Z% t% W8 r2 e6 `$ T- F, [
所以先要获取一个snapshot
# T9 h8 o; M) z! x然后就可以getblock
& e& D- ^) _6 M: U' p4 k4 ]) a; T; I( E  @8 {# U5 k$ @: o, T
Getblockhash
  i/ P7 T1 n4 h* a6 f. i5 G# Y4 B0 N6 |# w6 g3 F* I
Getvalue. N- z$ Y( K* Y4 `
client.Post_snapshot_getvalue(snapshotid, tableid, key);
8 B1 o- M/ C) L, p) e0 O要写数据就比较复杂了
- A, ^4 ~! F1 v, Z: L/ v" x& p4 a7 y% g& j" b2 ?
首先创建个writetask对象,所有的写入,都通过writetask对象完成,
9 d7 U- {; `/ c# q然后创建signdata对象,进行签名
) z6 n' x; B" B* j1 m然后将这两个东西post给服务器。有对应的私钥才能完成签名,成功写入数据。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

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

    0

  • 关注

    0

  • 主题

    1