以太坊交易记录input解析

注意:只针对138位长度的交易input解析

一、用web3j解析

转自How to Decoding transaction input data

引用web3j jar包


   org.web3j
    core
    3.3.1

代码如下

package vip.coinbag.managemoneymatters;

import org.junit.Test;
import org.web3j.abi.TypeDecoder;
import org.web3j.abi.datatypes.Address;
import org.web3j.abi.datatypes.generated.Uint256;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * 

类描述:。

* * @author jl * @version v1.0.0.1。 * @since JDK1.8。 *

创建日期:2018/11/1 9:44。

*/
public class test { /** *

功能描述:解析以太坊查询交易记录中的input数据,获取方法名、地址和金额。

*

jl

* @since JDK1.8 *

创建日期:2018/11/9 17:15。

*

更新日期:[日期YYYY-MM-DD][更改人姓名][变更描述]。

*/
@Test public void decodeInput() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { String inputData = "0xa9059cbb00000000000000000000000035f5992e40facfcad742fcfcc1d94ee0581e9cb100000000000000000000000000000000000000000000003635c9adc5dea00000"; String method = inputData.substring(0, 10); System.out.println(method); String to = inputData.substring(10, 74); String value = inputData.substring(74); Method refMethod = TypeDecoder.class.getDeclaredMethod("decode", String.class, int.class, Class.class); refMethod.setAccessible(true); Address address = (Address) refMethod.invoke(null, to, 0, Address.class); System.out.println(address.toString()); Uint256 amount = (Uint256) refMethod.invoke(null, value, 0, Uint256.class); System.out.println(amount.getValue()); } }

结果如下

0xa9059cbb
0x35f5992e40facfcad742fcfcc1d94ee0581e9cb1
1000000000000000000000

二、切割字符串解析

hex转码方法

	/**
     * 

功能描述:16进制转10进制整数。

*

jl

* @param strHex * @since JDK1.8 *

创建日期:2018/10/19 15:55。

*

更新日期:[日期YYYY-MM-DD][更改人姓名][变更描述]。

*/
public static BigInteger hexToBigInteger(String strHex) { if (strHex.length() > 2) { if (strHex.charAt(0) == '0' && (strHex.charAt(1) == 'X' || strHex.charAt(1) == 'x')) { strHex = strHex.substring(2); } BigInteger bigInteger = new BigInteger(strHex, 16); return bigInteger; } return null; } /** *

功能描述:hex地址转地址。

*

jl

* @param strHex * @since JDK1.8 *

创建日期:2018/10/19 16:24。

*

更新日期:[日期YYYY-MM-DD][更改人姓名][变更描述]。

*/
public static String hexToAddress(String strHex) { if (strHex.length() > 42) { if (strHex.charAt(0) == '0' && (strHex.charAt(1) == 'X' || strHex.charAt(1) == 'x')) { strHex = strHex.substring(2); } strHex = strHex.substring(24); return "0x" + strHex; } return null; }

解析input

	@Test
    public void t() {
        String inputData = "0xa9059cbb00000000000000000000000035f5992e40facfcad742fcfcc1d94ee0581e9cb100000000000000000000000000000000000000000000003635c9adc5dea00000";
        String to = inputData.substring(10, 74);
        System.out.println(hexToAddress(to));
        String value = inputData.substring(74);
        BigInteger bigInteger = hexToBigInteger(value);
        System.out.println(bigInteger);
    }

结果如下

0x35f5992e40facfcad742fcfcc1d94ee0581e9cb1
1000000000000000000000

你可能感兴趣的:(Ethereum)