solidity10-ABI详解

ABI(Application Binary Interface Specification)

ABI是定义以太坊合约调用的一种格式。
类似Webservice里的SOAP协议一样;也就是定义调用的函数签名,参数编码,返回结果编码等。

http://me.tryblockchain.org/Solidity-abi-abstraction.html

函数选择器

一个函数调用的前四个字节数据指定了要调用的函数签名。计算方式是使用函数签名的keccak256的哈希,取4个字节。

bytes4(keccak256("foo(uint32,bool)"))

方法 :

function name() public view returns (string)
  1. name() -> 二进制,每个字母一个字节,6个字节byte

[110, 97, 109, 101, 40, 41]

  1. 二进制 -> Keccak-256(二进制),256个bit,32个字节byte

[6, -3, -34, 3, -125, -15, 93, 88, 45, 26, 116, 81, 20, -122, -55, -35, -8, 98, -88, -126, -5, 121, 4, -77, -39, -2, -101, -117, -114, 88, -89, -106]

  1. Keccak-256(二进制)-> 16进制,256/8*4=64个字符(十六进制)

0x06fdde0383f15d582d1a74511486c9ddf862a882fb7904b3d9fe9b8b8e58a796

  1. 16进制 -> 取前10位(包括0x)

0x06fdde03

call()方法

如果第一个参数刚好是四个字节,会认为这四个字节指定的是函数签名。
其他非函数签名参数以32个字节(64个十六进制)为组编码,不够32位以32位,超过32位以32的倍数。

你可能感兴趣的:(solidity10-ABI详解)