使用 neon-wallet-db + neon-js + NEO-cli /rpc 搭建輕錢包服務端


本文將搭建一個不具有任何功能的NEO輕錢包,所有的精力都僅集中於成功運行neon-wallet-db項目並搭配全節點的neo-cli /rpc接口為輕錢包客戶端提供服務。
首先需要准備幾個項目:

  1. neon-wallet-db
  2. neon-js
  3. neo-cli

然后是勸退部分,即筆者完成壯舉准備的環境:

  1. 4台debian虛擬機,均運行共識節點
  2. 4台虛擬機中一台作為RPC節點運行提供/rpc接口
  3. 4台虛擬機中另一台運行neon-wallet-db項目
  4. 運行neon-wallet-db項目的前提如下:
    4.1 運行mongodb服務端
    4.2 運行redis服務端
    4.3 安裝python環境(筆者為 3.6.3)(建議搭配pyenv+virtualenv)
    4.4 安裝heroku cli 后續將使用heroku local運行項目

NEON-WALLET-DB 項目的必要性

neon社區維護的neon輕錢包項目實際上為一個 react + electron 的web項目,內部通過調用neon-js提供的api實現與測試網乃至主網的交互。
然后思考一下輕錢包是如何做到不同步全節點也能進行transaction的。
答案是不可能。這里的輕錢包不過是在遠程調用/rpc接口罷了,全節點由遠程的neo-cli來維護。
那么問題來了,既然所有操作其實都是在調用/rpc接口,那neon-wallet-db項目又是用來做什么的?這還得從nel-cli都提供了哪些接口說起:

沒錯就只有這么一些,而一個基於NEO的DAPP要做的事情就是用這么幾個接口來搞事情。其中交易如何進行且不說,先關注如何查詢交易記錄(即區塊鏈技術中廣為流傳的utxo),毫無疑問這些utxo是包含在區塊中並保存在全節點里的,那就需要一個接口來獲取區塊信息,也就是上面的getblock接口:

如圖所示調用方法就是,拿區塊索引來查區塊信息,那如何實現查詢一個地址的余額呢?用上面提供的getbalance接口就想得太美了,此接口得前提是要打開錢包,也就是只能獲取這個neo-cli中打開的錢包的余額。真正做法是——遍歷所有區塊所有utxo自己算。這就是為什么還需要neon-wallet-db的原因,需要它來事先遍歷、存儲好uxto等數據,那么只要請求其提供的接口,就可以直接獲取其處理過的方便使用的數據,而不需要遍歷NEO全節點百萬計(截至目前的測試網)的區塊信息了。

運行私鏈共識節點

私鏈的運行比較簡單,下載官方的neo-clirelease就可以,運行若出現問題(可能性很大)需要積極瀏覽官方文檔和github README排查。

4個共識節點的protocol.json配置須保持一致,內容為節點ip地址和對應的共識地址公鑰,這樣才可能建立最小共識進而產生區塊。

其中還要選擇一個共識節點運行/rpc接口,命令為dotnet neo-cli.dll /rpc,然后實際使用的rpc接口就是http://192.168.1.x:20332(rpc節點ip以及默認端口).

官方的私鏈搭建文檔內容有些跳躍,讓人搞不清何時用neo-cli還是neo-gui。其實回歸字面共識的達成無非就是4個neo-cli節點達成共識每隔15秒新增一個區塊,沒有neo-gui什么事兒。實際上NEO的測試網估計也是protocol.json里那幾個節點在跑neo-cli,然后廣大開發者用cligui去連接。那搭建私鏈也是一樣,4台共識節點必不可少(什么共識后可以減為3台這種話直接忽略)。

筆者這邊就是搗鼓了4個linux虛擬機,然后在外部windows下連接上這個私鏈:

然后就只要保證四個節點的區塊數據一致,protocol.json配置一致,就可以任意連接到這個私鏈,甚至可以刪掉全部的區塊數據來重置這條私鏈。

配置 neon-wallet-db 以及 neon-js

共識節點的運行是整條私鏈的根本了,利用其提供的/rpc接口可以做到所有事情,而neon-wallet-db是用來緩存私鏈中的區塊數據以免除某些需要遍歷區塊數據的操作(比如查詢余額)。

首先直接克隆這兩個項目:

git clone https://github.com/CityOfZion/neon-js.git

git clone https://github.com/CityOfZion/neon-wallet-db.git

neon-js的修改

neon-js默認會設置幾個遠程的/rpc服務端以及運行着neon-wallet-db的服務端。
這里直接修改src/api/neonDB.js以及src/api/neoscan.js中的這個方法:

這個地址就是之后運行neon-wallet-db項目的地址了。

neon-wallet-db的修改

neon-wallet-db 很厲害,使用heroku來搭建,一個命令heroku local搞定,然后就是要在一個干凈的linux系統下解決報的錯了。

首先勸退,這東西在windows下安裝比linux下要麻煩一些,因為涉及了pythonheroku以及幾個非關系型數據庫。

  1. 保證安裝了heroku cli
  2. 安裝MongoDB,全都使用默認配置,運行服務即可
  3. 安裝Redis,使用默認配置,運行服務即可
  4. 可以再安裝Memcache,不過筆者不想再挑戰多一個數據庫了,直接忽略也可以
  5. 安裝python 3,筆者為3.6.3,搭配了pyenv + virtualenv

准備完畢后保證neon-wallet-db目錄下的python環境為3.6.3,然后

pip install -r requirements.txt

修改api/util.py:

修改api/db.py:

禁用memcache:

疑問:

代碼中涉及到os.environ.get方法的操作會拋出異常,這受限於筆者對python項目的理解不足,所以直接全都刪掉,寫死了配置。

下一步操作是手動同步一下區塊,新建一個rebuild.py:

from apscheduler.schedulers.blocking import BlockingScheduler
from rq import Queue
from api import redis_db as conn
from api.blockchain import storeLatestBlockInDB, getBlockCount, blockchain_db, storeBlockInDB, checkSeeds, get_highest_node

for i in range(0,5) :
  storeBlockInDB(i)

其中的 range(0, 5) 為想要遍歷的高度,也就是,手動把 1~5 的區塊數據給存儲下來,直接執行python rebuild.py即可。對於區塊中又大量數據的,可以這么做先自行存儲數據,然后運行整個項目時再從已存儲高度繼續。為了做到這一步還得把項目里幾個地方的區塊高度值都對應起來:

然后可以做什么

一切順利的情況下執行heroku local,應該就會看見三種顏色的log在不停跳動了。然后確保log中沒有錯誤,並嘗試訪問接口/v2/block/height,如果高度跟私鏈中真實高度一致,那就完美了。

至此我們擁有了三個神器:

  1. /rpc節點服務端(neo-cli)
  2. 區塊數據服務端(neon-wallet-db)
  3. neon-js

他們之間的關系用一張圖來表達就是:

其中黃色部分為底層節點以及接口,綠色部分為定期從/rpc更新數據的緩存接口,粉色部分就是輕錢包客戶端,自身不保存區塊數據,實則保存在緩存接口中。

至於如何進行輕錢包開發,也就是用輕錢包做到交易轉賬、合約調用這些有實際意義的事情,還有很多篇幅可以講 : )


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM