以太坊的交易(transaction)有两种类型,一种是用来创建智能合约;另一种是消息调用(message call),比如以太坊转账或者调用智能合约的一个函数等。这两种类型的交易都会包含一些共同的字段,比如“gasLimit”和“gasPrice”等。此外,他们还会包含一些各自不同的字段,比如智能合约创建类的交易需要包含一个“init”字段用于指明智能合约的代码;而消息调用类的交易可以包含一个“input”字段用以附着一些额外的信息,如函数调用。本篇文章介绍如何读取“input”这个字段的内容。
用web3直接读取一个交易的数据字段,得到的input的值是一个16进制的字符串表示的字节数组,如交易
0x2e61c7a33f93c147df825237bd6f7115e5c3b0617dbc7d98ebb1592fa79757a9
的input字段值为
0xa9059cbb0000000000000000000000002bfb974ebc734594f450c7526bbe58e27831efea0000000000000000000000000000000000000000000000056bc75e2d63100000
虽然这段字符串可以被以太坊的虚拟机所识别并运行,但是并不具有可读性,人无法直接看出这个input到底做了什么事情。通过第三方工具,比如Etherscan可以把它解析成结构化数据,如上面的input值在ethersan中的解析结果为:
Function: transfer(ad