使用 Ethers.js 开发以太坊 Web 钱包:创建钱包账号

·

以太坊去中心化网页钱包开发系列,本教程将指导你从零开始开发一个实际可用的 Web 钱包应用。本系列采用理论与实践相结合的方式,共包含四篇文章,涵盖核心功能的实现方法与技术细节。本文作为系列首篇,重点介绍钱包的基本功能规划以及如何创建钱包账号,所有功能均基于 Ethers.js 库实现。

什么是去中心化网页钱包

去中心化钱包的核心特征在于:所有账号密钥管理与交易签名操作均在客户端完成,用户完全掌控私钥,开发者无法接触敏感信息。相比之下,中心化钱包(如交易所托管钱包)的私钥由服务器管理,用户不直接持有密钥。

网页钱包(Web Wallet)以网页形式提供钱包功能,去中心化设计确保所有签名过程在浏览器内安全执行。尽管本教程以 Web 钱包为例,其开发思路同样适用于 Android 或 iOS 平台,具有广泛的参考价值。

钱包核心功能概述

一个完整的去中心化钱包通常包含以下功能模块:

这些功能将基于 Ethers.js 库进行开发。Ethers.js 是一个功能完善的以太坊交互库,不仅提供区块链交互功能,还完整实现了 BIP39 等相关标准,是开发钱包应用的理想选择。

创建钱包账号的两种方法

根据 BIP32、BIP44 和 BIP39 标准,创建钱包账号主要有两种方式:使用随机数直接生成私钥,或通过助记词确定性推导私钥。下面详细介绍这两种方法的实现过程。

方法一:使用随机数生成私钥

这种方法直接生成32字节随机数作为私钥,快速简单:

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

生成的 wallet 对象包含地址属性及后续操作所需的各种方法,如查询余额、发送交易等。

若需要以十六进制格式显示私钥,可进行如下转换:

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 逻辑代码处理生成和导入操作:

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);
});

用户可输入已有私钥导入账户,或使用新生成的私钥创建账户。

方法二:通过助记词创建钱包

这是目前主流钱包采用的方案,通过助记词推导出层级确定性钱包:

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 还提供了更简洁的钱包创建方法:

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

这种方法一键生成包含私钥和助记词的完整钱包对象,适合快速开发测试场景。

常见问题

什么是以太坊去中心化钱包?

去中心化钱包是一种用户完全掌控私钥的钱包解决方案,所有交易签名都在用户设备上完成,服务器不存储任何敏感信息。这种设计提供了更高的安全性和隐私保护,符合区块链去中心化理念。

Ethers.js 与 Web3.js 有何区别?

Ethers.js 和 Web3.js 都是以太坊开发库,但设计哲学不同。Ethers.js 采用分模块设计,对钱包功能支持更完善,特别是对 BIP39 等标准的原生支持,使其更适合钱包应用开发。

助记词为什么需要校验?

助记词校验确保词组的有效性和正确性,防止因输入错误导致资产损失。验证过程检查单词是否属于标准词库、词序是否正确以及校验和是否匹配,是多层次的安全保护机制。

如何选择私钥生成方式?

随机数生成方式简单快捷,适合技术用户;助记词方式虽然步骤稍多,但备份和恢复更方便,适合普通用户。实际产品中通常同时提供两种方式,但推荐用户使用助记词方案。

路径参数 m/44'/60'/0'/0/0 的含义是什么?

这是 BIP44 标准规定的以太坊派生路径,其中:m代表主节点,44'表示使用BIP44标准,60'代表以太坊币种,0'表示账户索引,0表示外部链,0表示地址索引。不同层级有特定含义,遵循行业标准。

钱包创建后如何安全备份?

建议采用多重备份策略:助记词写在防火防水的材质上并存放在安全地点;加密存储Keystore文件并分散备份;避免数字方式存储明文私钥。定期检查备份的可访问性和完整性。

开发去中心化钱包应用需要扎实的技术基础和安全意识,正确实现密钥管理功能是保障用户资产安全的关键。通过本教程介绍的方法,你可以建立起钱包应用的核心账号管理系统,为后续功能开发奠定基础。