Java开发以太坊教程,从入门到实践指南

时间: 2026-02-16 5:33 阅读数: 1人阅读

以太坊作为全球第二大区块链平台,凭借其智能合约功能和可编程性,已成为去中心化应用(DApp)开发的核心基础设施,而Java作为企业级应用开发的主流语言,凭借其稳定性、丰富的生态和庞大的开发者群体,也逐渐被应用于以太坊生态的构建,本文将带你从零开始,系统学习如何使用Java进行以太坊开发,涵盖环境搭建、节点交互、智能合约操作及DApp开发等核心内容。

开发环境准备:搭建Java以太坊开发基础

安装Java开发环境

以太坊Java开发基于JDK(Java Development Kit),建议使用JDK 8或更高版本,前往Oracle官网或OpenJDK官网下载对应操作系统的JDK,安装后配置环境变量JAVA_HOMEPATH,确保可通过java -version命令验证安装成功。

集成开发工具(IDE)

推荐使用IntelliJ IDEA(社区版免费)或Eclipse作为开发IDE,两者均支持Maven/Gradle项目管理,方便后续依赖管理。

以太坊节点接入

Java应用需要与以太坊节点交互,有两种主流方式:

  • Infura等第三方服务:无需本地部署节点,通过HTTPS API接入(适合开发测试),注册Infura账号创建项目,获取HTTPSWSS节点地址。
  • 本地节点:使用Geth(Go客户端)或Nethermind(.NET客户端)搭建本地以太坊节点,通过geth --testnet --http启动测试网节点,默认监听8545端口。

添加以太坊Java依赖

在Maven项目的pom.xml中添加以下核心依赖:

<!-- Web3J:以太坊Java交互库 -->
<dependency>
    <groupId>org.web3j</groupId>
    <artifactId>core</artifactId>
    <version>4.9.8</version>
</dependency>
<!-- 以太坊单位转换工具 -->
<dependency>
    <groupId>org.web3j</groupId>
    <artifactId>units</artifactId>
    <version>4.9.8</version>
</dependency>
<!-- 日志工具 -->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.36</version>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.11</version>
</dependency>

连接以太坊节点:Java实现网络交互

Web3J是以太坊生态中最成熟的Java交互库,支持与以太坊节点进行JSON-RPC通信,以下是基础连接示例:

创建Web3J实例

import org.web3j.protocol.Web3j;
import org.web3j.protocol.http.HttpService;
public class EthereumConnection {
    public static void main(String[] args) {
        // 使用Infura节点地址(替换为你的Infura URL)
        String infuraUrl = "https://mainnet.infura.io/v3/YOUR_INFURA_PROJECT_ID";
        Web3j web3j = Web3j.build(new HttpService(infuraUrl));
        // 测试连接
        try {
            String clientVersion = web3j.web3ClientVersion().send().getWeb3ClientVersion();
            System.out.println("连接成功,客户端版本: " 
随机配图
+ clientVersion); } catch (Exception e) { System.err.println("连接失败: " + e.getMessage()); } } }

获取区块链信息

// 获取最新区块号
BigInteger latestBlockNumber = web3j.ethBlockNumber().send().getBlockNumber();
System.out.println("最新区块号: " + latestBlockNumber);
// 获取节点 syncing 状态
boolean isSyncing = web3j.ethSyncing().send().isSyncing();
System.out.println("节点是否同步中: " + isSyncing);

账户管理与交易操作:Java控制以太坊资产

创建以太坊账户

Web3J提供Credentials类管理账户,基于私钥生成:

import org.web3j.crypto.Credentials;
import org.web3j.crypto.ECKeyPair;
import org.web3j.crypto.Keys;
public class AccountManager {
    public static void main(String[] args) throws Exception {
        // 随机生成新账户
        ECKeyPair keyPair = Keys.createEcKeyPair();
        Credentials credentials = Credentials.create(keyPair);
        // 获取地址和私钥
        String address = credentials.getAddress();
        String privateKey = keyPair.getPrivateKey().toString(16);
        System.out.println("新账户地址: " + address);
        System.out.println("私钥: " + privateKey);
    }
}

