decodeParameters解码bytes[]

Tx:

https://etherscan.io/tx/0xecb398ee0e00ec3b3f1bc4d3d34c69153c2abeef995d39a69c1f30300330c18e

Input Data:

0xac9650d800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000104414bf389000000000000000000000000c5e7703d4647ff77bc733bb56d120471b83382e2000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000000000000000bb80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006507f7280000000000000000000000000000000000000000000000000001d6c3ef643800000000000000000000000000000000000000000000000000014fcd4e1e5ce130000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004449404b7c000000000000000000000000000000000000000000000000014fcd4e1e5ce13000000000000000000000000019edc2f769ac416c725e1c4032be50c1d4b3bd3a00000000000000000000000000000000000000000000000000000000
let calls = web3.eth.abi.decodeParameters(['bytes[]'], calldata)[0];
console.log(`calls1:${calls}`)

解析结果:

0x414bf389000000000000000000000000c5e7703d4647ff77bc733bb56d120471b83382e2000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000000000000000bb80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006507f7280000000000000000000000000000000000000000000000000001d6c3ef643800000000000000000000000000000000000000000000000000014fcd4e1e5ce1300000000000000000000000000000000000000000000000000000000000000000
,
0x49404b7c000000000000000000000000000000000000000000000000014fcd4e1e5ce13000000000000000000000000019edc2f769ac416c725e1c4032be50c1d4b3bd3a

这个类型是bytes[]的数据,请问是怎么解析出2个bytes数据的。解析区分出这2个bytes的原理是什么呢。
有没有对应Java的写法解析web3.eth.abi.decodeParameters

image.png

image.png

请先 登录 后评论

3 个回答

zen

0xE592427A0AEce92De3Edee1F18E0157C05861564的abi, 具体用法搜一搜

请先 登录 后评论
lfhuang

web3j解析出对应的2个bytes及ABI编码的参数解码

        String callData = "00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000104414bf389000000000000000000000000c5e7703d4647ff77bc733bb56d120471b83382e2000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000000000000000bb80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006507f7280000000000000000000000000000000000000000000000000001d6c3ef643800000000000000000000000000000000000000000000000000014fcd4e1e5ce130000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004449404b7c000000000000000000000000000000000000000000000000014fcd4e1e5ce13000000000000000000000000019edc2f769ac416c725e1c4032be50c1d4b3bd3a00000000000000000000000000000000000000000000000000000000";
        
List list = new ArrayList();
        int index = 64;//32字节
        int length = callData.length() / index;
        int beginIndex = 0;
        int endIndex = 64;
        for (int i = 0; i < length; i++) {
            list.add(Numeric.hexStringToByteArray(callData.substring(beginIndex, endIndex)));
            beginIndex = beginIndex + index;
            endIndex = endIndex + index;
        }

        Function function = new Function("multicall", Arrays.<Type>asList(new DynamicArray<DynamicBytes>(DynamicBytes.class, org.web3j.abi.Utils.typeMap(list, DynamicBytes.class))), Arrays.<TypeReference<?>>asList(new TypeReference<DynamicArray<DynamicBytes>>() {
        }));
        System.out.println("encoded:" + FunctionEncoder.encode(function));

        List<Type> decode = FunctionReturnDecoder.decode(callData, function.getOutputParameters());
        List<DynamicBytes> decodeList = (List<DynamicBytes>) decode.get(0).getValue();
        String data1 = Numeric.toHexString(decodeList.get(0).getValue());
        String data2 = Numeric.toHexString(decodeList.get(1).getValue());
        System.out.println("decode1:" + data1);
        System.out.println("decode2:" + data2);

        String currentDirectory = System.getProperty("user.dir");
        AbiDecoder abiDecoder = new AbiDecoder(currentDirectory + "/robot-monitor/abi/SwapV3Router.json");
        DecodedFunctionCall decodedFunctionCall = abiDecoder.decodeFunctionCall(data1);
        System.out.println("解析对应abi数据:" + JSON.toJSONString(decodedFunctionCall));

decode1:0x414bf389000000000000000000000000c5e7703d4647ff77bc733bb56d120471b83382e2000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000000000000000bb80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006507f7280000000000000000000000000000000000000000000000000001d6c3ef643800000000000000000000000000000000000000000000000000014fcd4e1e5ce1300000000000000000000000000000000000000000000000000000000000000000

decode2:0x49404b7c000000000000000000000000000000000000000000000000014fcd4e1e5ce13000000000000000000000000019edc2f769ac416c725e1c4032be50c1d4b3bd3a

解析对应abi数据:{"name":"exactInputSingle","paramList":[{"name":"params","type":"tuple","value":["0xc5e7703d4647ff77bc733bb56d120471b83382e2","0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",3000,"0x0000000000000000000000000000000000000000",1695020840,517612000000000,94519852598616368,0]}],"params":[{"$ref":"$.paramList[0]"}],"size":1}

解析对应abi数据:{"name":"unwrapWETH9","paramList":[{"name":"amountMinimum","type":"uint256","value":94519852598616368},{"name":"recipient","type":"address","value":"0x19edc2f769ac416c725e1c4032be50c1d4b3bd3a"}],"params":[{"$ref":"$.paramList[0]"},{"$ref":"$.paramList[1]"}],"size":2}


请先 登录 后评论
alian - 高级开发工程师

你好大佬这个AbiDecoder类怎么来的?

请先 登录 后评论
  • 2 关注
  • 0 收藏,2587 浏览
  • lfhuang 提出于 2023-09-19 17:17