最近使用web3j调用合约(传byte32位的参数)

622 阅读1分钟

web3j调用合约

接触合约很久了,之前没怎么调用,这次碰到自己去调用而且还得传byte32位的参数开始犯难了!

看了很多csdn的调用,怎么说,觉得有点草率,反正就是不符合我要的结果吧。

1. 创建web3j对象和凭证对象
//创建web3j对象
Web3j web3j = Web3j.build(new HttpService("https://mainnet.infura.io/v3/your-project-id"));
//创建凭证对象,用于调用智能合约的方法
Credentials credentials = Credentials.create("Your-Private-Key");

2. 加载智能合约代理

//通过智能合约地址和web3j对象创建智能合约代理对象
String contractAddress = "0x123456789abcdef";
Contract contract = Contract.load(contractAddress, web3j, credentials, GAS_PRICE, GAS_LIMIT);

3.调用合约

contract.mint(param).send();

web3j传参

一般web3j使用abi调用合约方法,生成java可调用的abi就行了

举个例子:

image.png

这个是erc721生成出来的方法有获取余额和授权方法。

调用也比较简单:

image.png

接下来这个是传byte32参数:

image.png 这是OpenZeppelin 3.0新增的AccessControl合约,用于一站式访问控制。

使用了多种办法去处理这个参数都没有得到有效的返回。
查了一下,合约内是使用16进制的数据进行比较,也就是说需要将数据处理成16进制的数据再进行转换为byte32位数据。
直接贴出处理转化为byte32位数据吧:

String paramValue = "0x11111"; byte[] byteArr = Numeric.hexStringToByteArray(paramValue);