以太坊Input Data解析

以太坊的交易(transaction)有两种类型,一种是用来创建智能合约;另一种是消息调用(message call),比如以太坊转账或者调用智能合约的一个函数等。这两种类型的交易都会包含一些共同的字段,比如“gasLimit”和“gasPrice”等。此外,他们还会包含一些各自不同的字段,比如智能合约创建类的交易需要包含一个“init”字段用于指明智能合约的代码;而消息调用类的交易可以包含一个“input”字段用以附着一些额外的信息,如函数调用。本篇文章介绍如何读取“input”这个字段的内容。

用web3直接读取一个交易的数据字段,得到的input的值是一个16进制的字符串表示的字节数组,如交易 

0x2e61c7a33f93c147df825237bd6f7115e5c3b0617dbc7d98ebb1592fa79757a9

的input字段值为

0xa9059cbb0000000000000000000000002bfb974ebc734594f450c7526bbe58e27831efea0000000000000000000000000000000000000000000000056bc75e2d63100000

虽然这段字符串可以被以太坊的虚拟机所识别并运行,但是并不具有可读性,人无法直接看出这个input到底做了什么事情。通过第三方工具,比如Etherscan可以把它解析成结构化数据,如上面的input值在ethersan中的解析结果为:

Function: transfer(address _to, uint256 _value) ***


MethodID: 0xa9059cbb

[0]:  0000000000000000000000002bfb974ebc734594f450c7526bbe58e27831efea

[1]:  0000000000000000000000000000000000000000000000056bc75e2d63100000

这里的解析结果表示 input其实是调用了该智能合约的”transfer“函数,并且传递了两个参数,一个是要转账的地址,一个是要转账的额度。

要进一步理解input就要涉及到ABI这个概念了,ABI - Application Binary Interface,类似于平时编程的API,也就是指明了一个智能合约的接口。智能合约部署到以太坊上时是把编译后的智能合约字节码放到区块链上的,那如果一个人想要调用一个智能合约的函数怎么办呢,他需要告诉以太坊讨该函数的名字和需要传递的参数。input这个串里 “a9059cbb”也就相当于函数的名字,而后面两个相当于函数要接受的两个参数。

这样的话,如果我们要调用一个只能合约的函数时,都要用“a9059cbb”这样的形式吗?当然不是,这太反人类了。这个时候就要用到ABI了, 智能合约在编译成字节码时,也可以得到一份ABI。开发者在得到一个智能合约的ABI后,在编码时用现有的库(如web3)加载ABI文件,然后直接用ABI的函数接口,而不用人工地去写“a9059cbb”这的字节码了,web3这些类库会自动把ABI接口和参数值转换为字节码形式。

你可能感兴趣的:(区块链,以太坊)