956 字
5 分钟
Web3钱包
Web3 钱包是区块链世界的数字身份入口,本质是私钥管理器 + 区块链交互网关,具备以下核心特征:
- 非托管性:用户完全掌控私钥
- 协议兼容性:支持 EVM/非 EVM 等多链体系
- 可扩展架构:通过插件支持新链/新协议
- 标准化交互:遵循 EIP-1193、EIP-6963 等标准
核心用途
- 资产管理:存储/转移代币(ETH、ERC20等)
- 身份凭证:作为去中心化身份(DID)载体
- DApp 交互:连接 DeFi、NFT 等去中心化应用
- 智能合约操作:执行合约方法调用
- 数字签名:验证交易和消息的合法性
使用 Ethers.js 库创建钱包
1. 创建随机的wallet对象
import { ethers } from "ethers"; // V6版本
const provider = new ethers.JsonRpcProvider('RPC URL');
// 创建随机私钥的Wallet对象
const wallet = ethers.Wallet.createRandom();
// 这种方法创建的钱包是单机的,我们需要用connect(provider)函数,连接到以太坊节点。
const wallet1WithProvider = wallet.connect(provider);
const mnemonic = wallet.mnemonic; // 获取助记词
const privateKey = wallet.privateKey; // 获取私钥
2. 用私钥创建wallet对象
import { ethers } from "ethers"; // V6版本
const provider = new ethers.JsonRpcProvider('RPC URL');
// 我们已知私钥的情况下,可以利用ethers.Wallet()函数创建Wallet对象。
// 利用私钥和Provider实例创建Wallet对象。这种方法创建的钱包不能获取助记词。
const wallet = ethers.Wallet('privateKey', provider);
3. 从助记词创建wallet对象
import { ethers } from "ethers"; // V6版本
const provider = new ethers.JsonRpcProvider('RPC URL');
const wallet = ethers.Wallet.fromPhrase("mnemonic.phrase");
4. 通过 keystore JSON文件创建wallet对象
// const json = wallet.encrypt("password"); // 调用 encrypt 方法获取keystore json
const wallet = ethers.Wallet.fromEncryptedJson("keystore json", "password");
HD钱包
HD钱包(Hierarchical Deterministic Wallet,多层确定性钱包)是一种用于管理加密货币的数字钱包。它通过一个随机种子生成一系列密钥对,使得管理多个钱包变得更加便利、安全和私密。HD钱包的设计基于几个比特币改进提案(BIP),其中最重要的包括BIP32、BIP44和BIP39。
- BIP32:在BIP32推出之前,用户需要记录多个私钥来管理多个钱包。BIP32允许用户通过一个随机种子生成多个私钥,简化了钱包管理。钱包的地址由衍生路径决定,例如“m/0/0/1”。
- BIP44:为BIP32的衍生路径提供了一套通用规范,适用于比特币、以太坊等多链。这一规范包含六级,每级之间用“/”分割。
- BIP39:让用户可以通过人类可记忆的助记词来保管私钥,而不是一串难以记忆的16进制数字。
HD钱包的优点
- 单种子管理: 只需备份一次助记词(12/24个单词),即可控制所有派生地址,避免传统钱包需要逐个备份私钥的麻烦。
- 地址无限扩展: 通过路径 m/44’/60’/0’/0/0 最后的索引号(如0,1,2…),可以按需生成新地址
- 层级权限控制: 分层结构(如 m/账户/链/地址)可实现:
- 主密钥离线保管(冷钱包)
- 子密钥用于日常交易(热钱包)
- 安全隔离: 即使某个子密钥泄露(如 m/44’/60’/0’/0/3),也不会影响其他分支的密钥
HD钱包的实现
import { ethers } from "ethers"; // V6
// 1. 生成随机助记词:使用ethers库生成32字节的随机数(熵),并将其转换为助记词。
const entropy = ethers.randomBytes(32);
const mnemonic = ethers.Mnemonic.entropyToPhrase(entropy);
// 2. 创建HD基钱包:使用助记词和基路径创建一个HD基钱包。
// 基路径:"m / purpose' / coin_type' / account' / change"
let basePath = "m/44'/60'/0'/0";
const hdNode = ethers.HDNodeWallet.fromPhrase(mnemonic, null, basePath);
// 3. 派生多个钱包:通过改变地址索引,从基钱包派生出多个钱包。
const numWallet = 20;
const wallets = [];
for (let i = 0; i < numWallet; i++) {
let hdNodeNew = hdNode.deriveChild(i);
let walletNew = new ethers.Wallet(hdNodeNew.privateKey);
wallets.push(walletNew);
console.log(walletNew.address);
}