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

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

以太坊作为全球第二大区块链平台,凭借其智能合约功能和可编程性,已成为去中心化应用(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

    上一篇:

    下一篇: