Java使用Web3j进行基础和token转账

本文档介绍了如何在Java环境下使用web3j库进行以太坊的基础转账和ERC20代币转账操作。首先通过pom文件引入web3j核心依赖,然后通过钱包私钥创建Credentials实例,连接Infura节点。接着展示如何进行基础的ETH转账,以及调用智能合约方法进行ERC20代币转账,包括获取交易计数、构造交易、编码函数、签名及发送交易等步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里使用的是maven项目,第一步要引入web3j的包

引入pom

 <dependency>
        <groupId>org.web3j</groupId>
        <artifactId>core</artifactId>
        <version>3.4.0</version>
    </dependency>
 

基础转账

    public static void transfer() throws Exception {
        Web3j web3j = Web3j.build(new HttpService("infura节点链接"));
        BigInteger bigInteger = new BigInteger("钱包私钥", 16);
        ECKeyPair ecKeyPair = ECKeyPair.create(bigInteger);
        Credentials credentials = Credentials.create(ecKeyPair);
        TransactionReceipt transactionReceipt = Transfer.sendFunds(web3j, credentials, "目标地址", BigDecimal.valueOf(0.001), Convert.Unit.ETHER).send();
        System.out.println(transactionReceipt);
    }

Token转账

    public static void transferToken() throws Exception {
        Web3j web3j = Web3j.build(new HttpService("infura节点链接"));
        BigInteger bigInteger = new BigInteger("私钥", 16);
        ECKeyPair ecKeyPair = ECKeyPair.create(bigInteger);
        Credentials credentials = Credentials.create(ecKeyPair);
        String fromAddress = credentials.getAddress();
        EthGetTransactionCount ethGetTransactionCount = web3j.ethGetTransactionCount(
                fromAddress, DefaultBlockParameterName.LATEST).sendAsync().get();
        BigInteger nonce = ethGetTransactionCount.getTransactionCount();

        Address address = new Address("目标地址");
        Uint256 value = new Uint256(new BigInteger("数量 单位wei"));
        List<Type> parametersList = new ArrayList<>();
        parametersList.add(address);
        parametersList.add(value);
        List<TypeReference<?>> outList = new ArrayList<>();
        Function function = new Function("transfer", parametersList, outList);
        String encodedFunction = FunctionEncoder.encode(function);
        System.out.println( DefaultGasProvider.GAS_PRICE);
        System.out.println(DefaultGasProvider.GAS_LIMIT);
        RawTransaction rawTransaction = RawTransaction.createTransaction(nonce,  DefaultGasProvider.GAS_PRICE,
                new BigInteger("210000"), "合约地址", encodedFunction);
        byte[] signedMessage = TransactionEncoder.signMessage(rawTransaction, credentials);
        String hexValue = Numeric.toHexString(signedMessage);
        EthSendTransaction ethSendTransaction = web3j.ethSendRawTransaction(hexValue).sendAsync().get();
        Object transactionHash = ethSendTransaction.getTransactionHash();
        System.out.println(transactionHash.toString());
    }

参考文档

web3.js 中文文档
web3j 英文文档

笔者整理了常见的一些智能合约并进行分类。

### Java 实现 ERC20 代币转账 由于Java本身不是用于编写智能合约的语言,通常Solidity被用来创建部署基于Ethereum平台上的智能合约。然而,在Java应用程序中可以调用已有的ERC20智能合约的方法来执行诸如转账这样的操作。这可以通过Web3j库完成,它是一个轻量级、高度模块化的Java库,允许开发人员与以太坊区块链交互。 下面展示了一个简单的例子,说明如何利用Web3j在Java程序里发起一次ERC20代币的转账: ```java import org.web3j.protocol.Web3j; import org.web3j.protocol.core.methods.response.TransactionReceipt; import org.web3j.tx.gas.ContractGasProvider; import org.web3j.crypto.Credentials; import org.web3j.protocol.http.HttpService; public class Erc20Transfer { private static final String contractAddress = "CONTRACT_ADDRESS"; // 替换成实际的合同地址 private static final Credentials credentials = WalletUtils.loadCredentials("password", "/path/to/walletfile"); public static void main(String[] args) throws Exception { Web3j web3j = Web3j.build(new HttpService("https://mainnet.infura.io/v3/YOUR_INFURA_PROJECT_ID")); ContractGasProvider gasProvider = new StaticGasProvider(BigInteger.valueOf(4712388), BigInteger.valueOf(9_000_000)); Token token = Token.load(contractAddress, web3j, credentials, gasProvider); TransactionReceipt receipt = token.transfer("RECIPIENT_ADDRESS", BigDecimal.TEN).send(); System.out.println(receipt.getTransactionHash()); } } ``` 此代码片段展示了怎样加载一个现有的ERC20合约实例并发送一笔交易给指定接收者账户。注意这里的`Token`类代表的是通过web3j自动生成对应特定ERC20标准接口的一个代理对象;为了获取这个类,可能需要先编译相应的solidity源文件或将预定义abi/json映射到此类上[^1]。 对于批量转账功能,则可以根据需求调整上述方法中的逻辑部分,比如循环遍历多个收件人的列表并向他们分别转款一定数量的令牌。不过需要注意的是,每次调用`transfer()`都会产生单独的一笔链上交易费用(gas),因此如果要处理大量收款方的话,考虑优化方案或采用更高效的批处理方式可能会更好一些。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zgsdzczh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值