虽然想把标题取得大一点,但终究不是什么太大不了的工做,仍是安分守己的开始介绍吧。 linux
这个项目叫作LightDB git
由三个部分构成 github
Lightdb.lib 是对rocksdb作了一层封装,主要的修改是追加了保存的数据类型,和表的概念 web
https://github.com/lightszero/lightdb.lib 数据库
Lightdb.server 就是一个远程数据库啦,Lightdb的服务器版本 windows
https://github.com/lightszero/lightdb.server centos
Lightdb.SDK 是方便客户端接入LightdbServer 提供的,目前只提供了C#版本实现,后续还会提供Typescript版本实现,通信协议比较简单,任意支持websocket的方案均可以链接。 服务器
https://github.com/lightszero/lightdb.sdk websocket
要说项目特色的话, 网络
1、追加了数据类型和表概念。
2、有服务器,采用websocket通信,对js友好
3、数据的存储以taskblock为单位,方便数据库互相验证和同步
其实最重要的特色还有一个关于读的快照snapshot。快照的需求来源是数据处理的事务化,或者说一批操做的原子性要求。
传统数据库必定程度支持事务化,而KeyValue数据库这边支持事务化的程度就更差一些。
而NEO使用的嵌入式数据库,LevelDB由于采用LSM存储方式,提供读取的snapshot 很是容易,代价也小。
这也就形成了在NEO的实现中,存储部分对Snapshot的依赖很是强。
创立这个项目的初衷,有一部分是要改造NEO的存储部分为网络存储,而且能够用轻型节点直接找网络数据库去执行InvokeScript
也就是把Neo的一个节点一个进程的模式,改造为一个节点一个集群。
完成这个目标的基础,就是这个网络数据库须要一个相似的很低成本的读snapshot支持。
因此我选择了rocksdb做为这个基础,rocksdb是facebook 基于leveldb魔改的一个改进版本。
那么为何要追加数据类型和表的概念?由于leveldb使用中存储的东西都是byte[],而不少时候咱们使用neo中获得的byte[] 都不知道是什么东西,要靠相应的约定。
我以为这个很不方便,因此咱们存储的单位不是byte[] 而是一个结构体 DBValue,他能够描述本身是什么数据类型,整数,string,byte[],bigint,小数,等等。
这个结构体里面还预留了给每个值附加信息的功能,也记录了这个值最终修改的时间戳(存储高度)
至于表就更好理解了,这是使用leveldb的一个天然需求,keyvalue数据库是一个字典,但是咱们存进去的东西,从逻辑上是分为几个字典的,交易字典,utxo字典,等等等。
咱们只是把这个分字典的天然需求,在数据库层面直接提供了。
而后是网络层,选择了websocket做为通信方法,彻底是基于未来是网页的天下的考虑。由于存储这个功能被独立出来,甚至能够写一条链,他彻底是在网页中运行的。
固然目前尚未想那么多,但能够预见到愈来愈多的业务会在网络中运行,由于这个数据库的出现,nel目前的至少50%的查询需求能够不经过后台服务器,js直接完成。
好比nep5资产的blanceof,好比交易UTXO数据的确认。
其三,数据库的存储模仿了区块链的结构,以taskblock为单位,首尾相接。毕竟一开始这个项目的名字就叫lightchain.
后来一想,这个名字有点烂大街了,数据库仍是老老实实的叫DB吧
为何要以taskblock为单位呢,由于便于同步。数据库读写分离是性能扩展的必然走向,而把每个操做记录下来,从数据库只要从主数据库取得每个block,本身执行一遍,就同步完了。
对了还有一点也很像NEO区块链,咱们的写入权限控制不是用密码,而是用私钥,并且仍是和NEO彻底兼容的私钥
最后,还有一个很重要的功能,checkpoint,这也是rocksdb提供的礼物,能够快速的在本地产生一个新的数据库副本。这样咱们作链上数据快照的手段就更多了,传统手段是用爬虫爬取要快照的数据,爬到指定高度,停。如今又多了一个手段,约定时间快照,到时间了,啪,一个checkpoint,整个数据库都备份下来了。
不过当数据量达到G的级别,这个checkpoint性能是怎样的,仍是须要测试确认的
获取lightdb.server,生成
启动以前看一下config
Server_port 服务端口
Server_storage_path 数据库存储路径
Server_type 读写分离用,从机模式还没开发呢,只能Master
Storage_maindb_magic 提供一个魔法字串,好让这个库特立独行
会写入库中,数据库建立以后,改这个值就没意义了
Storage_maindb_firstwriter_address 提供一个NEO地址,他将成为第一个有写入权限的人,实际上还没开发追加写入人的功能,他就是惟一一个。
会写入库中,数据库建立以后,改这个值就没意义了
而后启动server,支持linux windows,在win10,unbutu,centos测试过,linux下需安装依赖库,参考facebook rocksdb项目的说明
https://github.com/facebook/rocksdb/blob/master/INSTALL.md
中的Supported platforms一节
若是路径里没有建立过数据库会新建,不然会打开
控制台目前只有db.state 和 db.block 两个功能
Db.block 会把block解析开,咱们能够看到每一个block都干了些啥,value都是DBvalue,用DBValue结构体去查看就能看到类型
首先引用lightdb.sdk,能够下源码,能够nuget
New一个client对象
注册,断线事件,而后Connect
若是链接成功,就OK
不须要登录啥的,读随便,写的时候,须要你先签好名
Ping 与dbstate
全部的读操做都是经过snap来进行的
因此先要获取一个snapshot
而后就能够getblock
Getblockhash
Getvalue
client.Post_snapshot_getvalue(snapshotid, tableid, key);
要写数据就比较复杂了
首先建立个writetask对象,全部的写入,都经过writetask对象完成,
而后建立signdata对象,进行签名
而后将这两个东西post给服务器。有对应的私钥才能完成签名,成功写入数据