Web3j调用以太坊主网络实战指南,Java开发者通往区块链世界的桥梁
随着区块链技术的蓬勃发展,越来越多的Java开发者希望在自己的应用中集成以太坊功能,Web3j作为一个轻量级的Java库,为Java开发者提供了与以太坊区块链交互的完整解决方案,本文将详细介绍如何使用Web3j连接并调用以太坊主网络(Mainnet),涵盖环境搭建、基础查询、交易发送以及智能合约交互等核心内容。
什么是Web3j
Web3j是一个开源的Java/Android集成库,专门用于与以太坊区块链进行交互,它封装了以太坊的JSON-RPC接口,让Java开发者无需深入了解底层协议细节,即可完成账户管理、转账、合约调用等操作。
环境准备
添加Maven依赖
在项目的pom.xml中添加以下依赖:
<dependency>
<groupId>org.web3j</groupId>
<artifactId>core</artifactId>
<version>4.10.3</version>
</dependency>
如果使用Gradle,则添加:
implementation 'org.web3j:core:4.10.3'
获取主网络访问入口
连接以太坊主网络通常有以下几种方式:
- 自建节点:运行Geth或Erigon等客户端,同步完整区块链数据(对硬件要求较高)
- 第三方RPC服务:如Infura、Alchemy、QuickNode等,提供免费的API接入点(推荐初学者使用)
以Infura为例,注册后即可获得主网络的RPC地址,格式如下:
https://mainnet.infura.io/v3/你的项目ID
连接以太坊主网络
建立连接
import org.web3j.protocol.Web3j;
import org.web3j.protocol.http.HttpService;
public class EthereumConnector {
public static Web3j connect() {
// 通过Infura连接主网络
String rpcUrl = "https://mainnet.infura.io/v3/你的项目ID";
Web3j web3j = Web3j.build(new HttpService(rpcUrl));
return web3j;
}
}
验证连接
import org.web3j.protocol.core.methods.response.Web3ClientVersion;
Web3j web3j = EthereumConnector.connect();
// 获取客户端版本,验证连接是否成功
Web3ClientVersion clientVersion = web3j.web3ClientVersion().send();
System.out.println("客户端版本: " + clientVersion.getWeb3ClientVersion());
如果成功输出类似Geth/v1.13.x的信息,说明已成功连接到以太坊主网络。
基础查询操作
查询最新区块高度
EthBlockNumber blockNumber = web3j.ethBlockNumber().send();
System.out.println("当前区块高度: " + blockNumber.getBlockNumber());
查询账户余额
import org.web3j.protocol.core.DefaultBlockParameterName;
import org.web3j.utils.Convert;
String address = "0x你的钱包地址";
EthGetBalance balanceResponse = web3j.ethGetBalance(
address, DefaultBlockParameterName.LATEST).send();
// 将Wei转换为Ether
BigInteger wei = balanceResponse.getBalance();
BigDecimal ether = Convert.fromWei(wei.toString(), Convert.Unit.ETHER);
System.out.println("账户余额: " + ether + " ETH");
查询区块详情
EthBlock.Block block = web3j.ethGetBlockByNumber(
DefaultBlockParameter.valueOf(BigInteger.valueOf(19000000L)), true)
.send()
.getBlock();
System.out.println("区块时间戳: " + block.getTimestamp());
System.out.println("交易数量: " + block.getTransactions().size());
发送交易(ETH转账)
在主网络上发送真实交易需要消耗Gas费,请谨慎操作。
import org.web3j.crypto.Credentials;
import org.web3j.tx.gas.DefaultGasProvider;
import org.web3j.tx.Transfer;
// 加载账户凭证(切勿硬编码私钥,生产环境应使用安全的密钥管理方案)
Credentials credentials = Credentials.create("你的私钥");
// 发送0.01 ETH
TransactionReceipt receipt = new Transfer(web3j, new DefaultGasProvider())
.sendFunds(
"0x目标地址",
BigDecimal.valueOf(0.01),
Convert.Unit.ETHER,
credentials
).send();
System.out.println("交易哈希: " + receipt.getTransactionHash());
System.out.println("Gas消耗: " + receipt.getGasUsed());
与智能合约交互
生成合约包装类
使用Web3j命令行工具,可以根据合约ABI和BIN文件生成Java类:
web3j generate solidity -a ./abi/MyToken.abi -b ./abi/MyToken.bin -o ./src/main/java -p com.example.contracts
调用合约方法
// 加载合约实例
String contractAddress = "0x合约地址";
MyToken contract = MyToken.load(
contractAddress, web3j, credentials, new DefaultGasProvider());
// 调用只读方法(不消耗Gas)
String name = contract.name().send();
System.out.println("代币名称: " + name);
// 调用写方法(需要消耗Gas)
TransactionReceipt receipt = contract.transfer("0x目标地址",
BigInteger.valueOf(1000000)).send();
监听新区块与事件
Web3j支持基于RxJava
The End
发布于:2026-09-17,除非注明,否则均为原创文章,转载请注明出处。
