Java获取以太坊代币交易记录的完整指南

OKX欧易app

OKX欧易app

欧易交易所app是全球排名第一的虚拟货币交易所,注册领取6万元盲盒礼包!

APP下载   官网注册

Java获取以太坊代币交易记录的完整指南

Java获取以太坊代币交易记录的完整指南

以太坊作为全球最大的智能合约平台,其上的代币(如ERC-20标准代币)交易记录查询是许多区块链应用开发的核心需求,本文将详细介绍如何使用Java语言获取以太坊代币交易记录,涵盖环境准备、核心工具选择、代码实现及常见问题解决,帮助开发者快速上手这一功能。

环境准备与依赖配置

在开始开发前,需确保Java开发环境已配置完成(推荐JDK 8及以上版本),并添加必要的依赖库,获取以太坊代币交易记录的核心工具是Web3j(一个轻量级的Java以太坊库),它提供了与以太坊节点交互的完整API。

添加Web3j依赖

若使用Maven项目,在pom.xml中添加以下依赖:

<dependency>
    <groupId>org.web3j</groupId>
    <artifactId>core</artifactId>
    <version>4.9.8</version> <!-- 建议使用最新稳定版本 -->
</dependency>
<dependency>
    <groupId>org.web3j</groupId>
    <artifactId>parity</artifactId>
    <version>4.9.8</version>
</dependency>

以太坊节点连接方式

获取交易记录需要连接到以太坊节点,常见方式有:

  • Infura等第三方服务:无需搭建本地节点,通过HTTPS RPC连接(推荐新手使用)。
  • 本地节点:运行Geth或Parity客户端,通过IPC或HTTP连接。
  • Alchemy等节点服务商:类似Infura,提供稳定可靠的RPC接口。

