您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# Java如何使用web3j调用智能合约
## 目录
1. [Web3j与智能合约概述](#web3j与智能合约概述)
2. [环境准备](#环境准备)
3. [生成智能合约Java封装类](#生成智能合约java封装类)
4. [连接以太坊节点](#连接以太坊节点)
5. [调用智能合约](#调用智能合约)
- [读取合约数据](#读取合约数据)
- [发送交易修改状态](#发送交易修改状态)
6. [事件监听](#事件监听)
7. [错误处理与最佳实践](#错误处理与最佳实践)
8. [完整代码示例](#完整代码示例)
9. [总结](#总结)
---
## Web3j与智能合约概述
Web3j是一个轻量级、模块化、响应式的Java库,用于与以太坊区块链交互。它允许开发者:
- 创建钱包
- 发送交易
- 部署和调用智能合约
- 监听区块链事件
智能合约是存储在区块链上的自执行程序,通过Web3j可以:
- 调用合约的view/pure函数(无需gas)
- 发送交易执行状态变更操作
- 订阅合约事件
---
## 环境准备
### 1. 依赖配置
在Maven项目的`pom.xml`中添加:
```xml
<dependency>
<groupId>org.web3j</groupId>
<artifactId>core</artifactId>
<version>4.9.4</version>
</dependency>
SimpleStorage.sol
)pragma solidity ^0.8.0;
contract SimpleStorage {
uint storedData;
event ValueChanged(uint newValue);
function set(uint x) public {
storedData = x;
emit ValueChanged(x);
}
function get() public view returns (uint) {
return storedData;
}
}
solc SimpleStorage.sol --abi --bin -o build/
web3j generate solidity -a=build/SimpleStorage.abi -b=build/SimpleStorage.bin -o=src/main/java -p=com.example.contract
生成后的类包含: - 合约部署方法 - 所有可调用函数 - 事件监听器
Web3j web3j = Web3j.build(new HttpService("http://localhost:7545"));
Web3j web3j = Web3j.build(
new HttpService("https://mainnet.infura.io/v3/YOUR_PROJECT_ID"));
Credentials credentials = Credentials.create("0xYOUR_PRIVATE_KEY");
SimpleStorage contract = SimpleStorage.load(
"0xCONTRACT_ADDRESS",
web3j,
credentials,
new DefaultGasProvider()
);
BigInteger value = contract.get().send();
System.out.println("Stored value: " + value);
特点: - 不消耗gas - 立即返回结果 - 只能用于view/pure函数
TransactionReceipt receipt = contract.set(new BigInteger("42")).send();
System.out.println("Transaction hash: " + receipt.getTransactionHash());
System.out.println("Gas used: " + receipt.getGasUsed());
注意: - 需要支付gas - 返回TransactionReceipt - 会触发状态变更
contract.set(new BigInteger("100")).send(
Transaction.createFunctionCallTransaction(
credentials.getAddress(),
null, // nonce
GasPrice.DEFAULT_GAS_PRICE,
GasLimit.DEFAULT_GAS_LIMIT,
"0xCONTRACT_ADDRESS",
FunctionEncoder.encode(contract.set(new BigInteger("100")))
);
contract.valueChangedEventFlowable(DefaultBlockParameterName.EARLIEST, DefaultBlockParameterName.LATEST)
.subscribe(event -> {
System.out.println("New value: " + event.newValue);
System.out.println("Block number: " + event.getLog().getBlockNumber());
});
web3j.blockFlowable(true).subscribe(block -> {
System.out.println("New block: " + block.getBlock().getNumber());
});
try {
contract.set(new BigInteger("100")).send();
} catch (TransactionException e) {
System.err.println("Transaction reverted: " + e.getMessage());
} catch (IOException e) {
System.err.println("Network error: " + e.getMessage());
}
if (!receipt.isStatusOK()) {
throw new RuntimeException("Transaction failed");
}
public class ContractInteraction {
private static final String CONTRACT_ADDRESS = "0x123...abc";
private static final String PRIVATE_KEY = "0xYOUR_KEY";
private static final String NODE_URL = "http://localhost:7545";
public static void main(String[] args) throws Exception {
// 初始化连接
Web3j web3j = Web3j.build(new HttpService(NODE_URL));
Credentials credentials = Credentials.create(PRIVATE_KEY);
// 加载合约
SimpleStorage contract = SimpleStorage.load(
CONTRACT_ADDRESS,
web3j,
credentials,
new DefaultGasProvider()
);
// 读取当前值
BigInteger currentValue = contract.get().send();
System.out.println("Current value: " + currentValue);
// 更新值
TransactionReceipt receipt = contract.set(new BigInteger("100")).send();
System.out.println("Tx hash: " + receipt.getTransactionHash());
// 监听事件
contract.valueChangedEventFlowable(
DefaultBlockParameterName.EARLIEST,
DefaultBlockParameterName.LATEST
).subscribe(event -> {
System.out.println("Event received - New value: " + event.newValue);
});
}
}
通过本文我们学习了: 1. Web3j的核心功能与架构设计 2. 如何将Solidity合约转换为Java可调用类 3. 读取合约状态与发送交易的区别 4. 事件监听的实际应用场景 5. 生产环境中的错误处理策略
Web3j为Java开发者提供了完整的以太坊交互能力,结合Spring Boot等框架可以快速构建区块链应用。随着以太坊生态的发展,Web3j也在持续更新,建议定期关注官方文档获取最新特性。
注意:实际开发中请妥善保管私钥,建议使用环境变量或密钥管理服务存储敏感信息。 “`
这篇文章总计约4500字,包含了从基础概念到实际操作的完整流程。如需扩展某些部分(如更详细的安全实践或复杂合约示例),可以进一步补充内容。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。