博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
以太坊ABI介绍(一)
阅读量:5780 次
发布时间:2019-06-18

本文共 3542 字,大约阅读时间需要 11 分钟。

ABI是什么

ABI全称 Application Binary Interface,字面意思是应用程序二进制接口,可以通俗的理解为合约的接口说明,当合约被编译后,它对应的abi也就确定了。

abi有点类似于程序中的接口文档,描述了字段名称、字段类型、方法名称、参数名称、参数类型、方法返回值类型等

为什么需要ABI

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

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

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

ABI有哪些内容

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

pragma solidity ^0.4.24;contract Demo {    uint private x;    function set(uint _x) public {        x = _x;    }}

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

{  "contractName": "Demo",  "abi": [    {      "constant": false,      "inputs": [        {          "name": "_x",          "type": "uint256"        }      ],      "name": "set",      "outputs": [],      "payable": false,      "stateMutability": "nonpayable",      "type": "function"    }  ],  "bytecode": "0x6080604052348015600f57600080fd5b5060a48061001e6000396000f300608060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806360fe47b1146044575b600080fd5b348015604f57600080fd5b50606c60048036038101908080359060200190929190505050606e565b005b80600081905550505600a165627a7a723058201dfe7c019fec67ccd87250c9ac8642c163cc5f43588715b33e8a8953df3715f60029",  "deployedBytecode": "0x608060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806360fe47b1146044575b600080fd5b348015604f57600080fd5b50606c60048036038101908080359060200190929190505050606e565b005b80600081905550505600a165627a7a723058201dfe7c019fec67ccd87250c9ac8642c163cc5f43588715b33e8a8953df3715f60029",  "sourceMap": "27:97:1:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27:97:1;;;;;;;",  "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",  "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",  "sourcePath": "/Users/root/Workspace/DApp/demo/contracts/Demo.sol",  "ast": {    ...  },  "legacyAST": {    ...  },  "compiler": {    "name": "solc",    "version": "0.4.24+commit.e67f0147.Emscripten.clang"  },  "networks": {},  "schemaVersion": "2.0.1",  "updatedAt": "2018-09-14T11:57:49.750Z"}

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

abi各参数的含义

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

    • name:参数名称
    • type:参数类型
  • outputs:和inputs一样,如果没有返回值,缺省是一个空数组

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

"abi": [    {      "constant": true,      "inputs": [],      "name": "x",      "outputs": [        {          "name": "",          "type": "uint256"        }      ],      "payable": false,      "stateMutability": "view",      "type": "function"    },    {      "constant": false,      "inputs": [        {          "name": "_x",          "type": "uint256"        }      ],      "name": "set",      "outputs": [],      "payable": false,      "stateMutability": "nonpayable",      "type": "function"    }

未完待续,


欢迎订阅「K叔区块链」 - 专注于区块链技术学习
博客地址:
简书主页:
segmentfault主页:
腾讯云主页:

转载地址:http://gvuyx.baihongyu.com/

你可能感兴趣的文章
ImportError: cannot import name UnrewindableBodyError
查看>>
翻翻git之---有用的欢迎页开源库 AppIntro
查看>>
Unity Shaders and Effects Cookbook (3-5) 金属软高光
查看>>
31-hadoop-hbase-mapreduce操作hbase
查看>>
C++ 代码风格准则:POD
查看>>
PHP-Windows下搭建PHP-MSF环境【原创】
查看>>
linux-友好显示文件大小
查看>>
emplace_back() 和 push_back 的区别(转)
查看>>
【转】【WPF】WPF中MeasureOverride ArrangeOverride 的理解
查看>>
ASP、Access、80040e14、保留关键字、INSERT INTO 语句的语法错误
查看>>
【转】二叉树的非递归遍历
查看>>
NYOJ283对称排序
查看>>
接连遇到大牛
查看>>
[Cocos2d-x For WP8]矩形碰撞检测
查看>>
自己写spring boot starter
查看>>
花钱删不完负面消息
查看>>
JBPM之JPdl小叙
查看>>
(step6.1.5)hdu 1233(还是畅通工程——最小生成树)
查看>>
Membership三步曲之进阶篇 - 深入剖析Provider Model
查看>>
huffman编码——原理与实现
查看>>