以太坊錢包開發系列1 - 建立錢包帳號

本文首發於深刻淺出區塊鏈社區 原文連接:使用 ethers.js 開發以太坊 Web 錢包 1 - 建立錢包帳號) 原文已更新,請讀者前往原文閱讀html

以太坊去中心化網頁錢包開發系列,將從零開始開發出一個能夠實際使用的錢包,本系列文章是理論與實戰相結合,一共有四篇:建立錢包帳號帳號Keystore文件導入導出展現錢包信息及發起簽名交易發送Token(代幣),這是第一篇,主要介紹錢包將實現哪些功能及怎麼建立錢包帳號,本錢包是基於ethers.js 進行開發。web

去中心化網頁錢包

先明確一下定義,什麼是去中心化錢包,帳號祕鑰的管理,交易的簽名,都是在客戶端完成, 即私鑰相關的信息都是在用戶手中,錢包的開發者接觸不到私鑰信息。數組

對應的中心化錢包則是私鑰由中心服務器託管,如交易所的錢包就是這種。瀏覽器

網頁錢包,或者叫web錢包,是指錢包以網頁的形式展示,去中心化網頁錢包則交易的簽名等操做是在瀏覽器裏完成。 其餘形式的錢包,如Android錢包或iOS錢包其開發思路和web錢包同樣,所以文本對開發其餘平臺的錢包也有參考意義,不過本系列文章主要側重在錢包功能的實現,並未過多考慮用戶體驗。服務器

錢包功能

一個錢包一般主要包含的功能有:微信

  • 帳號管理(主要是私鑰的管理):建立帳號、帳號導入導出
  • 帳號信息展現:如以太幣餘額、Token(代幣)餘額。
  • 轉帳功能:發送以太幣及發送Token(代幣)

這些功能將基於 ethers.js 進行開發, ethers.js 和web3.js 同樣,也是一套和以太坊區塊鏈進行交互的庫,不只如此,ethers.js 還對BIP 39等相關的提案進行了實現,能夠在這個連接閱讀其文檔。dom

這些功能主要表現爲錢包的兩個界面,一個界面是:帳號管理,一個界面是進行帳號信息展現及轉帳。下面逐個進行介紹學習

建立錢包帳號

讀過上一篇文章理解開發HD 錢包涉及的 BIP3二、BIP4四、BIP39的同窗,會知道建立帳號,能夠有兩種方式:區塊鏈

  • 直接生成32個字節的數當成私鑰
  • 經過助記詞進行肯定性推導出私鑰

使用隨機數做爲私鑰建立錢包帳號

即方式一,可使用ethers.utils.randomBytes生成一個隨機數,而後使用這個隨機數來建立錢包,如代碼:ui

var privateKey = ethers.utils.randomBytes(32);
var wallet = new ethers.Wallet(privateKey);
console.log("帳號地址: " + wallet.address);

複製代碼

上面代碼的 wallet 是 ethers 中的一個錢包對象,它除了有代碼中出現的.address 屬性以外,還有如 獲取餘額、發送交易等方法,在後面的文章會進行介紹。

注意ethers.utils.randomBytes 生成的是一個字節數組,若是想用十六進制數顯示出來表示,須要轉化爲BigNumber代碼以下:

let keyNumber = ethers.utils.bigNumberify(privateKey);
console.log(randomNumber._hex);
複製代碼

如今咱們結合界面,完整的實現建立帳號,其效果圖以下,加載私鑰時建立帳號。

界面代碼(HTML)代碼以下(主要是在表格中定義個一個輸入框及一個按鈕):

<table>
                    <tr>
                        <th>私鑰:</th>
                        <td><input type="text" placeholder="(private key)" id="select-privatekey" /></td>
                    </tr>
                    <tr>
                        <td> </td>
                        <td>
                            <div id="select-submit-privatekey" class="submit">加載私鑰</div>
                        </td>
                    </tr>
                </table>
複製代碼

對應的邏輯代碼(JavaScript)以下:

