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()}
正文完