想让业务实时感知USDT到账、让用户一键提币?本教程用一段段可跑代码带你打通 交易监控 和 转账执行 两大命脉,助你 30 分钟落地基于 Java + Tron 波场链 的资金通道。
关键词
Tron、波场链、交易监控、TRC20转账、Java Trident、ApiWrapper、TRX余额查询、资金管理
1. 项目热身:拿到 ApiWrapper 连接实例
要把链上信息拉到本地,ApiWrapper
是入口钥匙。参数里只需确定 主网 / 测试网 和 私钥。
private ApiWrapper getApiWrapper(String hexPrivateKey) {
// 判断是否正式链
if (tronServiceConfig.getTronDomainOnline()) {
// 主网需要官方申请的 apiKey,避免限流
return ApiWrapper.ofMainnet(hexPrivateKey, tronServiceConfig.getApiKey());
} else {
// Nile 测试网不需要 apiKey
return new ApiWrapper("grpc.nile.trongrid.io:50051",
"grpc.nile.trongrid.io:50061",
hexPrivateKey);
}
}
小贴士
如果启动报错 UNAVAILABLE: io exception
,大概率是端口被运营商墙,换 gRPC 端口 50052/50062 即可。
2. 查看 TRC20(USDT)余额
USDT 在波场是 TRC20 合约代币,拿到合约地址后两行代码就能查余额。
public BigDecimal getTrc20Balance(String address) {
ApiWrapper client = getApiWrapper(tronServiceConfig.getHexPrivateKey());
Contract contract = client.getContract(tronServiceConfig.getTrc20Address());
Trc20Contract token = new Trc20Contract(contract, address, client);
BigInteger rawBalance = token.balanceOf(address); // 单位为 sun
BigDecimal divisor = new BigDecimal(tronServiceConfig.getTrc20Decimals()); // 1_000_000
BigDecimal balance = new BigDecimal(rawBalance)
.divide(divisor, 2, RoundingMode.HALF_UP); // 转 USDT 小数
client.close();
return balance;
}
3. 查看原生币 TRX 余额
与 TRC20 不同,TRX 属于主网币,无需合约地址。
public BigDecimal getTRXBalance(String address) {
ApiWrapper wrapper = getApiWrapper(tronServiceConfig.getHexPrivateKey());
Long rawBalance = wrapper.getAccountBalance(address); // 单位为 sun
BigDecimal divisor = new BigDecimal("1000000"); // 1 TRX = 1,000,000 sun
return new BigDecimal(rawBalance).divide(divisor, 4, RoundingMode.HALF_UP);
}
4. 交易监控 2 种打法
4.1 轮询区块事件(轻量)
适合接收地址有限的小场景,每 N 秒拉一次最新区块,扫描交易列表:
public List<TransferEvent> pollTransfers(long startBlock) {
ApiWrapper client = getApiWrapper(null);
Block blk = client.getBlockByNum(startBlock);
List<Transaction> txList = blk.getTransactions();
List<TransferEvent> list = new ArrayList<>();
for (Transaction tx : txList) {
if (tx.getRawData().getContractList().stream()
.anyMatch(c -> "TransferContract".equals(c.getType().name())
|| "TransferAssetContract".equals(c.getType().name()))) {
list.add(parse(tx));
}
}
client.close();
return list;
}
提示:用本地 Redis 缓存 startBlock,关闭进程后可断点续扫。
4.2 Event Plugin 推送(高性能)
多地址或高频场景可直接对接官方事件插件,用 WebSocket 实时推送。
👉 零压接入图文档,带你 10 分钟部署 TronEvent 推送服务
5. TRC20 转账示例(USDT->用户)
三步完成:估算能量 → 拼装交易 → 广播上链。
public String transferTrc20(String toAddress, BigDecimal amount) {
ApiWrapper client = getApiWrapper(tronServiceConfig.getHexPrivateKey());
String contractAddress = tronServiceConfig.getTrc20Address();
Contract contract = client.getContract(contractAddress);
Trc20Contract token = new Trc20Contract(contract,
tronServiceConfig.getOwnerAddress(),
client);
// 精度换算
BigInteger realAmount = amount.multiply(new BigDecimal("1000000")).toBigInteger();
String txid = token.transfer(toAddress, realAmount)
.setFeeLimit(20_000_000L) // 20 TRX 能量上限
.send();
client.close();
return txid;
}
👉 手把手演示:如何零踩坑打包 TRX 手续费,把“转账失败”降到最低
6. 风控与异常处理
场景 | 建议动作 |
---|---|
能量不足导致 failed | fallback 到 租赁能量 或 提高 feeLimit |
双花重试 | 记录 txid,按 当前区块高度 判断是否已确认 |
私钥泄露 | 立刻把余额转往冷钱包,使用 watch-only 地址监控 |
7. 常见问题 FAQ
Q1:查询余额延迟一般多久?
A:正常节点 1 秒内回复;若用公共节点可在高并发时出现短暂丢包,建议自建自建TronFullNode。
Q2:trx 与 TRC20 手续费有何区别?
A:TRX 转账固定消耗 0.1–0.3 TRX;TRC20 需要调用合约,费用与交易复杂度正相关,通常 8–20 TRX。
Q3:如何确定 USDT 是否到账?
A:在事件日志里过滤 Transfer
事件,并校验 toAddress + amount + txStatus=SUCCESS
。
Q4:测试网老是报 “contract validate error” 怎么办?
A:确认 Trc20Address
与节点网络一致(主网合约无法在 Nile 测试网识别)。
Q5:Java 可以监听 pending 交易吗?
A:Tron 当前不暴露 mempool,需自行节点改造或采用事件插件推送已确认交易。
至此,你已掌握钱包、余额、监控、转账四大核心模块。下一篇我们将聚焦 离线签名 + 多方签名 场景,让大额资金在冷、热钱包间安全流动。祝你的链上业务早日 7×24 跑稳!