// 使用JQuery獲取兩個UI標籤
    var inputPrivatekey = $('#select-privatekey');
    var submit = $('#select-submit-privatekey');

// 生成一個默認的私鑰
    let randomNumber = ethers.utils.bigNumberify(ethers.utils.randomBytes(32));
    inputPrivatekey.val(randomNumber._hex);

// 點擊「加載私鑰」時, 建立對應的錢包
    submit.click(function() {
        var privateKey = inputPrivatekey.val();
        if (privateKey.substring(0, 2) !== '0x') { privateKey = '0x' + privateKey; }
       var wallet = new ethers.Wallet(privateKey));

    });

複製代碼

若是用戶提供一個已有帳號的私鑰,則會導入其原有帳號。

經過助記詞方式建立錢包帳號

這是目前主流常見錢包的方式,關於助記詞推導過程請閱讀理解開發HD 錢包涉及的 BIP3二、BIP4四、BIP39

咱們須要先生成一個隨機數,而後用隨機數生成助記詞,隨後用助記詞建立錢包帳號,設計到的API有:

var rand = ethers.utils.randomBytes(16);

// 生成助記詞
var mnemonic = ethers.utils.HDNode.entropyToMnemonic(rand);

var path = "m/44'/60'/0'/0/0";

// 經過助記詞建立錢包
ethers.Wallet.fromMnemonic(mnemonic, path);
複製代碼

如今咱們結合界面來實現一下經過助記詞方式建立錢包帳號,其效果圖以下:

界面代碼(HTML)代碼以下(主要是在表格中定義個兩個輸入框及一個按鈕):

<table>
        <tr>
            <th>助記詞:</th>
            <td><input type="text" placeholder="(mnemonic phrase)" id="select-mnemonic-phrase" /></td>
        </tr>
        <tr>
            <th>Path:</th>
            <td><input type="text" placeholder="(path)" id="select-mnemonic-path" value="m/44'/60'/0'/0/0" /></td>
        </tr>
        <tr>
            <td> </td>
            <td>
                <div id="select-submit-mnemonic" class="submit">推倒</div>
            </td>
        </tr>
    </table>

複製代碼

對應的邏輯代碼(JavaScript)以下:

var inputPhrase = $('#select-mnemonic-phrase');
    var inputPath = $('#select-mnemonic-path');
    var submit = $('#select-submit-mnemonic');

// 生成助記詞
    var mnemonic = ethers.utils.HDNode.entropyToMnemonic(ethers.utils.randomBytes(16));
    inputPhrase.val(mnemonic);

    submit.click(function() {
    // 檢查助記詞是否有效。
        if (!ethers.utils.HDNode.isValidMnemonic(inputPhrase.val())) {
            return;
        }

// 經過助記詞建立錢包對象
       var wallet = ethers.Wallet.fromMnemonic(inputPhrase.val(), inputPath.val());
    });
複製代碼

一樣用戶能夠提供一個其保存的助記詞來導入其錢包,有一些遺憾的是,ethers.js 暫時不支持經過添加密碼做爲Salt來保護種子(也多是我沒有找到,若是知道的同窗,但願反饋下),若是須要此功能能夠引入bip39 和 ethereumjs-wallet 庫來實現,代碼可參考理解開發HD 錢包涉及的 BIP3二、BIP4四、BIP39

小結

其實 ethers 還提供了一個更簡單的方法來建立錢包:

// 直接建立一個隨機錢包
   ethers.Wallet.createRandom();
複製代碼

完整源碼請訂閱深刻淺出區塊鏈技術小專欄查看, 哈哈,是否是有一點雞賊,創做不易呀。 戳連接收看詳細的視頻課程講解

參考文檔: ethers.js

深刻淺出區塊鏈 - 系統學習區塊鏈,打造最好的區塊鏈技術博客。

深刻淺出區塊鏈知識星球最專業技術問答社區,加入社區還能夠在微信羣裏和300多位區塊鏈技術愛好者一塊兒交流。

相關文章
相關標籤/搜索