财富物语

以太坊ABI有什么作用以太坊abi

Vicky 0

大家好,今天给各位分享以太坊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,感兴趣的同学可以去试试。

好了,文章到此结束,希望可以帮助到大家。

Bitget如何交易?Bitget平台如何购买USDC

Bitget官方交易平台注册地址发布 带你参与以太坊交易

什么是USDT币?Bitget平台买ADA安全吗

相关内容