以太坊ABI有什么作用以太坊abi
大家好,今天给各位分享以太坊ABI有什么作用的一些知识,其中也会对以太坊 abi进行解释,文章篇幅可能偏长,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在就马上开始吧!
本文目录
以太坊的ABI编码如何使用 Etherscan 的 API以太坊的ABI编码ABI全称ApplicationBinaryInterface,是调用智能合约函数以及合约之间函数调用的消息编码格式定义,也可以理解为智能合约函数调用的接口说明.类似Webservice里的SOAP协议一样;也就是定义操作函数签名,参数编码,返回结果编码等。
使用ABI协议时必须要求在编译时知道类型,即强类型相关.
当一个智能合约编译出来后,他的abi接口定义就确定了.比如下面的智能合约:
生成的字节码:
生成的abi定义:
可以看出,生成abi包含了2个定义:函数lotus,事件Log_lotus,各个字段含义见上.根据该abi定义,就可以生成调用该智能合约函数的abi格式的数据了.
格式简单的可以表示为:函数选择器+参数编码
一个函数调用的前四个字节数据指定了要调用的函数签名。计算方式是使用函数签名的keccak256的哈希,取4个字节。
函数名如果有多个参数使用,隔开,要去掉表达式中的所有空格。在geth客户端,通过命令可以得到hash:
由于前面的函数签名使用了四个字节,参数的数据将从第五个字节开始。
根据参数类型,编码规则有所区别:
除了bytes,和string,其他类型的数据不足32字节长度的需要加0补足32字节.动态长度的编码在例子中介绍.
函数:functionbaz(uint32x,booly):
调用:baz(69,true)
生成的数据如下:
返回结果是一个bool值,在这里,返回的是false:
函数:f(uint,uint32[],bytes10,bytes)
调用:(0x123,[0x456,0x789],"1234567890","Hello,world!")
函数选择器:bytes4(sha3("f(uint256,uint32[],bytes10,bytes)"))
对于固定大小的类型值uint256和bytes10,直接编码值。
对于动态内容类型值uint32[]和bytes,我们先编码偏移值,偏移值是整个值编码的开始到真正存这个数据的偏移值(这里不计算头四个用于表示函数签名的字节)。
所以参数编码数据依次为:
尾部部分的第一个动态参数,[0x456,0x789]编码拆解如下:
最后我们来看看第二个动态参数的的编码,Hello,world!。
所以最终结果是:
如何使用 Etherscan 的 API虽然以太坊提供了Web3和JsonRpc这2种API,geth也额外提供了一些API,但是对于开发以太坊应用来说还是显得有些不足,比如说获取交易记录的时间,需要先通过交易的hash找到该交易对应的区块id,然后才能找到对应的时间,查询起来相当不方便。
好在Etherscan对外提供了一些公共的API,给我们提供了额外的能力来处理更多的业务场景。
为了方便开发人员更好地使用ethersacn.io,网站提供了一系列API供开发人员使用。
API的使用非常简单,基本上都是get方法,通过http请求就可以直接调用,在每个Api的说明文档都有对应的例子可以查看。
API主要包含以下模块:账号、智能合约、交易、区块、事件日志、代币及工具等。
账号相关的API,有获取账号金额,获取交易记录等,该模块提供的API最多。
API示例
https://api.etherscan.io/api?module)=account&action=balance&address=0xddbd2b932c763ba5b1b7ae3b362eac3e8d40121a&tag=latest&apikey=YourApiKeyToken
参数说明
其中module、action、apikey是每个API都有的参数,其他的参数则因不同API而不同。
返回结果
API示例
https://api.etherscan.io/api?module=account&action=balancemulti&address=0xddbd2b932c763ba5b1b7ae3b362eac3e8d40121a,0x63a9975ba31b0b9626b34300f7f627147df1f526,0x198ef1ec325a96cc354c7266a038be8b5c558f67&tag=latest&apikey=YourApiKeyToken
参数说明
(前面有讲过的参数就不讲了,下同)
与单个账号金额API相比,参数address用,号分隔多个账号,最多可支持20个账号的金额查询。
返回结果
API示例
https://api.etherscan.io/api?module=account&action=txlist&address=0xddbd2b932c763ba5b1b7ae3b362eac3e8d40121a&startblock=0&endblock=99999999&page=1&offset=10&sort=asc&apikey=YourApiKeyToken
参数说明
返回结果
API示例
https://api.etherscan.io/api?module=account&action=txlistinternal&address=0x2c1ba59d6f58433fb1eaee7d20b26ed83bda51a3&startblock=0&endblock=2702578&page=1&offset=10&sort=asc&apikey=YourApiKeyToken
参数说明
参数与上一个API基本相同,只有action是txlistinternal这一点不同,这2种交易的区别是什么呢?简单的理解就是“正常”的交易是会记录到区块链上的,而“内部”交易是指不会记录到区块链上的记录,比如交易失败的记录。
另外这个API还可以通过交易hash查看交易的详情。
https://api.etherscan.io/api?module=account&action=txlistinternal&txhash=0x40eb908387324f2b575b4879cd9d7188f69c8fc9d87c901b9e2daaea4b442170&apikey=YourApiKeyToken
返回结果
API示例
参数说明
返回结果
API示例
参数说明
返回结果
智能合约相关的API,其实只有一个获取智能合约接口的API,但是这个API非常有用。
API示例
参数说明
智能合约的abi就是一个json对象,通过这个对象我们可以调用其接口方法,后面会写一篇文章介绍如何操作abi对象,敬请期待。
返回结果
返回结果内容比较长,这里省略,就是一个json对象,感兴趣的可以自行调用该API看结果。
账号和智能合约的API已经能满足大部分的业务需求了,其他模块的API感觉没什么太大的作用,这里就不介绍了,感兴趣的读者可以自行查阅。
这里再说下API的使用限制,刚才提到每个API都有一个apikey参数,如果API没加上这个参数的话,每个API的请求次数不能超过5次每秒。
Etherscan提供的这些API有些是和以太坊提供的API有重复的,比如说获取账号金额,获取事件日志记录等,但有一些API给我们带来了很大的便利性,比如获取账号交易记录,有了这个API就不用使用几个原生API进行各种数据拼接了。
另外Etherscan的这套API在Rinkeby测试网络也有一套一模一样的,区别只是前面的url不同,Rinkeby的是:api-rinkeby.etherscan.io,感兴趣的同学可以去试试。
好了,文章到此结束,希望可以帮助到大家。