NEL發佈NEO Key-Value數據庫LightDB

項目組成linux

這個項目叫作LightDBgit

由三個部分構成github

Lightdb.lib 是對rocksdb作了一層封裝,主要的修改是追加了保存的數據類型,和表的概念web

https://github.com/NewEconoLab/lightdb.lib數據庫

Lightdb.server 就是一個遠程數據庫啦,Lightdb的服務器版本windows

https://github.com/NewEconoLab/lightdb.servercentos

Lightdb.SDK 是方便客戶端接入LightdbServer 提供的,目前只提供了C#版本實現,後續還會提供Typescript版本實現,通信協議比較簡單,任意支持websocket的方案均可以鏈接。服務器

https://github.com/NewEconoLab/lightdb.sdkwebsocket

項目特色網絡

要說項目特色的話,

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性能是怎樣的,仍是須要測試確認的

項目使用方法

1、開服務器

獲取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結構體去查看就能看到類型

2、客戶端使用

首先引用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給服務器。有對應的私鑰才能完成簽名,成功寫入數據。

                                                                                                             

NEOFANS:neofans.org

NEOFANS 微博:https://www.weibo.com/neofanscommunity

NEOFANS  telegram羣:https://t.me/NEOfansCN

相關文章
相關標籤/搜索