直到有一天發現了 NewEconoLab ,在它的 github 上有一個項目 neo-thinsdk-cs ,用 C# 實現了一個輕錢包 —— thinWallet。
這個輕錢包只做了一件事情,就是做交易,它把整個交易的流程都體現出來了,給開發者展示了明確的可視化交易拼接流程(包括Attribute、Inputs、Outputs、Script、Witness等,我曾經用 VS F11 一行一行的調試跟蹤過它的源代碼,所有的這些交易必須的數據都組裝好,放到一個數據結構里,非常清晰)。
此外,目前的 thinWallet ,默認接入到 Testnet,還不支持直接接入 Mainnet ,也不支持接入到 NEO 私有鏈 ,我們都知道 Testnet 上的 Gas 十分珍貴,需要去申請才能有,而我們部署合約,動不動就消耗 990 Gas 。而在自己的私有鏈上 Gas 就是大白菜了,隨便亂玩都可以。
克隆項目:NeoBlock-Mongo-Storage,NEO_Block_API,neo-thinsdk-cs,三個項目都是直接用 master 分支就可以了。
neo-thinsdk-cs 是一整個解決方案,用 vs 2017 打開,裡面有一個 WPF 項目是 thinWallet ,把它設置為啟動項目,直接 CTRL+F5 就可以運行了,當然默認是接入 Testnet 。項目裡面有一個《NEO智能合約開發(一)不可能完成的任務.docx》,好好看看。運行結果如下:

這裡我們按第二個按鈕 ThinWallet Test 就好了,進去是這樣的界面:

我們可以看到右上角在調用一個 API for UTXO,這是一個 webapi ,由 NEO_Block_API 提供,大家可以看到這地方默認就是 Testnet ,區塊高度也是 Testnet 的高度,切換網路那個按鈕還沒寫功能。總共五個大面板都很好理解,第一個登錄方式,第二個 api 信息,第三個賬戶信息(你的 utxo 將會出現在這裡),第四個交易三要素,第五個決定是什麼類型的交易。
NEO_Block_API 裡面用到了 mongodb ,所以我們的第三個項目 NeoBlock-Mongo-Storage 作為一個調度任務跑著,用來實時收集鏈上的交易信息存入 mongodb 中,供 NEO_Block_API 使用。
順便說明一下, vs 2017 很人性化,你直接 CTRL+F5 或者生成解決方案 ,會幫你還原依賴庫的,看見黃色感嘆號不要慌。如果你無法打開項目或者無法還原或者出現任何異常,相信我,一定是你的打開方式不對,或者你改了裡面的東西改錯了,或者環境有問題,三個項目是絕對沒有錯誤的,我驗證了好幾遍了,請回頭好好檢查自己的環境等基礎設施吧。
配置 NEO_Block_API
到這裡,基礎環境全部搭建完畢,thinWallet 也可以在 Testnet 上正常使用了,那麼接下來就需要開始接入私鏈了。首先我們要把 NEO_Block_API 的源代碼增改一下,讓它支持接入私鏈。
我們先看一下源代碼長什麼樣,還是 vs 2017 打開:

我已經生成過解決方案了,所以依賴庫都沒問題了,結構非常簡單。Controllers 是控制器,就是一些 web 介面在這裡實現,lib 就是要用到的工具,RPC 定義了一些數據結構,再加一個 Startup.cs 和 Program.cs 文件,典型的 .net core web 項目。
我們可以看到裡邊有一個 mongodbsettings.json 文件帶了個黃色警告標誌,說明這個文件丟失了,因為在 .gitignore 裡邊把它寫進去了,所以 git 就把它忽略了,問題不大,我們刪掉它重新建立一個一樣名字的文件就好了,我們可以找一下在哪裡用到了這個文件,你可以 CTRL+SHIFT+F 全局查找,最終發現在mongoHelper.cs裡面有這麼一段:
那麼事情就簡單了,我們看到這裡面一共有 8 個欄位要用到,給它就是了,我們在新建的 mongodbsettings.json 文件寫上這些內容:
mainnet 一時半會兒肯定用不著,我懶得寫了,testnet 還是保留原樣,加一個 privatenet 。注意 neoCliJsonRPCUrl_privatenet 這個欄位的值是 http://192.168.1.135:20332 ,192.168.1.135 這台機器是四台共識機中的一台,開了 RPC ,就是: 。我們可以用 postman 來測試一下,隨便找個介面,路由是: 就用 getbestblockhash 吧:
先看一下我跑的四個共識節點,我的共識跑了挺久了,現在高度接近 7000 :

接下來我們看一下 rpc 介面調用結果:

