风险提示:理性看待区块链,提高风险意识!
以太坊钱包开发:创建钱包账号
首页 > 币界资讯 > 区块链知识 2018-12-21 07:59
摘要
以太坊去中心化网页钱包开发系列,本系列将从零开始开发出一个可以实际使用的钱包,本系列是理论与实战相结合,文章一共有四篇:创建钱包账号、账号Keystore文件导入导出、展示钱包信息及发起签名交易、发送Token(代币),这是第一篇,主要介绍钱包将实现哪些功能及怎么创建钱包账号,本钱包是基于ether 。
币界网报道:

以太坊去中心化网页钱包开发系列,本系列将从零开始开发出一个可以实际使用的钱包,本系列是理论与实战相结合,文章一共有四篇:创建钱包账号、账号Keystore文件导入导出、展示钱包信息及发起签名交易、发送Token(代币),这是第一篇,主要介绍钱包将实现哪些功能及怎么创建钱包账号,本钱包是基于ethers.js 进行开发。

去中心化网页钱包

先明确一下定义,什么是去中心化钱包,账号秘钥的管理,交易的签名,都是在客户端完成, 即私钥相关的信息都是在用户手中,钱包的开发者接触不到私钥信息。

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

网页钱包,或者叫web钱包,是指钱包以网页的形式展现,去中心化网页钱包则交易的签名等操作是在浏览器里完成。
其他形式的钱包,如Android钱包或iOS钱包其开发思路和web钱包一样,因此文本对开发其他平台的钱包也有参考意义,不过本系列文章主要侧重在钱包功能的实现,并未过多考虑用户体验。

钱包功能

一个钱包通常主要包含的功能有:

  • 账号管理(主要是私钥的管理):创建账号、账号导入导出
  • 账号信息展示:如以太币余额、Token(代币)余额。
  • 转账功能:发送以太币及发送Token(代币)

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

这些功能主要表现为钱包的两个界面,一个界面是:账号管理,一个界面是进行账号信息展示及转账。下面逐个进行介绍

创建钱包账号

读过上一篇文章理解开发HD 钱包涉及的 BIP32、BIP44、BIP39的同学,会知道创建账号,可以有两种方式:

  • 直接生成32个字节的数当成私钥
  • 通过助记词进行确定性推导出私钥

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

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

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

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

注意ethers.utils.randomBytes 生成的是一个字节数组,如果想用十六进制数显示出来表示,需要转化为BigNumber代码如下:

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

现在我们结合界面,完整的实现创建账号,其效果图如下,加载私钥时创建账号。

1

界面代码(HTML)代码如下(主要是在表格中定义个一个输入框及一个按钮):

1
2
3
4
5
6
7
8
9
10
11
12
<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)如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 使用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有:

1
2
3
4
5
6
7
8
9
10
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);

现在我们结合界面来实现一下通过助记词方式创建钱包账号,其效果图如下:

2

界面代码(HTML)代码如下(主要是在表格中定义个两个输入框及一个按钮):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<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)如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    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 还提供了一个更简单的方法来创建钱包:

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

参考文档:
ethers.js

本文由专栏作者“Tiny熊”上传发表,未经许可请勿转载。

发表评论
发表评论
暂无评论
    相关阅读
    由前FTX和Alameda Research员工创立的加密货币交易平台Backpack Exchange将以3200万美元收购FTX EU。
    区块链
    2025-01-08 06:18:26
    在即将到来的一系列升级中,Illuvium将利用Virtuals Protocol AI代理为更智能的游戏角色提供动力。
    区块链
    2025-01-08 04:28:54
    2025年将成为加密货币市场另一个令人兴奋和看涨的一年,因为比特币再次突破102000美元。这一成就
    比特币
    2025-01-08 02:38:49
    比特币和以太坊ETF从2025年开始就处于亏损状态,但现在在过去两个交易日共吸引了17.5亿美元。
    比特币
    2025-01-08 01:27:18
    昨天,执行R0AR协会(ERS)NFT公开发售,售出了2700多个代币。对基于以太坊的代币的兴趣归因于
    区块链
    2025-01-08 01:16:47
    推荐专栏
    Boss Wallet Web3 Econom Pass
    Fully On-Chain & AI-Powered Meme Trading | #Xbit #DEX #Web3 | English: @XBITDEX | Chinese 华语 : @XBITDEX_ZH | Support: @XbitHelpDesk
    一位相信价值投资的币圈KOL。稳定盈利的缠论野生交易员 #BTC行情分析师 #价值投资 #链上数据分析
    爱Web 3,爱生活,爱科技,爱炒币的老韭菜
    热门币种
    更多
    币种
    美元价格
    24H涨跌幅
    BTC比特币
    60,963.61 USDT
    ¥435,103.38
    -2.72%
    ETH以太坊
    3,368.69 USDT
    ¥24,042.67
    -0.3%
    BNB币安币
    570.68 USDT
    ¥4,073.00
    -0.28%
    USDT泰达币
    1.02 USDT
    ¥7.25
    -0.19%
    SOL
    135.96 USDT
    ¥970.36
    +7.66%
    USDC
    1.00 USDT
    ¥7.15
    -0.01%
    TON
    7.59 USDT
    ¥54.14
    +4.55%
    XRP瑞波币
    0.47720 USDT
    ¥3.41
    +0.48%
    DOGE狗狗币
    0.12210 USDT
    ¥0.87140
    +2.43%
    ADA艾达币
    0.39050 USDT
    ¥2.79
    +3.88%
    热搜币种
    更多
    币种
    美元价格
    24H涨跌幅
    狗狗币
    0.3541 USDT
    ¥2.59
    -9.65%
    Filecoin
    5.3381 USDT
    ¥39.11
    -10.48%
    比特币
    96512.03 USDT
    ¥707,090.56
    -5.13%
    Gatechain Token
    17.9689 USDT
    ¥131.65
    -2.85%
    Horizen
    23.2652 USDT
    ¥170.45
    -17.39%
    dYdX
    1.4038 USDT
    ¥10.28
    -13.8%
    Solana
    198.71 USDT
    ¥1,455.84
    -8.68%
    柚子
    0.814 USDT
    ¥5.96
    -10.6%
    Shiba Inu
    2.174E-5 USDT
    ¥0.00
    -9.45%
    艾达币
    0.998 USDT
    ¥7.31
    -8.29%
    FTX Token
    2.9131 USDT
    ¥21.34
    -13.97%
    火币积分
    0.9291 USDT
    ¥6.81
    -29.01%
    最新快讯
    更多
    WEEX交易所WE-Launch上线Violet,投入WXT瓜分3100万枚VIOLET代币
    2025-01-08 12:00:34
    美国现货比特币ETF昨日净流入5346万美元
    2025-01-08 12:00:02
    昨日美国比特币现货ETF净流入5348万美元
    2025-01-08 11:59:02
    CertiKAlert:7天前部署的IPC代币存在漏洞,黑客通过闪电贷保护机制盗取约59万美元
    2025-01-08 11:58:42
    IREN:2024全年比特币挖矿产出达3984枚BTC
    2025-01-08 11:57:41
    昨日贝莱德IBIT净流入5.9718亿美元,交易量达31亿美元
    2025-01-08 11:54:57
    IPC代币疑遭攻击,损失约59万美元
    2025-01-08 11:53:10