主页 > imtoken苹果怎么下载 > 使用ethers.js开发以太坊网络钱包1——创建钱包账户

使用ethers.js开发以太坊网络钱包1——创建钱包账户

imtoken苹果怎么下载 2023-06-10 06:42:01

以太坊去中心化网页钱包开发系列,详细视频课程讲解直接点击链接,本系列将从零开始开发一款可以实际使用的钱包,本系列理论与实战相结合,共四篇:钱包账户,账户Keystore文件导入导出,显示钱包信息,发起签名交易,发送Token(代币)。 这是第一篇文章。 主要介绍钱包会实现哪些功能,以及如何创建钱包账户。 本钱包基于ethers.js开发。

去中心化网络钱包

先明确一下定义,什么是去中心化钱包,账户秘钥的管理,交易的签名都是在客户端完成的,也就是私钥相关的信息都在用户手中,钱包的开发者无法访问私钥信息。

对应的中心化钱包是私钥由中心服务器托管,比如交易所的钱包。

网页钱包,即网页钱包,是指钱包以网页的形式展示,而去中心化的网页钱包是指交易签名等操作都在浏览器中完成。 其他形式的钱包,如Android钱包或iOS钱包,其开发思路与网页版钱包相同,因此该文对于开发其他平台的钱包也很有帮助。 不过本系列文章主要以钱包功能的实现为主,并未过多考虑用户体验。

钱包功能

一个钱包通常主要包含以下功能:

这些功能将基于 ethers.js 进行开发。 与 web3.js 一样,ethers.js 也是一个用于与以太坊区块链交互的库。 不仅如此,ethers.js 还实现了 BIP 39 等相关提案,您可以在此链接阅读其文档。

这些功能主要体现在钱包的两个界面,一个界面是:账户管理,另一个界面是账户信息展示和转账。下面会一一介绍

创建钱包账户

看过上一篇了解HD钱包开发涉及的BIP32、BIP44、BIP39的同学就会知道,创建账户有两种方式:

使用随机数作为私钥创建钱包账户

即方法一,可以使用ethers.utils.randomBytes生成一个随机数,然后用这个随机数创建钱包,如代码:

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

上面代码中的钱包是以太坊中的一个钱包对象。 除了代码中出现的 .address 属性外,它还有获取余额、发送交易等方法,将在后面的文章中介绍。

请注意,ethers.utils.randomBytes 生成一个字节数组。 如果要以十六进制显示,需要转换成BigNumber代码如下:

let keyNumber = ethers.utils.bigNumberify(privateKey);
console.log(randomNumber._hex);

现在我们结合接口以太坊链有子钱包吗,完全实现账号的创建。 效果图如下,加载私钥时创建账户。

以太坊钱包trx链如何转账_以太坊轻钱包_以太坊链有子钱包吗

界面代码(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钱包开发中涉及的BIP32、BIP44、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);

下面我们结合界面,通过助记词创建钱包账户。 效果图如下:

以太坊轻钱包_以太坊链有子钱包吗_以太坊钱包trx链如何转账

界面代码(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钱包开发中涉及的BIP32、BIP44、BIP39。

概括

事实上,以太币还提供了一种更简单的方式来创建钱包:

   // 直接创建一个随机钱包
   ethers.Wallet.createRandom();

完整源码请订阅区块链技术深入浅出的小专栏。 哈哈,是不是有点鸡贼呢?

参考文档:ethers.js

Upchain社区——区块链技术爱好者之家,关注知乎、微博、微信(upchainedu),掌握区块链技术最新动态。