区块链 ABI是什么
  DJsdk34H4Gbu 2023年11月02日 41 0


区块链 ABI是什么_区块链


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含义一样)。其实保留​payable​和​constant​是为了向后兼容


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



【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
DJsdk34H4Gbu