如果你無法得到類似的結果,那還是得去多看看文檔,跑跑共識。現在我們得到了正確結果,說明私鏈的 RPC 完全沒有問題。此刻我們得到了第一個需要的介面就是剛才打開的 thinWallet 右上角 RPC Node 所需要的介面地址: 。
mongodb 你得裝一下(隨你 linux 還是 windows,推薦 linux),為了演示方便,我裝在了 windows 裡面。裝完之後就是 C:Program FilesMongoDBServer3.6in 裡面有一堆東西。其中 mongod.exe 這個是服務端,因為國際慣例有個 d 。別急著雙擊它,你得先建立兩個文件夾:C:datadb,不然雙擊就閃退了,其實你可以用 cmd 來打開,可以看到異常信息。現在你可以雙擊它了,結果就是一個控制台,列印了一堆日誌,你可以用 mongodb 自帶的可視化客戶端連接一下。這邊注意,我們不需要事先創建資料庫。
下面開始創建 webapi 介面,也就是新建一個控制器,在項目的 Controllers 文件夾下,新建一個類,取名:PrivatenetController.cs,然後把隨便TestnetController.cs或者 ** MainnetController.cs** 裡面的內容全部複製粘貼到我們的PrivatenetController.cs中,改一下兩個地方,變成 privatenet :
接著 mongoHelper.cs 裡面改一下,把私鏈的東西加進去:
最後,Api.cs 裡面加私鏈的東西:
打完收工我們來試一下,CTRL+F5,我們可以看到內置的 IIS Express 被啟動了,可以訪問這個地址:
顯示的結果是:
那說明 webapi 本身已經沒問題了,我們看到用的是 localhost ,如果想區域網都能用的話我們可以改一下 .vsconfigapplicationhost.config 裡面的配置再運行,或者我們用典型的 .net core 方法(我採用這種),就是在 Program.cs 裡面加一點料:,詳細如下,這是允許區域網 ip 訪問的第一步:
第二步我們改一下啟動方式,先重新生成解決方案,然後把 和 兩個文件複製到 裡面去,關掉剛才啟動的 IIS Express,然後我們以管理員身份打開 cmd ,cd 到你的 文件夾裡面,然後 就好了,結果如下:
你可以去區域網的其他機器上用 postman 訪問一下,沒啥問題,用 介面吧,路由是這個: ,文檔在這:http://www.xiaoyaoji.cn/share/1H0gjTDtfk/1GzzPWtpFG 。
我在這台 windows 10 上操作的,IP 是 ,所以我們得到了第二個想要的介面地址,就是 API for UTXO 的 api 地址: 。
thinWallet 接入私鏈
現在我們來觀察一下 thinWallet 的代碼結構:

很顯然,上面三個項目都是通用庫,第三個是用戶端,而且我們只需要改一個地方就可以了,雙擊打開Window_thinwallet.xaml,WPF 的界面文件,打開是這樣的:
簡直不能忍,不僅丑爆了,還影響閱讀和寫代碼,我們做一下調整,下面圖裡面中間,左右兩個紅圈圈出來的按鈕,先按左邊那個,上下窗口對調,然後按右邊那個,把下窗口縮進去,這樣就是純代碼界面了,又好看又能高效閱讀。


接下來我們要把它接入私鏈,其實就該兩個介面地址,就在這個界面代碼裡面,thinWallet 對這兩個地址目前是寫死在界面上的,我們在界面代碼裡面查找一下 CTRL+F ,輸入 就能找到了,一共兩個地方,分別對應的填進去:
打完收工我們來訪問一下,CTRL+F5:
我們發現一個很詭異的數字,下面那個直接訪問 neo rpc 的已經完全正常了,但是上面那個訪問 webapi 的居然是這麼個詭異的數字,那麼碰到問題,我們首先得想到的事情只有一件,就是F5,首先我們先打開 Window_thinwallet.xaml 這個文件的後台文件,就是 ,我們觀察一下裡面的代碼,發現有一個非同步更新界面的地方:

再來看一下這個 是怎麼實現的,F12 過去:
真相在這裡,請求了 webapi 的一個 的介面,那麼現在來看一下 NEO_Block_API 項目對 是怎麼實現的:
這時候就發現了,這裡居然在調用 mongodb 的數據,我們回想一下,似乎沒有任何操作 mongodb 的地方,也就是說沒有任何數據,那麼我們可以猜到, 介面返回了一個 0 ,而且在我們的 文件非同步更新界面的地方,最後 來了這麼一句,很明確了,無符號長整型,減了個 1 ,導致變成了那個數字,現在來 F5 證明一下,斷點打在 這個方法的最後一句 return 的代碼上:
其中 result 是請求結果,就是 0 ,已經說明了一切。那還差什麼呢,想想我們好像漏了一個項目,沒錯還有最後一個調度任務項目沒配置好。
NeoBlock-Mongo-Storage 開啟對私鏈的任務調度
老樣子觀察代碼:

很簡單,一個入口,兩個數據介面,一個工具,沒了。
我們可以發現在 裡面有這麼一段:
很簡單了,加個文件, :
同樣道理,重新生成解決方案,把這個 json 文件複製到 binDebug
etcoreapp2.0 裡面去,然後管理員身份打開 cmd ,然後 cd 進去,然後 ,看下結果:
GIF
這個狂暴的氣息,然後我們開一下 thinWallet,看下結果:
這個高度正在快速地向最高高度同步過去,同步完成之後,我們就完成了 thinWallet 接入私鏈的所有步驟,你的 thinWallet 就可以在私鏈中隨便玩了。
同步完成之後,我們最好把 NeoBlock-Mongo-Storage 項目的 appsettings.json 改一下,把 從 0 改為 2000, 從 0 改為 1,因為調度是個無限循環,如果不讓它睡一會,就會一直浪費你的 cpu ,同步完成了,沒那麼多數據要寫了,讓它休息休息,這樣造成的效果是,上面那個高度永遠比下面那個高度更新慢半拍。單位是毫秒。自己隨便調節。
本文由NEL內容激勵計劃支持