关于solidity解析abi方法,入参和结果字节码

引入依赖,github可以找到

<dependency>
    <groupId>com.esaulpaugh</groupId>
    <artifactId>headlong</artifactId>
    <version>7.0.0</version>
</dependency>
 private static  String abi = "自行复制合约的abi内容";

// 解码交易的入参,合约参数字节码
    public static Map<String, Object> abiDecodeArgs(String code) {
         Map<String, Object> map = new HashMap<String, Object>();
        final List<Function> functions = ABIJSON.parseFunctions(abi);
        for (Function function : functions) {
            final boolean equals = function.selectorHex().equals(code.substring(0,8));
            if (equals){
                final Tuple objects = function.decodeCall(Strings.decode(code));
                map.put("name",function.getName());
                map.put("objects",objects);
            }

        }
        return map;
    }
// 解码交易的出参,合约结果字节码
    public static Map<String, Object> abiDecodeResult(byte[] code,String methodSelectorHash) {
        Map<String, Object> map = new HashMap<String, Object>();
        final List<Function> functions = ABIJSON.parseFunctions(abi);
        for (Function function : functions) {
            final boolean equals = function.selectorHex().equals(methodSelectorHash);
            if (equals){
                final Tuple objects = function.decodeReturn(code);
                objects.toString();
                map.put("name",function.getName());
                map.put("objects",objects);
            }

        }
        return map;
    }


相关RLP编码和kecak256哈希规范请看solidity官方文档,


应用二进制接口(Application Binary Interface(ABI)) 说明 — Solidity develop 文档

类似于以下这样,

 


版权声明:本文为langchao7946原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。