Java对接以太坊全攻略:web3j、Infura、自托管节点与API一站式指南

·

核心关键词直达:Java、以太坊、web3j、智能合约、Infura、Etherscan API、私有节点、ETH、区块链开发

对于开发者而言,“如何在Java程序中无缝调用以太坊网络”是一道必答题。传统思维觉得 Java 不擅长区块链,然而借助 web3j 这把瑞士军刀,Java 也能像 Node.js 一样灵活地发送 ETH、部署智能合约或监听链上事件。本文将围绕 web3j 集成、Infura 托管、Geth 私有节点、Etherscan API 四个主流方案,配合完整代码与 FAQ,帮你在咖啡厅 Wi-Fi 下就能跑出一套高度可用的 ETH 对接方案


1. 为什么选择 web3j:Java 世界的头等舱座位

无论你是 Spring Boot 老兵还是 Android 开发者,web3j 都能让 Java 与以太坊 的交互像调用本地接口那样轻松。它提供了:

👉 如果你急需一套可直接落地的示例项目,点击了解完整仓库。


2. web3j 入门:5 分钟让项目跑起来

2.1 引入依赖

Maven 的小伙伴在 pom.xml 里加上:

<dependency>
    <groupId>org.web3j</groupId>
    <artifactId>core</artifactId>
    <version>4.11.0</version>
</dependency>

Gradle 党则在 build.gradle 中:

implementation 'org.web3j:core:4.11.0'

2.2 连接节点:Infura 一键搞定

Web3j web3 = Web3j.build(
    new HttpService("https://mainnet.infura.io/v3/YOUR_PROJECT_ID")
);

EthBlockNumber block = web3.ethBlockNumber().send();
System.out.println("当前区块高度: " + block.getBlockNumber());

只需替换 YOUR_PROJECT_ID,你就能立即调用主网区块号。


3. 高级用法:发送以太币并监控收据

3.1 加载钱包

用助记词或私钥加载 Credentials

String privKey = "<你的私钥>";
Credentials credentials = Credentials.create(privKey);

3.2 构建交易并签名

TransactionReceiptProcessor processor = new PollingTransactionReceiptProcessor(
    web3, 
    TransactionManager.DEFAULT_POLLING_FREQUENCY, 
    TransactionManager.DEFAULT_POLLING_ATTEMPTS
);

RawTransactionManager txManager = new RawTransactionManager(web3, credentials);

Transfer transfer = new Transfer(web3, txManager);
TransactionReceipt receipt = transfer.sendFunds(
    "0x目标地址", 
    BigDecimal.valueOf(0.01), 
    Convert.Unit.ETHER, 
    Transfer.GAS_LIMIT, 
    Transfer.GAS_PRICE
).send();

System.out.println("交易哈希: " + receipt.getTransactionHash());

👉 想实时跟踪交易进度?这里有一份可视化脚本帮你0 成本完成。


4. 自建节点:Geth + web3j 全控制方案

4.1 安装 Geth

4.2 启动节点

geth --goerli --rpc --rpcaddr 0.0.0.0 --rpcport 8545 --rpcapi eth,net,web3,personal

4.3 Java 连接本地节点

Infura URL 改成本地:

Web3j web3 = Web3j.build(new HttpService("http://localhost:8545"));

你可以在 单元测试中 挂载本地机,满足 CI/CD 需求,同时省去外部 RPC 费用。


5. 纯粹查询:Etherscan API 轻量方案

当你只想 读数据(如钱包历史、代币余额),而不想装库也不想跑节点时,Etherscan REST API 最省事。

5.1 免费申请 API-Key

etherscan.io/apis 注册账号,拿到 YOUR_API_KEY

5.2 纯 Java HTTP 查询示例

String url = "https://api.etherscan.io/api"
           + "?module=account"
           + "&action=txlist"
           + "&address=0x..."
           + "&startblock=0"
           + "&endblock=99999999"
           + "&sort=asc"
           + "&apikey=YOUR_API_KEY";

HttpClient client = HttpClient.newHttpClient();
HttpRequest req = HttpRequest.newBuilder(URI.create(url)).GET().build();
String json = client.send(req, HttpResponse.BodyHandlers.ofString()).body();

System.out.println("返回Json: " + json);

6. 场景测试与常见坑


FAQ:开发者最常见 6 问 6 答

Q1:Java 能与 Solidity 智能合约交互吗?
A:可以。先用 web3j generate 命令或插件根据 .abi.bin 文件生成 Java Wrapper,随后像调用普通 Java 类那样操作合约函数即可。

Q2:我该选 Infura 还是自建节点?
A:原型开发、省钱快:选 Infura;高 TPS、企业治理:选自建节点 Geth/OpenEthereum

Q3:如何监听新块或事件?
A:web3j 支持 Reactive Streams,代码如下:

Subscription sub = web3.blockObservable(false).subscribe(block -> {
    System.out.println("新区块: " + block.getBlock().getNumber());
});

Q4:在 Android 设备上也能跑吗?
A:web3j 核心库做了 ProGuard 适配,配合 OkHttp 可直接在 Android 13 调用 ETH。

Q5:如何批量查询 1000 个地址的 ETH 余额?
A:可用 web3j 的 BatchRequest,一次打包多个 eth_getBalance

BatchRequest batch = web3.newBatch();
// 循环添加请求...
BatchResponse resp = batch.send();

Q6:web3j 会自动重试失败的广播吗?
A:不会。生产环境建议用 RetryRawTransactionManager,失败自动回退,避免丢交易。


总结

web3j 极简 5 分钟上手自建 Geth 高可用节点,本文覆盖了 Java 接入以太坊的 4 条主路线。无论是 Infura 免运维 的敏捷性,还是 私有节点 带来的性能与隐私优势,你都可以按业务阶段自由切换。把本文当速查表,随时发需求随时落码,真正实现 让以太坊为 Java 世界所用

祝编码愉快,钱包安全!