solidity的struct对象,web3j java解析输出参数
// SPDX-License-Identifier: MIT
pragma solidity 0.8.28;
contract StructDemo {
struct Student {
uint256 id;
string name;
}
// 初始化一个结构体
Student public student;
function initStudent5(Student memory _stu) public {
student = _stu;
}
}
<dependency>
<groupId>org.web3j</groupId>
<artifactId>core</artifactId>
<version>4.12.0</version>
</dependency>
package com.kevin;
import org.junit.Before;
import org.junit.Test;
import org.web3j.abi.FunctionEncoder;
import org.web3j.abi.FunctionReturnDecoder;
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.abi.datatypes.generated.Uint256;
import org.web3j.protocol.Web3j;
import org.web3j.protocol.core.DefaultBlockParameterName;
import org.web3j.protocol.core.methods.request.Transaction;
import org.web3j.protocol.core.methods.response.EthCall;
import org.web3j.protocol.http.HttpService;
import java.io.IOException;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
public class StructDemoTest2 {
private Web3j web3jClint;
private Long chainId = 5777L;
@Before
public void init(){
web3jClint = Web3j.build(new HttpService("http://127.0.0.1:8545", true));
}
@Test
public void getStudent() throws IOException, ExecutionException, InterruptedException {
List<TypeReference<?>> outputParameters = new ArrayList<>();
outputParameters.add(new TypeReference<Uint256>() {});
outputParameters.add(new TypeReference<Utf8String>() {});
Function newStu = new Function("student", Collections.emptyList(), outputParameters);
String encode = FunctionEncoder.encode(newStu);
String from = "0x148F0cF0d183027D3f35dF8553012bD980F99ae5";
String contractAddress = "0x57BF94B4Cca86d6e83347F520Ba2cDfC4FA318F9";
Transaction ethCallTransaction = Transaction.createEthCallTransaction(from, contractAddress, encode);
CompletableFuture<EthCall> ethCallCompletableFuture = web3jClint.ethCall(ethCallTransaction, DefaultBlockParameterName.LATEST).sendAsync();
EthCall ethCall = ethCallCompletableFuture.get();
String input = ethCall.getValue();
System.out.println(input);
List<Type> decode = FunctionReturnDecoder.decode(ethCall.getValue(), newStu.getOutputParameters());
Student stu = new Student(((BigInteger) decode.get(0).getValue()).longValue(), (String) decode.get(1).getValue());
System.out.println("stu-->" + stu);
}
}