什么是智能合约 ABI

ABI = Specification for encoding and decoding

非常精炼的一句话:一套用来编码和解码的规范。

注意与合约字节码(bytecode)要区分开,字节码只是一串用十六进制数表示的 EVM 操作码。

在 Solidity 文档中描述为:

“ABI 是与以太坊生态系统中的合约交互的标准方式。既来自区块链外部,也用于合约之间的交互”。

什么是合约的 JSON ABI

JSON ABI specification for functions
JSON ABI specification for events

合约内部函数和事件的编码规范。

(1)abi.encodeWithSignature

函数签名:

abi.encodeWithSignature(string memory signature, ...args) returns (bytes memory)

代码示例:

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;contract A {function callBTest(address _address,uint256 _num,string memory _message) public returns (bool) {(bool success, ) = _address.call(abi.encodeWithSignature("test(uint256,string)", _num, _message));return success;}
}contract B {uint256 public num;string public message;function test(uint256 _num, string memory _message)publicreturns (uint256, string memory){num = _num;message = _message;return (num, message);}
}

我们在合约A中通过call的方式,使用内置函数abi.encodeWithSignature对合约B的test函数进行调用。第一个参数为被调用函数的签名(不能包含形参和空格),后面是类似js的剩余参数,给被调用函数传参的(顺序要对应)。

注:test(uint256,string)与test(uint,string)签名哈希是不一样的!

测试:

(2)abi.encode和abi.encodePacked

bytes4 sig = bytes4(keccak256("test(uint256,string)"));bytes memory _bNum = abi.encode(_num);bytes memory _bMessage = abi.encode(_message);(bool success,) = _address.call(abi.encodePacked(sig, _bNum, _bMessage));return success;

与上面编码不同的是,这里的函数签名sig是用keccak256算法计算结果取前4个字节得来的,另外其余的参数也都使用abi.encode包装了,最后在统一放入abi.encodePacked函数中(属于非标准编码模式)。

测试过程上同。

(3)abi.encodeWithSelector

 bytes4 sig = bytes4(keccak256("test(uint256,string)"));(bool success, ) = _address.call(abi.encodeWithSelector(sig, _num, _message));

这种需要函数签名哈希的前4个字节,参数不变,作用相同。

早在v0.4版本是使用abi.encode(...)函数,不过已废弃了。

测试过程上同。

另外额外一种普通调用其它合约方法的写法:

 B contractB = B(_address);
(uint256 num, string memory message) = contractB.test(_num, _message);
return true;

可能会提示有些变量没有用到,问题不大(或者可以写入event) ,也是能达到同样效果的。

ABI 不仅仅是人类和 EVM之间交互的链接。最重要的是,ABI定义了如何对数据和合约调用进行编码和解码的明确规范。ABI 有助于进一步概念化合约,通过参数列表及其类型可以调用哪些函数以及如何调用。ABI 仅包含有关函数和事件的信息,不包括有关状态变量或修饰符的信息(状态变量定义为public时除外,此时将创建一个全局的getter方法)。

参考: Contract ABI Specification — Solidity 0.8.17 documentation

https://coinsbench.com/solidity-tutorial-all-about-abi-46da8b517e7

Solidity之abi.encode各编码方法使用相关推荐

  1. golang 实现solidity keccak256(abi.encode(xxx))签名

    golang 代码 需要找到对应solidity方法的abi. package mainimport ("fmt""github.com/ethereum/go-ethe ...

  2. 关于solidity解析abi方法,入参和结果字节码

    引入依赖,github可以找到 <dependency><groupId>com.esaulpaugh</groupId><artifactId>hea ...

  3. 智能合约语言Solidity Solidity API

    链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. 智能合约语言Solidity Solidity API Solidity 是以太坊智能合约编程语言,阅读本文前,你应该对 ...

  4. 区块链教程(三):Solidity编程基础

    注:本教程为技术教程,不谈论且不涉及炒作任何数字货币 区块连教程(一):前置知识-linux补充 区块链教程(二):基础概念介绍 区块链教程(三):Solidity编程基础 区块链教程(四):搭建私链 ...

  5. solidity经典案例----智能小游戏

    参考于https://ke.qq.com/webcourse/2379017/103111126#taid=10365401060101385&vid=5285890802017890711 ...

  6. Solidity基础入门讲解

    Solidity的语言类型: 静态类型的语言:编译前变量类型需要先确定 变量可以分为: 值类型:赋值或者传参时总是进行值拷贝 引用类型:传递的是地址 这里先给出一个总览图: 整型: 和其他语言类型,可 ...

  7. solidity开发讲解

    solidity 教程链接 1. 源文件结构 源文件中可以包含任意多个 合约定义 .导入源文件指令 . 版本标识 指令. 结构体 . 枚举 和 函数 定义. SPDX许可标识 SPDX:The Sof ...

  8. 以太坊智能合约基础——Solidity语言的计量单位和全局变量

    本文重点介绍 Solidity 语言的计量单位和全局变量,包括以太币单位.时间单位.特殊变量和函数三个类别.本文内容来源于 Solidity 0.8.12 版本. 以太币单位 以太币 Ether 单位 ...

  9. Solidity——Create2

    Solidity--Create2 介绍 君士坦丁堡硬升级中引入了一个新操作码 CREATE2 ,它使用新的方式来计算常见的合约地址,让生成的合约地址更具有可控性. 具体内容 在 CREATE2 以前 ...

最新文章

  1. keycloak mysql_Keycloak换mysql存储详细步骤
  2. cnn风格迁移_快速图像风格迁移思想在无线通信中的另类应用:算法拟合
  3. Android性能优化
  4. php动态网页转换成html,怎么把动态的php文件转换成静态的html文件,html文件是php文件…...
  5. python安装环境安装_安装Python运行环境
  6. 有线同步--ASP007
  7. jenkins角色权限管理
  8. span里面插入文字
  9. [C++11]推荐使用auto的场景
  10. linux系统安装serv u,建立第一个可用的FTP服务器
  11. 获取当前scn号scn1_11.1.1.2 基于SCN的查询(AS OF SCN)
  12. idea配置Lua环境
  13. 按键精灵html代码,最新按键精灵脚本代码大全 按键精灵命令运行方法
  14. sublime添加到右键的注册表文件
  15. 一个使用CC2530实现的Zigbee红绿灯
  16. Origin 正版模拟城市5 警告 您使用《模拟城市》产品码不支援目前选取的语言。请连络顾客支援以获得详情。
  17. MySQL之CentOS安装MySQL
  18. 墨画子卿第四章第4节:凝神期的劫云
  19. Spring(8):构造方法注入与示例
  20. 测网速-在线网速测试原理及代码

热门文章

  1. 2018深圳国际工业自动化及机器人展览会
  2. Learning to Move with Affordance Maps译文
  3. IBM Watson:武士刀的悲歌
  4. 用EasyX写成绩管理系统
  5. Qualcomm平台Mipi DSI转RGB
  6. 30岁想转行零基础学什么好(0基础转行学什么技术不晚)
  7. PHP中 empty() 和 isset() 的区别
  8. 如何让hr显示为虚线?
  9. 图片质量估计-如何判定一个人脸是否为阴阳脸(第二弹:C++版本)
  10. winform实现图片像素化的关键