本文將搭建一個不具有任何功能的NEO輕錢包,所有的精力都僅集中於成功運行neon-wallet-db
項目並搭配全節點的neo-cli /rpc
接口為輕錢包客戶端提供服務。
首先需要准備幾個項目:
然后是勸退部分,即筆者完成壯舉准備的環境:
- 4台debian虛擬機,均運行共識節點
- 4台虛擬機中一台作為
RPC
節點運行提供/rpc
接口 - 4台虛擬機中另一台運行
neon-wallet-db
項目 - 運行
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-cli
的release
就可以,運行若出現問題(可能性很大)需要積極瀏覽官方文檔和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
,然后廣大開發者用cli
或gui
去連接。那搭建私鏈也是一樣,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下要麻煩一些,因為涉及了python
、heroku
以及幾個非關系型數據庫。
- 保證安裝了
heroku cli
- 安裝
MongoDB
,全都使用默認配置,運行服務即可 - 安裝
Redis
,使用默認配置,運行服務即可 - 可以再安裝
Memcache
,不過筆者不想再挑戰多一個數據庫了,直接忽略也可以 - 安裝
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
,如果高度跟私鏈中真實高度一致,那就完美了。
至此我們擁有了三個神器:
- /rpc節點服務端(neo-cli)
- 區塊數據服務端(neon-wallet-db)
- neon-js
他們之間的關系用一張圖來表達就是:
其中黃色部分為底層節點以及接口,綠色部分為定期從/rpc
更新數據的緩存接口,粉色部分就是輕錢包客戶端,自身不保存區塊數據,實則保存在緩存接口中。
至於如何進行輕錢包開發,也就是用輕錢包做到交易轉賬、合約調用這些有實際意義的事情,還有很多篇幅可以講 : )