solidity的struct对象,web3j java解析输出参数

solidity的struct对象,web3j java解析输出参数

  • 先决条件
solidity 复制代码
// 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;
    }
}
xml 复制代码
<dependency>
    <groupId>org.web3j</groupId>
    <artifactId>core</artifactId>
    <version>4.12.0</version>
</dependency>
  • 使用Java进行输出参数的解析
java 复制代码
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);

    }

}
相关推荐
直奔標竿22 分钟前
Java开发者AI转型第二十七课!Spring AI 个人知识库实战(六)——全栈闭环收官,解锁前端流式渲染终极技巧
java·开发语言·前端·人工智能·后端·spring
金銀銅鐵1 小时前
[java] 编译之后的记录类(Record Classes)长什么样子(上)
java·jvm·后端
程序员李程峰2 小时前
基础知识④链和代币之间的关系
web3·去中心化·区块链·智能合约·同态加密·共识算法·信任链
野生技术架构师3 小时前
金三银四面试总结篇,汇总 Java 面试突击班后的面试小册
java·面试·职场和发展
小袁拒绝摆烂3 小时前
多表关联大平层转JSON树形结构
java·json
ja哇4 小时前
大厂面试高频八股
java·面试·职场和发展
yoyo_zzm4 小时前
Laravel6.x新特性全解析
java·spring boot·后端
程序员李程峰4 小时前
基础知识⑤ERC-20、BEP-20 和TRC-20 这三种流行的加密代币标准
web3·去中心化·区块链·智能合约·同态加密·共识算法·信任链
Nick_zcy4 小时前
小说在线阅读网站和小说管理系统 · 功能全解析
java·后端·python·springboot·ruoyi