比特幣錢包開發:錢包專案整體架構設計

買賣虛擬貨幣

目標

搭建NodeJS後端框架 搭建前端web框架 前後端互動

前言

本課程是比特幣錢包開發,後端使用的NodeJS搭建,客戶端使用的web前端,VSCode開發工具,Ubuntu16.04系統(當然,Mac、windows系統也可以),node v8.11.3,npm v5.6.0。

一、前端架構

咱們的開發重點是在後端實現上,因此為了讓大家快速上手,web客戶端沒有使用其它流行的框架,這裡只使用了jQuery框架簡化程式碼,另外還有個jQuery Validate 外掛簡化了表單驗證。

web前端整體技術:

html + css + javascript + jQuery。

web前端功能:

錢包模組 建立錢包 助記詞匯入錢包 錢包列表 匯出錢包助記詞 賬號模組 查詢餘額 建立子賬號 查詢子賬號:地址、路徑、私鑰 比特幣轉賬 交易記錄

二、後端架構

這個錢包應用程式與比特幣區塊鏈互動,我們使用了Bitpay開發的bitcore-wallet-client庫,使用它便於我們的開發,封裝了比較全面的API給我們使用。

另外,後端Http框架使用的是強大的express,裡面封裝了很多功能,因為bitcore-wallet-client庫中提供的API會透過非同步callback返回資料,所以就不用koa。

在這個專案中使用了第三方庫較少,如下:

bitcore-wallet-client:是bitcore-wallet-service的客戶端庫,使用REST API 與BWS bitcore-wallet-service進行通訊,所有REST端點都包裝為簡單的非同步方法。bitcore-wallet-service庫實現了多重簽名的比特幣HD錢包服務,使用該服務的有Copay、Bitpay錢包。 express:是一個web框架,提供的HTTP伺服器工具非常強大,且整合與使用簡單,與koa類似。 ejs:是一種JavaScript模版引擎,可以動態的設定變數值到html。需要與模板渲染中介軟體koa-views配合使用。 整體架構使用了成熟的MVC架構。專案的入口是index.js檔案,對專案做了配置,將後端服務繫結到了3000埠並處於簡體狀態,當前端訪問服務時,router.js路由檔案根據URL將任務分配到controllers資料夾下的業務檔案中。

這裡為了讓快速上手開發比特幣錢包專案,前後端都在一個專案上同時開發,將前端的頁面檔案放在了static與views資料夾中,當然,同時支援移動端(iOS、安卓)的呼叫。若是需要前後端分離,可直接將static與views資料夾分離出來即可。

三、專案初始化

新建專案跟資料夾BTCWallet,然後按照如下步驟執行

新建專案跟資料夾BTCWallet,然後按照如下步驟執行

lixu@ubuntu:~$ cd '/home/lixu/Desktop/demo/BTCWallet/' lixu@ubuntu:~/Desktop/demo/BTCWallet$ npm init

然後不斷回車初始化專案。然後後自動生成package.json檔案,是專案包的配置檔案,下面我們引入專案中需要用到的庫,複製下面json到package.json檔案的最後一個欄位。

, "dependencies": { "bitcore-wallet-client": "^6.7.5", "ejs": "^2.6.1", "express": "^4.16.4" }

專案的介面如下: 

然後執行以下命令按照上面的依賴庫。

npm install

下載完成後會將所有的依賴庫下載到專案根目錄自動新建的node_modules資料夾。

四、專案原始碼

按照如下結構搭建專案。

index.js

專案的入口檔案。首先例項化express物件,然後將express.urlencoded、ejs、views、static路由註冊到中介軟體,服務繫結到3000埠。

各字斷含有:

BWS_URL: bitcore-wallet服務端地址,我們使用的是bitpay的地址,你也可以自己搭建一個錢包服務端。

networkType: 錢包連線的網路型別,支援正式網路和測試網路,分別表示為:livenet、testnet。

coinType: 幣種型別,支援比特幣和比特幣現金,分別表示為:btc、bch。

copayerName: 錢包的擁有者,建立錢包的一個必填字斷,這裡我就指定為常量“lixu”。

walletFilePath: 建立錢包後匯出的檔案的存放位置。

Models/walletClient.js

出來wallet的model檔案,這裡只有一個方法,例項化bitcore-wallet客戶端。

let config = require("../config/config")

module.exports = {

 getWalletClient: () => {

 var Client = require('bitcore-wallet-client');

 var client = new Client({

 baseUrl: config.BWS_URL,

 verbose: false,

 });

 return client

 },

}

router/router.js

路由檔案。

let router = require('express').Router();

router.get("/wallet.html", (req, res) => {

 res.render("wallet.html");

})

module.exports = router

utils/myUtils.js

專案工具類,提供返回給前端成功與失敗的基本資料結構、判斷字串是否以某個字串結尾。

參考資料

express的github:https://github.com/expressjs/express

ejs的github:https://github.com/tj/ejs

bitcore-wallet-client的github:https://github.com/bitpay/bitcore-wallet-client

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;