核心关键词直达: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 与以太坊 的交互像调用本地接口那样轻松。它提供了:
- 极简的 Maven/Gradle 依赖
- 响应式流(Reactive Streams)支持
- 强类型 ABI 代码生成
- Android 兼容,甚至能在手机端部署 DApp
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
- macOS:
brew install ethereum - Ubuntu:
sudo apt install ethereum
4.2 启动节点
geth --goerli --rpc --rpcaddr 0.0.0.0 --rpcport 8545 --rpcapi eth,net,web3,personal4.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. 场景测试与常见坑
- Gas 收费飙升:在高并发测试时可切换到 Goerli 测试网,用
BigDecimal.ZERO发送空转,节省费用。 - 网络延迟:在国内生产环境,建议自建私有节点,相比 Infura 能降低 200~500ms 延迟。
- 私钥管理:切勿硬编码到源码,可用 JVM 系统属性 或 环境变量 扫描。
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 世界所用。
祝编码愉快,钱包安全!