Web3j调用以太坊主网络实战指南,Java开发者通往区块链世界的桥梁

博主:neragonerago 2026-09-17 22:03:09 3

随着区块链技术的蓬勃发展,越来越多的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,除非注明,否则均为区块链社区- 欧亿APP下载原创文章,转载请注明出处。