导读: TokenPocket(简称TP钱包)是一款支持多区块链的数字钱包,用户的资产、交易记录等数据都公开存储在对应区块链上,通过代码自动获取TP钱包的链上数据,可用于开发钱包工具、链上数据分析、资产监控等场景,本文将以以太坊主网为例,用Ethers.js(前端/后端常用的区块链交互库)实现核心数据的获取...
TokenPocket(简称TP钱包)是一款支持多区块链的非托管数字钱包,用户资产由自身私钥掌控,其地址对应的余额、交易记录等链上数据公开可查,通过Ethers.js(前端/后端通用区块链交互库)可自动化获取TP钱包的链上数据,广泛应用于资产监控、钱包工具开发、链上数据分析等场景,本文以以太坊主网为例,详解核心数据获取的实现逻辑与代码。
前置准备
- 环境依赖:安装Node.js(v14+,推荐v16 LTS版本,兼容性更稳定)
- Ethers.js安装:
# 初始化项目(若已有项目可跳过) npm init -y # 安装Ethers.js库 npm install ethers
- 区块链节点/区块浏览器API Key:
- 推荐用Infura/Alchemy免费节点(注册后可获免费额度,支持节点RPC调用);
- 或Etherscan/BSCScan等区块浏览器API Key(用于获取完整交易历史)。
核心步骤与代码示例
步骤1:连接以太坊节点
初始化节点提供者,建立与以太坊主网的交互通道(需替换为你自己的API Key):
const { ethers } = require("ethers");
// 以太坊主网节点(替换为你的Infura/Alchemy API Key)
const provider = new ethers.providers.JsonRpcProvider(
"https://mainnet.infura.io/v3/你的Infura_API_Key"
);
// 示例TP钱包地址(需替换为实际地址,Ethers.js会自动校验EIP-55格式)
const TP_ADDRESS = "0x1234567890abcdef1234567890abcdef1234567";
说明:TP钱包地址需为42位十六进制的校验和地址,Ethers.js会自动校验格式合法性,若报错请检查地址是否正确。
步骤2:获取TP钱包的ETH原生币余额
以太坊最小单位为wei,需转换为可读的ETH格式:
async function getEthBalance() {
// 调用链上接口获取wei单位余额(BigNumber类型)
const balanceWei = await provider.getBalance(TP_ADDRESS);
// 将wei转换为ETH(1 ETH = 10^18 wei,等价于ethers.utils.formatUnits(balanceWei,18))
const balanceEth = ethers.utils.formatEther(balanceWei);
console.log(`TP钱包ETH余额:${balanceEth} ETH`);
}
// 执行函数
getEthBalance();
步骤3:获取TP钱包的ERC20代币余额(以USDT为例)
ERC20代币需通过合约ABI调用标准balanceOf方法,以以太坊主网USDT合约为例:
// 以太坊主网USDT合约地址(注意:其他链需替换对应合约地址)
const USDT_CONTRACT = "0xdac17f958d2ee523a2206206994597c13d831ec7";
// ERC20核心ABI(仅需balanceOf方法,无需冗余定义)
const ERC20_ABI = [
"function balanceOf(address owner) view returns (uint256)"
];
async function getTokenBalance() {
// 创建USDT合约实例,绑定节点提供者
const usdtContract = new ethers.Contract(
USDT_CONTRACT,
ERC20_ABI,
provider
);
// 获取USDT余额(单位:wei)
const usdtBalanceWei = await usdtContract.balanceOf(TP_ADDRESS);
// USDT小数位数为6,需对应调整formatUnits的第二个参数(不同代币小数不同,如UNI为18)
const usdtBalance = ethers.utils.formatUnits(usdtBalanceWei, 6);
console.log(`TP钱包USDT余额:${usdtBalance} USDT`);
}
// 执行函数
getTokenBalance();
步骤4:获取TP钱包的最近交易记录
由于节点仅存储近期区块数据,获取完整交易历史推荐用区块浏览器API(以Etherscan为例):
async function getRecentTransactions() {
// 初始化Etherscan提供者,绑定主网与API Key
const etherscanProvider = new ethers.providers.EtherscanProvider(
"homestead", // 以太坊主网标识
"你的Etherscan_API_Key"
);
// 获取TP地址最近10笔交易(默认最多返回100笔,可调整参数)
const txHistory = await etherscanProvider.getHistory(TP_ADDRESS, 10);
console.log("TP钱包最近10笔交易:");
txHistory.forEach((tx, index) => {
console.log(`${index+1}. 交易哈希:${tx.hash}`);
console.log(` 金额:${ethers.utils.formatEther(tx.value)} ETH`);
console.log(` 时间:${new Date(tx.timestamp * 1000).toLocaleString()}\n`);
});
}
// 执行函数
getRecentTransactions();
注意事项与扩展
- 多链适配:若要获取BSC、Polygon等链的数据,只需更换节点URL、对应代币合约地址即可,无需修改核心逻辑;
- API限制:免费节点/区块浏览器API有调用频率限制(如Infura免费版每秒10次),生产环境需升级付费节点;
- 数据安全:所有操作仅读取链上公开数据,无需TP钱包私钥,绝对安全可靠;
- 代币小数适配:不同ERC20代币小数位数不同(如USDC为6、DAI为18),调用
formatUnits时需对应调整第二个参数; - 扩展场景:可基于上述逻辑开发多链资产看板、批量地址监控工具、链上代币持有分布分析等应用。
将上述代码保存为index.js,替换API Key与TP地址后,在终端运行node index.js即可验证结果,若遇到节点报错,优先检查API Key有效性、网络连接或额度是否用尽。
转载请注明出处:qbadmin,如有疑问,请联系()。
本文地址:https://qhhblyw.com/sbbt/4907.html
