区块链笔记:关于ABI和分析ABI中的字段,关于Gas,Gas消耗计算,Gas消耗表

本文深入解析智能合约中ABI(Application Binary Interface)的概念与作用,解释其如何定义智能合约的调用接口,包括方法输入、输出及状态变化。同时,探讨ABI与API的区别,以及在智能合约调用中的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于ABI

  • 全称 Application Binary Interface 应用二进制接口
  • 描述智能合约调用编解码二进制信息
  • 在智能合约里,我们所能调用的是一些定义的方法,当我们在外部调用智能合约方法的时候
  • 到底传什么类型的参数,参数会有多大,返回值是什么等等这些信息,我们可以通过不同的语言来编写客户端调用
  • 这就要求,我们到底调用合约里面的具体什么方法?需要有一个二进制层面的描述,这个就叫做ABI
  • 与API有很大的差别
    • API是应用层面的编程调用接口,是宏观层面函数级别的
    • ABI是更加微观深入,是二进制级别的定义
    • 包含JSON格式的描述信息,关于function和event事件
  • 下面是一段ABI
"abi": [
    {
      "constant": true,
      "inputs": [
        {
          "internalType": "uint256",
          "name": "a",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "b",
          "type": "uint256"
        }
      ],
      "name": "Add",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "payable": false,
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "internalType": "uint256",
          "name": "a",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "b",
          "type": "uint256"
        }
      ],
      "name": "Reduce",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "payable": false,
      "stateMutability": "pure",
      "type": "function"
    }
]
  • 上面是具体的一些ABI的描述信息
  • 其实就是指对智能合约里面调用层面的接口方法的具体的描述
  • 我们在调用智能合约里面方法的时候,一定要有一个ABI的
  • 否则外部的调用方法就没法知道这个合约方法到底输入什么,返回什么
  • 如何查看ABI?
    • 使用truffle编译合约后可到build目录中查看
    • 目录:build/contracts/xxx.json

分析ABI

以描述Function的ABI格式为例

字段名作用
name方法名称
type方法类型
inputs输入参数
inputs 下的 name参数名称
inputs 下的 type参数类型
inputs 下的 components描述结构体
outputs输出值
payable是否可以接收Ether
constant是否改写区块链状态
stateMutabilitypure\view 备注:pure指与账本无关的纯工具方法,view返回一些账本信息,且只读

关于Gas

  • Gas 英文翻译是汽油,是指在以太坊中对智能合约的部署,方法调用所需要消耗的以太币
  • 也就是说在以太坊中对合约的使用是有成本的,但是对账本数据读取是不需要消耗Gas的
  • 一般来说占用账本的存储,需要让虚拟机EVM执行某些转账或更改状态属性等才会消耗Gas

Gas消耗的计算

  • eth.estimateGas({from:eth.accounts[0], to:eth.accounts[1], value:1000})
  • estimateGas这是以太节点支持的方法,可以计算比如转账1000的以太币需要消耗多少Gas
  • 这个方法可以在以太坊节点的控制台执行,也可以通过RPC来调用
  • 一般我们可以通过对Gas的计算,然后乘上Gas price来获得某个动作需要消耗的以太币

Gas消耗表

Operation NameGas CostRemark
step1default amount per execution cycle
stop0free
suicide0free
sha320
sload20get from permannet storage
sstore100put into permanent storage
balance20
create100contract creation
call20initiating a read-only call
memory1every additional word when expanding memory
txdata5every byte of data or code for a transaction
transaction500base fee transaction
contract creation53000changed in homestead from 21000
  • EVM 执行的是字节码指令
  • 对于每一个步骤的执行会消耗1个单位的gas
  • 0表示不需要消耗
  • 如果需要进行sha3的哈希计算,需要消耗20个单位gas
  • 最下面创建一个合约需要消耗53000个单位gas,在以太坊一开始的版本中创建一个合约需要21000个单位gas, 这里有一个涨价了
  • 这里都是gas的消耗,注意:gas需要乘上gas price才是以太币的成本
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值