当前位置: 首页 > article >正文

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

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>
  • 使用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);

    }

}


http://www.kler.cn/a/373008.html

相关文章:

  • Chrome浏览器音/视频无法自动播放
  • 【Stable Diffusion - Ai】小白入门必看(涂鸦、涂鸦重绘、局部重绘和重绘蒙版篇)!真材实料!不卖课!!!
  • (二 上)VB 2010 设计初步
  • 在线教育系统源码开发详解:网校培训平台搭建的核心技术
  • C语言中的野指针以及避免野指针的常用方式
  • react18中react-thunk实现公共数据仓库的异步操作
  • 海思MPP音视频总结
  • uniapp离线打包app无法调用相机权限的解决思路
  • RHCE http作业
  • hdlbits系列verilog解答(DFF8-8位D触发器)-81
  • 大语言模型(LLM)入门级选手初学教程 II
  • Linux学习_11
  • 校园社团信息管理:Spring Boot框架的深度解析
  • Springboot3.3 + Mybatis / Mybatis-plus
  • 2024年10月23日Github流行趋势
  • Invalid version: ‘4.0.0-unsupported‘ - cmd 报错解决方案
  • Django入门教程——数据模型建立
  • SCSS在Vue中切换主题颜色示例(mixin + scss方式,简单高效)
  • 基于Spring Cloud Alibaba开源微服务框架:构建智能化用户审核流程
  • Python基于TensorFlow实现简单循环神经网络回归模型(SimpleRNN回归算法)项目实战
  • 《JVM第3课》运行时数据区
  • AIX、Linux和Windows三种操作系统区别以及应用场景.
  • NavVis LX系列产品典型应用—现有住宅装修改造-沪敖3D
  • MFC七段码显示实例
  • metasploit/modules/auxiliary 有哪些模块,以及具体使用案例
  • 瀚海微SD NAND存储功能描述(20)内部分区和命令响应