您好,登錄后才能下訂單哦!
這篇文章給大家介紹如何進行LightDB項目的探索和開發,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
NEO節點是一個功能非常復雜的項目,它包含了P2P網絡,RPC接口,數據庫讀寫,執行智能合約等功能。不同的功能相互協作,才能確保節點及時同步數據,并且提供準確的數據給使用者。節點通過P2P網絡,請求和獲得塊數據,并將之驗證分析存入leveldb數據庫。當此節點正確同步到鏈上最新高度時,就意味著節點保存了一份鏈上數據可以供用戶使用。
作為開發者,對于節點的使用需求第一個是通過節點發送交易上鏈,第二個是通過RPC服務獲取節點中的數據或者模擬執行合約。在實際使用場景中,獲取數據或模擬執行合約的需求會更大一點,單個節點有時會扛不住請求的壓力。因為RPC服務和數據庫存在一個進程中,所以不存在開啟多個數據庫負載均衡提供數據給接口服務器的情況,也不存在啟動多個接口服務器從同一個數據庫中獲取數據的情況。
我們在開發一些dapp時,會遇到節點RPC請求的瓶頸。部署多個節點負載均衡時,由于每個節點拿到最新的塊數據并存入leveldb的時間不一樣,很容易造成在某一個時間點,訪問不同的節點拿最新的交易數據有不同的返回。基于此,我們做了一個設想,將數據庫功能從節點中獨立出來,將數據庫做成網絡數據庫(如果需要部署多個數據庫則從同一個源頭同步,保證數據庫內數據的統一)。并將RPC服務和執行智能合約的虛擬機構造成一個輕型節點提供接口服務。簡單的來說就是將Neo節點的存儲部分改為網絡存儲,并且可以通過輕型節點直接找網絡數據庫執行InvokeScript。
由于數據處理有事務化的要求,因此需要的數據庫必須要有快照的功能。Neo節點使用的LevelDB因為采用LSM存儲方式,提供讀取的快照非常容易,代價也很小。而關系型數據庫支持事物化的程度就差了一些,我們本來想使用的mongodb也因為讀快照功能的限制被舍棄。最終,我們選擇了以rocksdb(rocksdb是facebook基于leveldb改進的一個版本,讀寫性能都有明顯的提升)為基礎開發本地數據庫,并加上網絡層實現一個網絡數據庫。
節點在獲取數據存入leveldb的時候,是有一個分類的。存儲塊數聚,utxo數據,合約數據等不同的數據時會追加不同的修正前綴,以示區分。這個是使用leveldb的一個自然需求,kv數據庫是一個字典,我們存進去的東西,從邏輯上是分為諾干個字典的。現在我們將這個需求直接在數據庫層面提供,增加了一個表的概念。用戶在讀寫時,就可以更精準的讀取某張表內某個key的值。此外,數據庫的存儲還模仿了區塊鏈的結構,在每次寫操作的時候都會加入一個高度,模擬塊的概念,方便和區塊鏈中的塊高度對應。這樣接口服務器就可以較容易的用塊高度來做索引,獲取對應的快照執行數據。
我們將節點分析存儲每個塊數據進入leveldb的操作都視為一個集合,可以確認的是不同的leveldb執行這個集合都必然能存儲進相同的數據。基于此,我們將網絡數據庫的讀寫分離。將主節點每個塊存儲進leveldb的操作都記錄下來,網絡數據庫只要獲取這些塊的操作集,自己執行一遍就同步到了數據。有了這些網絡數據庫之后,我們的輕型節點就可以從這些數據庫中獲取數據并返回給調用者。
目前這個項目還是屬于一個探索研發階段,這里附上這個項目的github地址:https://github.com/NewEconoLab/NEL.LightDB
下圖是項目中包含的所有的工程,NEL.Peer.*是網絡層;SDK是為了方便客戶端接入而包裝的方法;SimpleDB是沒有附加網絡層的本地數據庫;API是實現了簡單RPC接口的輕型節點;Server是網絡數據庫。
我們首先編譯Server項目,打開config.json進行配置。
port是訪問數據庫的端口; bindAddress是允許訪問的地址; server_storage_path是數據庫數據存放于本地的路徑; Conn_Track,DataBase_Track,Coll_Track 這三個是mongodb的鏈接和庫名,我們暫時將每個塊應該怎么操作數據庫的集合存放在了我們NEL的mongodb中進行管理,目前開放性不是很高。暫時這個樣子,后續可能會將這些操作集用另一種方式提供出來,方便使用。
配置完成后,啟動
網絡數據庫正在快速的恢復數據。
此時再編譯API工程,配置config.json
port是訪問api端口,bindAddress是Api允許訪問的ip;dbServerPort是數據庫訪問的端口,dbServerAddress是數據庫所在的ip;dbServerPath是數據庫開啟的actor的路徑。(確保鏈接的數據庫已經同步到最近的數據高度)
啟動api服務
此時我們借助PostMan工具來通過api工程獲取數據(分別附上獲取塊數據,和模擬執行合約的例子)
關于如何進行LightDB項目的探索和開發就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。