• -------------------------------------------------------------
  • ====================================

以太坊ABI介绍(一)

区块链 dewbay 2年前 (2022-07-04) 1338次浏览 已收录 0个评论 扫描二维码

ABI 是什么

ABI全称 Application Binary Interface,字面意思是应用程序二进制接口,可以通俗的理解为合约的接口说明,当合约被编译后,它对应的 abi 也就确定了。
abi 有点类似于程序中的接口文档,描述了字段名称、字段类型、方法名称、参数名称、参数类型、方法返回值类型等

为什么需要 ABI

我们编写智能合约的流程是:

  • 编写合约代码(一般使用 solidity 语言)
  • 编译合约,将 solidity 编写的代码编译成 EVM 可识别的 bytecode,这一步生成 abi
  • 部署合约,将合约部署到区块链上,生成合约地址,将合约内容(即上一步生成的 bytecode)作为 input date 输入。部署合约是一个交易过程,所以也会生成一个交易 Has
  • 执行合约,获取合约地址,然后传入参数调用合约中的方法,获得执行结果

从上面的步骤可以看出,abi 对于 EVM 来说,其实是不需要的。但是对于调用者来说,就需要知道合约有哪些方法,方法的参数是什么,返回值是什么,而这些信息就记录在智能合约的 abi 中。所以 abi 其实就相当于开发者的接口文档,方便开发者调用执行合约

ABI 有哪些内容

我们来编写一个最简单的合约,然后编译生成 abi 看下内容

  1. pragma solidity ^0.4.24;
  2. contract Demo {
  3. uint private x;
  4. function set(uint _x) public {
  5. x = _x;
  6. }
  7. }

执行 truffle compile 编译合约,就会生成对应的文件Demo.json,内容如下。由于 json 太长,删除了一些不重要的内容,完整内容可以自己手动执行看看。

  1. {
  2. “contractName”: “Demo”,
  3. “abi”: [
  4. {
  5. “constant”: false,
  6. “inputs”: [
  7. {
  8. “name”: “_x”,
  9. “type”: “uint256”
  10. }
  11. ],
  12. “name”: “set”,
  13. “outputs”: [],
  14. “payable”: false,
  15. “stateMutability”: “nonpayable”,
  16. “type”: “function”
  17. }
  18. ],
  19. “bytecode”: “0x6080604052348015600f57600080fd5b5060a48061001e6000396000f300608060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806360fe47b1146044575b600080fd5b348015604f57600080fd5b50606c60048036038101908080359060200190929190505050606e565b005b80600081905550505600a165627a7a723058201dfe7c019fec67ccd87250c9ac8642c163cc5f43588715b33e8a8953df3715f60029”,
  20. “deployedBytecode”: “0x608060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806360fe47b1146044575b600080fd5b348015604f57600080fd5b50606c60048036038101908080359060200190929190505050606e565b005b80600081905550505600a165627a7a723058201dfe7c019fec67ccd87250c9ac8642c163cc5f43588715b33e8a8953df3715f60029”,
  21. “sourceMap”: “27:97:1:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27:97:1;;;;;;;”,
  22. “deployedSourceMap”: “27:97:1:-;;;;;;;;;;;;;;;;;;;;;;;;69:52;;8:9:-1;5:2;;;30:1;27;20:12;5:2;69:52:1;;;;;;;;;;;;;;;;;;;;;;;;;;;112:2;108:1;:6;;;;69:52;:::o”,
  23. “source”: “pragma solidity ^0.4.24;\n\n\ncontract Demo {\n\n uint private x;\n\n function set(uint _x) public {\n x = _x;\n }\n\n}\n”,
  24. “sourcePath”: “/Users/root/Workspace/DApp/demo/contracts/Demo.sol”,
  25. “ast”: {
  26. },
  27. “legacyAST”: {
  28. },
  29. “compiler”: {
  30. “name”: “solc”,
  31. “version”: “0.4.24+commit.e67f0147.Emscripten.clang”
  32. },
  33. “networks”: {},
  34. “schemaVersion”: “2.0.1”,
  35. “updatedAt”: “2018-09-14T11:57:49.750Z”
  36. }

大部分参数通过名称就可以看出来含义,这里我们主要介绍 abi 中各参数的含义和调用函数时生成ABI编码的过程

abi 各参数的含义

  • name:函数名称
  • type:方法类型,包括functionconstructorfallback(缺省方法)可以缺省,默认为function
  • constant:布尔值,如果为 true 指明方法不会修改合约字段的状态变量
  • payable:布尔值,标明方法是否可以接收 ether
  • stateMutability:状态类型,包括pure (不读取区块链状态),view (和 constant 类型,只能查看,不会修改合约字段),nonpayable(和 payable 含义一样),payable(和 payable 含义一样)。其实保留payableconstant是为了向后兼容
  • inputs:数组,描述参数的名称和类型
    • name:参数名称
    • type:参数类型
  • outputs:和inputs一样,如果没有返回值,缺省是一个空数组

这里要说明一点的是,由于示例中的x字段类型为private,所以没有生成一个和参数名称一样的函数,如果x字段类型为public,生成的 abi 就如下,会多一个和参数名称一样的函数

  1. “abi”: [
  2. {
  3. “constant”: true,
  4. “inputs”: [],
  5. “name”: “x”,
  6. “outputs”: [
  7. {
  8. “name”: “”,
  9. “type”: “uint256”
  10. }
  11. ],
  12. “payable”: false,
  13. “stateMutability”: “view”,
  14. “type”: “function”
  15. },
  16. {
  17. “constant”: false,
  18. “inputs”: [
  19. {
  20. “name”: “_x”,
  21. “type”: “uint256”
  22. }
  23. ],
  24. “name”: “set”,
  25. “outputs”: [],
  26. “payable”: false,
  27. “stateMutability”: “nonpayable”,
  28. “type”: “function”
  29. }

露水湾 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:以太坊ABI介绍(一)
喜欢 (0)
[]
分享 (0)
关于作者:
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址