资讯专栏INFORMATION COLUMN

以太坊ABI介绍(一)

Cruise_Chan / 1947人阅读

摘要:但是对于调用者来说,就需要知道合约有哪些方法,方法的参数是什么,返回值是什么,而这些信息就记录在智能合约的中。

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;


contract Demo {

    uint private x;

    function set(uint _x) public {
        x = _x;
    }

}
",
  "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"
    }

未完待续,以太坊ABI介绍(二)



欢迎订阅「K叔区块链」 - 专注于区块链技术学习

博客地址:http://www.jouypub.com
简书主页:https://www.jianshu.com/u/756c9c8ae984
segmentfault主页:https://segmentfault.com/blog/jouypub
腾讯云主页:https://cloud.tencent.com/developer/column/72548

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/24322.html

相关文章

  • python使用web3py与以太智能合约交互

    摘要:合约规定了公共职能部门,以创造新的投资和撤资,这将成为对冲基金的主要职能。对冲基金的用户通过其以太坊地址来识别,该地址相当于公钥。我发现与其他程序如程序的以太坊智能合约进行交互的最简单方法是使用他们的。 在以太坊和其他区块链中,仍有很多被证明的概念正在实施,开发人员在尝试如何应对这些新概念。作为dInvest 系列文章一部分,我也在研究以太坊并尝试在区块链中实施对冲基金。在上一篇文章中...

    Joyven 评论0 收藏0
  • 以太ABI介绍(二)

    摘要:上一篇我们讲了中的参数含义以太坊介绍一,但是只有函数定义也是不行的,我们还需要调用,当调用一个函数时也需要对该函数进行编码,这样才能执行,那么以太坊是如何生成可供调用的字节码的。 上一篇我们讲了ABI中的参数含义 以太坊ABI介绍(一),但是只有函数定义也是不行的,我们还需要调用,当调用一个函数时也需要对该函数进行编码,这样EVM才能执行,那么以太坊是如何生成可供EVM调用的字节码的。...

    xiaoxiaozi 评论0 收藏0
  • 以太钱包开发系列4 - 发送Token(代币)

    摘要:一系列的类似的对象,如果无返回值时,可以省略。表示函数声明自己不会改变状态变量的值。表示函数可以接收,否则表示不能。哈哈,恭喜大家,到这里这里就完整的实现了一个基于以太坊去中心化网页钱包。 本文首发于深入浅出区块链社区原文链接:[使用 ethers.js 开发以太坊Web钱包4 - 发送Token (代币)](https://learnblockchain.cn/20...,请读者前往...

    Honwhy 评论0 收藏0
  • 以太钱包开发系列4 - 发送Token(代币)

    摘要:一系列的类似的对象,如果无返回值时,可以省略。表示函数声明自己不会改变状态变量的值。表示函数可以接收,否则表示不能。哈哈,恭喜大家,到这里这里就完整的实现了一个基于以太坊去中心化网页钱包。 本文首发于深入浅出区块链社区原文链接:[使用 ethers.js 开发以太坊Web钱包4 - 发送Token (代币)](https://learnblockchain.cn/20...,请读者前往...

    HmyBmny 评论0 收藏0
  • python和flask框架开发以太智能合约

    摘要:是以太坊开发的个人区块链,可用于部署合约,开发应用程序和运行测试。安装是一个用于与以太坊交互的库。启动以太坊测试区块链服务器要部署智能合约,我们应该启动测试以太坊服务器。最后,你将在以太坊合约中设置调用用户对象时获得的值。 将数据存储在数据库中是任何软件应用程序不可或缺的一部分。无论如何控制该数据库都有一个该数据的主控。区块链技术将数据存储到区块链网络内的区块中。因此,只要某个节点与网...

    enrecul101 评论0 收藏0

发表评论

0条评论

Cruise_Chan

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<