以太坊钱包开发系列1 – 创建钱包账号
时间: 2020年10月17日                     分类: 以太坊 标签:, ,

最新内容将在主网站上更新。区块链社区

原始链接:使用ethers.js开发以太坊Web钱包1-创建钱包帐户)

以太坊去中心网络钱包开发系列将开发可从头开始使用的钱包。这一系列文章是理论与实战的结合。共有四篇文章:创建钱包帐户以太坊钱包,导入帐户密钥库文件导出和显示钱包信息,启动签名交易以及发送Token(令牌),这是第一篇文章,主要介绍钱包将实现的功能以及如何实现。创建一个钱包帐户。该钱包是基于ethers.js开发的。

去中心网络钱包

首先澄清定义。什么是去中心钱包,帐户密钥的管理以及交易的签名都在客户端完成,也就是说,与私钥有关的信息在用户和钱包开发人员的手中联系人找不到私钥信息。

对应的集中式钱包是私钥由中央服务器托管,例如交换钱包。

Web钱包或Web钱包,表示该钱包以网页形式显示。在去中心化的网络钱包中,交易签名和其他操作在浏览器中完成。

其他形式的钱包,例如Android钱包或iOS钱包,具有与Web钱包相同的开发思路,因此该文本也可供其他平台上的钱包开发参考,但本系列文章主要关注于实现钱包功能,不要过多考虑用户体验。

钱包功能

钱包的主要功能通常包括:

这些功能将基于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);

现在,我们结合界面来完成帐户的创建。效果图如下。加载私钥时创建帐户。

界面代码(HTML)代码如下(主要定义表单中的输入框和按钮):

                
私钥:
加载私钥

相应的逻辑代码(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);

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

界面代码(HTML)代码如下(主要定义表单中的两个输入框和一个按钮):

    
助记词:
Path:
推倒

相应的逻辑代码(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不支持添加密码作为盐来保护种子(或者我找不到,如果您知道学生,希望提供反馈),如果需要此功能,可以介绍bip39和ethereumjs -wallet库来实现它。该代码可以参考参与HD钱包开发的BIP32、BIP44、BIP39。

摘要

实际上,以太币还提供了一种创建钱包的简便方法:

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

哈哈,祝贺大家,这是一个基于以太坊去中心的网络钱包的完整实现。

这是一篇内容广泛的文章,欢迎订阅区块链技术小专栏,目前只需花费69元,您就可以订阅以查看完整的源代码,还有其他惊喜〜。

选择链接以接收并观看详细的视频课程说明。

参考文档Ethers.js

深入的解释区块链-系统学习区块链,创建了最好的区块链技术博客。

深入了解区块链知识星球最专业的技术问答社区。加入社区还可以与微信小组中的300多区块链技术爱好者进行交流。