基于以太坊发行代币代币开发,ABI.js文件问题

ABI全称Application Binary Interface, 是调用智能合约函数以及合约之间函数调用的消息编码格式定义,也可以理解为智能合约函数调用的接口说明. 类似Webservice里的SOAP协议一样;也就是定义操作函数签名,参数编码,返回结果编码等。

使用ABI协议时必须要求在编译时知道类型,即强类型相关.

当一个智能合约编译出来后, 他的abi接口定义就确定了. 比如下面的智能合约:

"inputs": [ //方法参数,它是一个对应数组,数组里的每个对象都是一个参数说明
  

可以看出, 生成abi包含了2个定义: 函数 lotus , 事件 Log_lotus , 各个字段含义见上. 根据该abi定义,就可以生成调用该智能合约函数的abi格式的数据了.

格式简单的可以表示为: 函数选择器+参数编码

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

函数名如果有多个参数使用,隔开,要去掉表达式中的所有空格。在geth客户端,通过命令可以得到hash:

由于前面的函数签名使用了四个字节,参数的数据将从第五个字节开始。

根据参数类型,编码规则有所区别:

  • bytes:动态分配大小字节数组。不是一个值类型!
  • string:动态大小UTF8编码的字符串,不是一个值类型!

除了bytes,和string, 其他类型的数据不足32字节长度的需要加0补足32字节. 动态长度的编码在例子中介绍.

返回结果是一个bool值,在这里,返回的是false:

对于 动态内容类型uint32[]bytes ,我们先 编码偏移值 ,偏移值是整个值编码的开始到真正存这个数据的偏移值(这里不计算头四个用于表示函数签名的字节)。

所以参数编码数据依次为:

  • 0x0080 (第二个参数的由于是动态内容类型,所以这里存储偏移值,4*32 字节,刚好是头部部分的大小)
  • 0x0000 (“” 在右侧补0到32字节大小)
  • 32** ** 动态长度的计算见后)

尾部部分的第一个动态参数, [0x456, 0x789] 编码拆解如下:

  • 0x0002 (整个数组的长度,2)。
  • 0x0789(第二个元素)

最后我们来看看第二个动态参数的的编码, Hello, world!

}

我要回帖

更多关于 以太坊代币 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信