前言
本文全面解析加密钱包从创建到上链的完整闭环:
- 钱包生成:助记词、私钥、地址的派生与恢复
- 链上交互:余额查询、签名、转账、合约部署
- 资产发行:一键创建 ERC-20 同质化代币、ERC-721 非同质化资产
实现钱包创建和导入的实现
实现核心说明:主要借助Ethers实现创建随机钱包和导入现有钱包
- 创建钱包核心代码
# 创建随机钱包
import { ethers } from "ethers";
const wallet = ethers.Wallet.createRandom();
console.log("创建钱包地址:",wallet.address)
console.log("创建钱包助记词:",wallet.mnemonic)
console.log("创建钱包私钥:",wallet.privateKey)
- 导入钱包核心代码
import { ethers } from "ethers";
# 助记词
const mnemonic=""//助记词
const walletmnemonic = ethers.Wallet.fromPhrase(mnemonic);
# 私钥
const privateKey=""//私钥
const wallet = new ethers.Wallet(privateKey)
console.log("创建钱包地址:",wallet.address)
- 钱包方法说明
| 分类 | 方法 / 属性 | 说明 | 示例 |
|---|---|---|---|
| 创建 | Wallet.createRandom() |
生成随机钱包(新私钥 + 助记词) | Wallet.createRandom() |
Wallet.fromPhrase(mnemonic, path?, wordlist?) |
从助记词恢复(默认路径 m/44'/60'/0'/0/0) | Wallet.fromPhrase('apple …') |
|
new Wallet(privateKey) |
从私钥构造钱包 | new Wallet('0x1234…') |
|
Wallet.fromEncryptedJson(json, password) |
从 keystore V3 解密钱包 | Wallet.fromEncryptedJson(json, pw) |
|
Wallet.fromEncryptedJsonSync(json, password) |
同步版本(文件小可用) | 同上 | |
| 属性 | wallet.address |
钱包地址(EIP-55 校验和) | wallet.address |
wallet.publicKey |
未压缩公钥(0x04…) | wallet.publicKey |
|
wallet.privateKey |
私钥(0x…) | wallet.privateKey |
|
wallet.mnemonic |
助记词对象(.phrase 取出字符串) |
wallet.mnemonic.phrase |
|
| 签名 | wallet.signMessage(message) |
对字符串/字节签名 | wallet.signMessage('hello') |
wallet.signTransaction(tx) |
对交易对象签名 | wallet.signTransaction(tx) |
|
wallet.signTypedData(domain, types, value) |
EIP-712 结构化签名 | wallet.signTypedData(…) |
|
| 发送 | wallet.sendTransaction(tx) |
签名并广播交易 | wallet.sendTransaction(tx) |
| 连接 Provider | wallet.connect(provider) |
返回带有 Provider 的新钱包实例 | wallet.connect(provider) |
| 加密 / 导出 | wallet.encrypt(password, options?) |
导出 keystore V3 JSON | wallet.encrypt('mypw') |
如果需要了解更多关于Ethers的内容可以查看作者的另外两篇文章《ethers.js 全栈开发实战:从 Provider 到 Utils 的 6 大核心模块深度解析》、《基于 ethers.js 的区块链事件处理与钱包管理实践指南》
特别说明:React Native 构建app和PC端在使用Ethers时需要在入口文件(index.tsx)中导入import 'react-native-get-random-values';组件才能正常使用
创建代币
实现核心说明:借助solidity和openzeppelin编写合约代码,通过ethers调用合约
- ERC20代币核心代码
// SPDX-License-Identifier: MIT
// Compatible with OpenZeppelin Contracts ^5.0.0
pragma solidity ^0.8.22;
import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import {ERC20Burnable} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol";
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
import "hardhat/console.sol";
contract MyToken is ERC20, ERC20Burnable, Ownable {
constructor(string memory name_,string memory symbol_,number memory amount_,string memory address initialOwner)
ERC20(name_, symbol_,amount_,)
Ownable(initialOwner)
{
_mint(msg.sender, amount_ * 10 ** decimals());
}
function mint(address to, uint256 amount) public onlyOwner {
_mint(to, amount);
}
}
- 部署合约
# 借助hardhat部署
module.exports = async ({getNamedAccounts,deployments})=>{
const getNamedAccount = (await getNamedAccounts()).firstAccount;
const TokenName = "BoykayuriToken";
const TokenSymbol = "BTK";
const {deploy,log} = deployments;
const Token=await deploy("MyToken",{
from:getNamedAccount,
args: [TokenName,TokenSymbol,getNamedAccount],//根据参数不同调整
log: true,
})
// await hre.run("verify:verify", {
// address: TokenC.address,
// constructorArguments: [TokenName, TokenSymbol],
// });
console.log('合约地址',TokenC.address)
}
module.exports.tags = ["all", "token"];
- 关于合约编译、部署、测试:可以参考作者写的另一篇文章《 智能合约开发、测试、部署全流程(实操篇)》,《web3相关知识分享》专栏中也有大量的案例供参考
- Ethers调用合约
import { ethers } from 'ethers';
// 1. 配置
const RPC_URL = 'https://sepolia.infura.io/v3/<YOUR_INFURA_KEY>';//可以通过注册infura获取YOUR_INFURA_KEY
const PRIVATE_KEY = '0x你的私钥'; // 测试钱包的私钥
// 2. 合约字节码 & ABI
const bytecode =
'0x608060405234801561001057600080fd5b50...'; // Remix 编译后复制
const abi = [];//可以通过编译生成json文件中取
// 3. 连接
const provider = new ethers.JsonRpcProvider(RPC_URL);
const wallet = new ethers.Wallet(PRIVATE_KEY, provider);//可操作
// 4. 部署
async function deploy() {
const factory = new ethers.ContractFactory(abi, bytecode, wallet);//合约地址
const contract = await factory.deploy(
1_000_000, // 发行 100 万枚
{ gasLimit: 2_000_000 }
);
await contract.waitForDeployment();
console.log('合约地址:', contract.target);
}
await deploy();
创建NFT
说明:基本同创建ERC20代币合于大同小异,主要的区别在IPFS存储部分,
关于NFT合约部分可以参考作者的另一篇文章
《快速实现一个标准的NFT合约(实操篇)》
效果图

微信图片_20250813221946_15.jpg

微信图片_2025-08-13_221850_114.jpg

微信图片_20250813221901_11.jpg

微信图片_20250813221926_14.jpg

微信图片_2025-08-13_221856_419.jpg

微信图片_2025-08-13_221908_537.jpg

微信图片_20250813221838_8.jpg
总结
至此,你已掌握加密钱包的完整生命周期:
从「随机生成 / 助记词恢复」到「私钥-地址派生」,再到「签名、发送交易」。
更进一步,凭借这些密钥即可在链上 一键部署并发行 ERC-20 同质化代币或 ERC-721 非同质化资产,实现资产的确权与自由流转。