查询账户余额

import org.web3j.protocol.core.methods.response.EthGetBalance;
import org.web3j.utils.Convert;
public class BalanceQuery {
    public static void main(String[] args) throws Exception {
        Web3j web3j = Web3j.build(new HttpService("https://mainnet.infura.io/v3/YOUR_INFURA_PROJECT_ID"));
        String address = "0x742d35Cc6634C0532925a3b844Bc454e4438f44e"; // 替换为目标地址
        // 查询余额(单位:Wei)
        EthGetBalance balance = web3j.ethGetBalance(address, DefaultBlockParameterName.LATEST).send();
        BigInteger balanceWei = balance.getBalance();
        // 转换为ETH
        String balanceEth = Convert.fromWei(balanceWei.toString(), Convert.Unit.ETH).toPlainString();
        System.out.println("账户 " + address + " 余额: " + balanceEth + " ETH");
    }
}

发送ETH交易

发送交易需要提供:接收方地址、转账金额(Wei)、私钥、Gas参数等,以下为测试网(如Goerli)转账示例:

import org.web3j.crypto.RawTransaction;
import org.web3j.crypto.TransactionEncoder;
import org.web3j.protocol.core.methods.response.EthSendTransaction;
import org.web3j.utils.Numeric;
import java.math.BigInteger;
public class EtherTransfer {
    public static void main(String[] args) throws Exception {
        Web3j web3j = Web3j.build(new HttpService("https://goerli.infura.io/v3/YOUR_INFURA_PROJECT_ID"));
        String privateKey = "YOUR_PRIVATE_KEY"; // 替换为发送方私钥
        Credentials credentials = Credentials.create(privateKey);
        // 交易参数
        String toAddress = "0x1234567890123456789012345678901234567890";
        BigInteger value = Convert.toWei("0.01", Convert.Unit.ETHER).toBigInteger(); // 0.01 ETH
        BigInteger gasLimit = BigInteger.valueOf(21000); // 转账基础Gas
        BigInteger gasPrice = web3j.ethGasPrice().send().getGasPrice(); // 当前Gas价格
        // 创建原始交易
        RawTransaction rawTransaction = RawTransaction.createEtherTransaction(
            credentials.getAddress(), nonce, gasPrice, gasLimit, toAddress, value
        );
        // 签名交易
        byte[] signedMessage = TransactionEncoder.signMessage(rawTransaction, credentials);
        String hexValue = Numeric.toHexString(signedMessage);
        // 发送交易
        EthSendTransaction ethSendTransaction = web3j.ethSendRawTransaction(hexValue).send();
        String transactionHash = ethSendTransaction.getTransactionHash();
        System.out.println("交易发送成功,哈希: " + transactionHash);
    }
}

智能合约交互:Java调用合约功能

智能合约是以太坊的核心,Java可通过Web3J部署合约、调用读/写方法、监听事件等。

编译智能合约

以简单的SimpleStorage合约为例(Solidity代码):

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract SimpleStorage {
    uint256 private storedData;
    function set(uint256 x) public {
        storedData = x;
    }
    function get() public view returns (uint256) {
        return storedData;
    }
}

使用solc(Solidity编译器)编译合约,生成ABI(应用二进制接口)和字节码(Bytecode),或通过在线编译器(如Remix IDE)导出ABI和Bytecode文件。

使用Web3J加载合约

将ABI和Bytecode保存到项目资源目录(如src/main/resources/),然后通过Contract类加载:

import org.web3j.abi.TypeReference;
import org.web3j.abi.datatypes.Function;
import org.web3j.abi.datatypes.Type;
import org.web3j.abi.datatypes.Utf8String;
import org.web3j.protocol.core.methods.response.TransactionReceipt;
import