以Infura为例,需注册获取项目ID,生成RPC URL(如https://mainnet.infura.io/v3/YOUR_PROJECT_ID)。

核心原理:代币交易记录的获取逻辑

以太坊上的代币(如ERC-20)交易记录与ETH交易记录不同,ETH交易直接记录在以太坊主链上,而ERC-20代币交易是通过智能合约调用来实现的,获取代币交易记录需通过以下步骤:

  1. 获取代币合约地址:每个ERC-20代币都有一个唯一的合约地址(如USDT的合约地址在以太坊主网为0xdAC17F958D2ee523a2206206994597C13D831ec7)。
  2. 调用代币合约的Transfer事件:ERC-20代币的转账会触发Transfer事件,包含发送方、接收方和转账金额等信息。
  3. 解析事件日志:通过Web3j解析节点返回的Transfer事件日志,提取交易记录。

Java实现代码

初始化Web3j客户端

首先创建与以太坊节点的连接:

import org.web3j.protocol.Web3j;
import org.web3j.protocol.http.HttpService;
public class EthereumTokenService {
    private Web3j web3j;
    public EthereumTokenService(String rpcUrl) {
        this.web3j = Web3j.build(new HttpService(rpcUrl));
    }
}

获取代币合约的Transfer事件

Web3j提供了eth_getLogs API的封装,用于查询指定条件的日志(包括事件),以下是获取某个地址的代币交易记录的完整代码:

import org.web3j.protocol.core.methods.request.EthFilter;
import org.web3j.protocol.core.methods.response.EthLog;
import org.web3j.protocol.core.DefaultBlockParameter;
import org.web3j.protocol.core.methods.response.Log;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;
public List<TokenTransaction> getTokenTransactions(String tokenContractAddress, String userAddress) {
    List<TokenTransaction> transactions = new ArrayList<>();
    // 创建过滤器:监听代币合约的Transfer事件,且涉及指定地址(发送方或接收方)
    EthFilter filter = new EthFilter(
            DefaultBlockParameter.EARLIEST, // 从最早区块开始(可根据需求调整起始区块)
            DefaultBlockParameter.LATEST,   // 最新区块
            tokenContractAddress
    ).addSingleTopic("0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef") // Transfer事件的topic
     .addOptionalAddress(userAddress); // 筛选涉及指定地址的交易
    try {
        // 异步获取日志(也可使用同步方式syncFilterLogs)
        web3j.ethLogFlowable(filter).subscribe(log -> {
            Log result = log.get();
            TokenTransaction tx = parseTransferEvent(result, userAddress);
            if (tx != null) {
                transactions.add(tx);
            }
        });
    } catch (Exception e) {
        e.printStackTrace();
    }
    return transactions;
}
// 解析Transfer事件日志
private TokenTransaction parseTransferEvent(Log log, String userAddress) {
    // Transfer事件的参数索引:from(0), to(1), value(2)
    String from = "0x" + log.getData().substring(26, 66).trim(); // 发送方地址
    String to = "0x" + log.getData().substring(66, 106).trim();   // 接收方地址
    BigInteger value = new BigInteger(log.getData().substring(106, 146).trim(), 16); // 转账金额(单位:代币最小精度)
    // 判断当前地址是发送方还是接收方
    if (!from.equalsIgnoreCase(userAddress) && !to.equalsIgnoreCase(userAddress)) {
        return null; // 不涉及指定地址,过滤掉
    }
    TokenTransaction tx = new TokenTransaction();
    tx.setTxHash(log.getTransactionHash());
    tx.setBlockNumber(log.getBlockNumber().toString());
    tx.setFrom(from);
    tx.setTo(to);
    tx.setValue(value.toString());
    tx.setTimestamp(log.getLogTimestamp() != null ? log.getLogTimestamp().toString() : null);
    return tx;
}
// 代币交易记录实体类
public static class TokenTransaction {
    private String txHash;    // 交易哈希
    private String blockNumber; // 区块号
    private String from;      // 发送方
    private String to;        // 接收方
    private String value;     // 转账金额
    private String timestamp; // 时间戳
    // Getter和Setter方法
    public String getTxHash() { return txHash; }
    public void setTxHash(String txHash) { this.txHash = txHash; }
    public String getBlockNumber() { return blockNumber; }
    public void setBlockNumber(String blockNumber) { this.blockNumber = blockNumber; }
    public String getFrom() { return from; }
    public void setFrom(String from) { this.from = from; }
    public String getTo() { return to; }
    public void setTo(String to) { this.to = to; }
    public String getValue() { return value; }
    public void setValue(String value) { this.value = value; }
    public String getTimestamp() { return timestamp; }
    public void setTimestamp(String timestamp) { this.timestamp = timestamp; }
    @Override
    public String toString() {
        return "Transaction{" +
                "hash='" + txHash + '\'' +
                ", from='" + from + '\'' +
                ", to='" + to + '\'' +
                ", value='" + value + '\'' +
                ", block=" + blockNumber +
                '}';
    }
}

调用示例

public class Main {
    public static void main(String[] args) {
        // 替换为你的Infura RPC URL
        String rpcUrl = "https://mainnet.infura.io/v3/YOUR_PROJECT_ID";
        // 替换为要查询的代币合约地址(如USDT)
        String tokenContractAddress = "0xdAC17F958D2ee523a2206206994597C13D831ec7";
        // 替换为要查询的用户地址
        String userAddress = "0x742d35Cc6634C0532925a3b844Bc9e7595f8d566";
        EthereumTokenService service = new EthereumTokenService(rpcUrl);
        List<TokenTransaction> transactions = service.getTokenTransactions(tokenContractAddress, userAddress);
        // 打印交易记录
        for (TokenTransaction tx : transactions) {
            System.out.println(tx);
        }
    }
}

关键点解析

Transfer事件的Topic

ERC-20代币的Transfer事件签名是Transfer(address,address,uint256),其Keccak-256哈希值为0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef,这是过滤日志的关键参数。

日志数据解析

Transfer事件的日志数据(data字段)包含三个参数:from、`to

本文来自用户投稿,不代表币大大立场,如若转载,请注明出处:https://czxurui.com/zx/322092.html

上一篇 2026年09月24日
下一篇 2026年09月24日

相关推荐

发表回复

8206

评论列表(0条)

    暂无评论

binance币安交易所
已有2000万用户加入币安交易所

立即下载