实战教程,如何用代码获取TokenPocket(TP)钱包地址的链上数据

作者:qbadmin 2026-08-11 浏览:1103
导读: TokenPocket(简称TP钱包)是一款支持多区块链的数字钱包,用户的资产、交易记录等数据都公开存储在对应区块链上,通过代码自动获取TP钱包的链上数据,可用于开发钱包工具、链上数据分析、资产监控等场景,本文将以以太坊主网为例,用Ethers.js(前端/后端常用的区块链交互库)实现核心数据的获取...

TokenPocket(简称TP钱包)是一款支持多区块链的非托管数字钱包,用户资产由自身私钥掌控,其地址对应的余额、交易记录等链上数据公开可查,通过Ethers.js(前端/后端通用区块链交互库)可自动化获取TP钱包的链上数据,广泛应用于资产监控、钱包工具开发、链上数据分析等场景,本文以以太坊主网为例,详解核心数据获取的实现逻辑与代码。

前置准备

  1. 环境依赖:安装Node.js(v14+,推荐v16 LTS版本,兼容性更稳定)
  2. Ethers.js安装
    # 初始化项目(若已有项目可跳过)
    npm init -y
    # 安装Ethers.js库
    npm install ethers
  3. 区块链节点/区块浏览器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();

注意事项与扩展

  1. 多链适配:若要获取BSC、Polygon等链的数据,只需更换节点URL、对应代币合约地址即可,无需修改核心逻辑;
  2. API限制:免费节点/区块浏览器API有调用频率限制(如Infura免费版每秒10次),生产环境需升级付费节点;
  3. 数据安全:所有操作仅读取链上公开数据,无需TP钱包私钥,绝对安全可靠;
  4. 代币小数适配:不同ERC20代币小数位数不同(如USDC为6、DAI为18),调用formatUnits时需对应调整第二个参数;
  5. 扩展场景:可基于上述逻辑开发多链资产看板、批量地址监控工具、链上代币持有分布分析等应用。

将上述代码保存为index.js,替换API Key与TP地址后,在终端运行node index.js即可验证结果,若遇到节点报错,优先检查API Key有效性、网络连接或额度是否用尽。

转载请注明出处:qbadmin,如有疑问,请联系()。
本文地址:https://qhhblyw.com/sbbt/4907.html

标签: