TokenPocket(简称TP)是当前Web3生态中主流的去中心化多链钱包,支持移动端、桌面端,覆盖以太坊、BSC、Polygon等数十条公链,是很多用户管理数字资产、参与DApp的常用工具,其生成的钱包地址本质是对应公链的公开身份标识(如以太坊地址以0x开头),链上的余额、交易记录等数据均为公开透明,任何人都可通过节点查询,本文将从区块链核心原理出发,结合实战代码,教你用JavaScript快速获取TP钱包的原生币余额、代币余额、交易记录等核心链上数据,为DApp、链上数据分析工具等项目提供基础数据支持。
核心原理
TP钱包本身不存储任何链上数据,这是区块链的核心特性:所有链上数据都记录在分布式账本的节点上,钱包仅负责管理地址和私钥,不持有数据,我们通过代码获取数据的本质是:
连接对应公链的RPC节点(远程过程调用节点),调用链上API查询该地址的公开状态。
- 无需私钥,安全可控:代码仅能读取链上公开数据,无法获取私钥或修改链上状态,完全符合区块链的“公开可查、不可篡改”特性。
- 多链适配需切换节点:TP地址在不同公链上是独立存在的,例如以太坊地址无法直接对应BSC链的资产,需针对不同公链切换RPC节点和合约地址。
环境准备
确保你的开发环境满足以下要求:
- 安装Node.js(版本≥14,推荐v16+);
- 初始化项目:在终端执行
npm init -y; - 安装依赖:
npm install web3 axios
说明:
web3用于和公链节点交互,axios用于调用区块链浏览器API获取交易记录。
实战代码示例
以下示例以以太坊主网为例,其他公链(如BSC、Polygon)仅需替换RPC节点和合约地址即可复用。
获取TP地址的原生币余额(ETH)
原生币是公链的基础代币(如以太坊的ETH、BSC的BNB),通过web3.eth.getBalance方法查询,返回的是最小单位(wei),需转换为可读单位。
const Web3 = require('web3');
// 连接以太坊主网RPC节点(Ankr公开节点稳定免费,也可替换为Infura/Alchemy付费节点)
const web3 = new Web3('https://rpc.ankr.com/eth');
// 替换为你的TP钱包以太坊地址
const TP_ADDRESS = '0xYourTPWalletAddressHere';
// 获取ETH余额(wei转ETH)
async function getEthBalance() {
try {
const balanceWei = await web3.eth.getBalance(TP_ADDRESS);
const balanceEth = web3.utils.fromWei(balanceWei, 'ether');
console.log(`TP地址ETH余额:${balanceEth} ETH`);
} catch (err) {
console.error('获取ETH余额失败:', err.message);
}
}
getEthBalance();
获取TP地址的ERC20代币余额(以USDT为例)
ERC20代币需调用对应合约的balanceOf方法,需传入合约ABI(仅保留核心方法即可),同时注意代币精度(不同代币精度不同,如USDT为6,UNI为18)。
// USDT合约核心ABI(仅保留balanceOf方法)
const ERC20_ABI = [
{
constant: true,
inputs: [{ name: '_owner', type: 'address' }],
name: 'balanceOf',
outputs: [{ name: 'balance', type: 'uint256' }],
type: 'function'
}
];
// 以太坊USDT合约地址
const USDT_CONTRACT = '0xdAC17F958D2ee523a2206206994597C13D831ec7';
async function getUsdtBalance() {
try {
// 初始化USDT合约实例
const usdtContract = new web3.eth.Contract(ERC20_ABI, USDT_CONTRACT);
// 查询余额(USDT精度为6,用mwei单位转换)
const balanceRaw = await usdtContract.methods.balanceOf(TP_ADDRESS).call();
const balanceUsdt = web3.utils.fromWei(balanceRaw, 'mwei');
console.log(`TP地址USDT余额:${balanceUsdt} USDT`);
} catch (err) {
console.error('获取USDT余额失败:', err.message);
}
}
getUsdtBalance();
获取TP地址的交易记录
直接从节点获取全量交易数据量极大,效率极低,因此推荐通过区块链浏览器API(如Etherscan)查询,需先申请免费API密钥。
const axios = require('axios');
// 替换为你的Etherscan API密钥(注册地址:https://etherscan.io/)
const ETHERSCAN_API_KEY = 'YourEtherscanApiKey';
async function getTxHistory() {
try {
// Etherscan API请求参数:地址、区块范围、排序方式
const url = `https://api.etherscan.io/api?module=account&action=txlist&address=${TP_ADDRESS}&startblock=0&endblock=99999999&sort=asc&apikey=${ETHERSCAN_API_KEY}`;
const response = await axios.get(url);
const txList = response.data.result;
console.log(`TP地址交易记录(共${txList.length}条):`, txList.slice(0, 5)); // 仅展示前5条
} catch (err) {
console.error('获取交易记录失败:', err.message);
}
}
getTxHistory();
注意事项与优化建议
- RPC节点限制:公开RPC节点(如Ankr)有请求频率限制,生产环境建议使用Infura、Alchemy等付费节点,稳定性更高;
- API密钥安全:不要在前端代码中硬编码区块链浏览器API密钥,建议通过后端代理或环境变量管理,防止密钥泄露;
- 代币精度适配:不同ERC20代币精度不同,转换单位需对应调整:如USDT用
mwei(1e6),UNI用ether(1e18); - 多链适配封装:若需支持多条公链,建议封装工具类,统一处理不同链的RPC节点、合约地址、浏览器API,避免重复代码;
- 浏览器端兼容:若在浏览器中使用,需注意RPC和API的CORS限制,推荐通过后端代理转发请求。
通过以上代码,你可以快速实现TP钱包核心链上数据的获取,还可进一步扩展功能:比如制作链上资产看板、交易监控工具、跨链资产汇总工具等,为Web3项目提供实用的数据支持。
相关阅读: