Go 区块链 Input Data 解析

作者: 太阳上的雨天 分类: Go,Web3.0 发布时间: 2022-10-31 10:07

input data

在以太坊协议中,当交易(transaction)为合约创建时,input data 是账户初始化程序的 EVM 代码;

而当交易(transaction)为消息调用时,input data 是合约函数调用数据。

正常情况下简单的消息调用如调用转账函数时需要填写你要转账的地址 _to 和你要转账的数量 _amount,这些基本信息都包含在 input data 里面。

我们将原始的 input data 分为三个部分进行分析:

0xa9059cbb:函数标识符
000000000000000000000000345d8e3a1f62ee6b1d483890976fd66168e390f2: 第一个参数为 address 即你要转账的地址,并补位到 32 字节即 64 个 16 进制字符
0000000000000000000000000000000000000000000054b7d8ed70650b290000: 第二个参数为 value 即你要转账的数量,并补位到 32 字节即 64 个 16 进制字符
通过对比分析我们可以发现 input data 的基本结构为函数标识符+参数

github.com/fbsobreira/gotron-sdk@v0.0.0-20201030191254-389aec83c8f9

解析代码

func ParseData(data string) (string, uint64) {
    // 标识符 0xa9059cbb
   //   _ = data[:8]

    if len(data) == 8 {
        return "", 0
    }

    // 地址
    hexAddress := strings.TrimPrefix(data[8:72], "0000000000000000000000")
    b58 := AddressHexToB58(hexAddress)

    // amount
    hexAmount := strings.TrimPrefix(data[72:], "0000000000000000000000000000000000000000000000000000000")

    if hexAmount == "" {
        return hexAddress, 0
    }

    amount := HexToUint64(hexAmount)

    return b58, amount
}

// HexToUint64
func HexToUint64(hex string) uint64 {
    hex = strings.Replace(hex, "0x", "", -1)
    n := new(big.Int)
    n, _ = n.SetString(hex, 16)
    return n.Uint64()
}

// AddressHexToB58
func AddressHexToB58(hexAddress string) string {
    a := addr.HexToAddress(hexAddress)
    return a.String()
}

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注