Solidity之abi.encode各编码方法使用

news2024/11/28 8:42:50

什么是智能合约 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)
        public
        returns (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 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/91847.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

文件内容的读写 (IO) —— 数据流

文件内容的读写 IO —— 数据流一、什么是数据流二、字节流输入InputStream2.1 InputStream 概述2.2 FileInputStream 的使用三、字节流输出OutputStream3.1 OutputStream 概述3.2 FileOutputStream 的使用四、字符流输入 Reader4.1 Reader 与 FileReader4.2 利用 Scanner 进行…

[Java]图论进阶--最小生成树算法

专栏简介 :MySql数据库从入门到进阶. 题目来源:leetcode,牛客,剑指offer. 创作目标:记录学习MySql学习历程 希望在提升自己的同时,帮助他人,,与大家一起共同进步,互相成长. 学历代表过去,能力代表现在,学习能力代表未来! 目录 1. 最小生成树 1.1 Kruskal(克鲁斯卡尔) 算法 …

计算机毕设Python+Vue校园社团信息管理系统(程序+LW+部署)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Teams app LukcyDraw 的升级之路

我已经有很长一段时间没有更新我的 Teams App&#xff1a;LuckyDraw 了&#xff0c;有很多用户反馈给我&#xff0c;因为快到圣诞&#xff0c;新年和春节了&#xff0c;很多公司都开始要使用LuckyDraw来搞抽奖活动&#xff0c;希望LuckyDraw能支持大用户量的抽奖&#xff0c;所…

当打造一款极速湖分析产品时,我们在想些什么

作者&#xff1a;王有卓&#xff0c;StarRocks Contributor 随着开源数据湖技术的快速发展以及湖仓一体全新架构的提出&#xff0c;传统数据湖在事务处理、流式计算以及数据科学场景的限制逐渐得以优化解决。 为了满足用户对数据湖探索分析的需求&#xff0c;StarRocks 在 2.…

jsp+ssm计算机毕业设计ssm实验教学资源管理系统【附源码】

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; JSPSSM mybatis Maven等等组成&#xff0c;B/S模式 Mave…

【linux】linux实操篇之进程管理

目录前言进程介绍和查询进程基本介绍显示系统执行的进程终止进程服务管理监控服务动态监控进程监控网络状态结语前言 本篇博客总结linux中的进程管理相关知识&#xff0c;主要有进程介绍&#xff0c;终止进程&#xff0c;服务管理以及监控服务&#xff0c;一起来看看吧&#x…

模拟电路设计(40)---你真的懂“接地”吗?

概念 接地是指将一个电路、设备乃至分系统与一个基准“地”电位连接的电气要求&#xff0c;目的在于提供一个等电位点或等电位面。接地可以接真正的大地&#xff0c;也可以不接&#xff0c;例如飞机上的电子电气设备接飞机机壳就是接地。 接地必须有接地导体和接地平面才能够…

ChatGPT和InstructGPT 对比,ChatGPT将改变世界,影响力不亚于2007年新一代iPhone智能手机的发布

ChatGPT ChatGPT 的模型&#xff0c;它以对话方式进行交互。对话格式使 ChatGPT 可以回答后续问题、承认错误、挑战不正确的前提并拒绝不适当的请求。ChatGPT 是InstructGPT的兄弟模型&#xff0c;它经过训练可以按照提示中的说明进行操作并提供详细的响应。 ChatGPT 网址&am…

vue打包优化一

webpack.dll.config.js配置 相关文章 https://www.cnblogs.com/echoyya/p/16413591.html 步骤一&#xff1a;创建webpack.dll.config.js&#xff08;不一定要是这个名字&#xff0c;只要执行指令的时候路径正确就行&#xff09; // webpack.dll.config.js const path requi…

FIX:FusionCharts Suite XT 3.19.x

FusionCharts Suite XT&#xff1a;探索 100 多张图表和 2000 多张地图 FusionCharts 提供了 100 多张图表和 2000 多张地图。凭借广泛的文档、一致的 API 和一系列自定义选项 - FusionCharts 是最全面的 JavaScript 图表库&#xff0c;受到全球 750,000 名开发人员的喜爱。Fus…

JAVA实训第四天

目录 异常 什么是异常&#xff1f; 为什么要进行异常处理&#xff1f; 方法的调用堆栈 方法调用堆栈中异常对象的传递 Java中的异常类 常见的异常类 常见的异常类及出现此异常的原因 •1、java.lang.NullpointerException(空指针异常) •2、 java.lang.ClassNotFoundExcept…

rocketmq源码-broker接收消息

前言 这篇笔记&#xff0c;主要记录producer在通过netty发送了请求之后&#xff0c;在broker这边是如何处理的消息的 org.apache.rocketmq.remoting.netty.NettyRemotingServer.NettyServerHandler#channelRead0 这里是broker的nettyServer端接收客户端发送消息的入口&#x…

Android中GRPC的使用-4种通信模式

GRPC的通信模式 GRPC四种基础通信模式&#xff1a;一元RPC、服务器端流RPC、客户端流RPC以及双向流RPC。下面分别四种模式进行介绍&#xff0c;并在Android环境中来实现服务和客户端。 一元RPC 一元RPC模式也被称为简单RPC模式。在该模式中&#xff0c;当客户端调用服务端的远程…

破记录!国产数据库KunDB 单节点TPC-C事务性能超180万tpmC

近日&#xff0c;星环科技KunDB在TPC-C事务性能测试中&#xff0c;采用常规国产服务器&#xff0c;实现了单节点tpmC超180万&#xff0c;体现其世界级领先的事务处理能力。 TPC-C是全球 OLTP 数据库最权威的性能测试基准&#xff0c;由TPC组织&#xff08;国际事务性能委员会&…

【数字IC基础】TestBench功能

文章目录 一、TestBench的目的?二、TestBench的功能?三、TestBench(验证)的四要素?一、TestBench的目的? 对使用硬件描述语言(HDL)设计的电路(DUT)进行仿真验证,测试设计电路的功能、部分性能是否符合预期二、TestBench的功能? TestBench和DUT的关系是一个马蹄形结…

React - 项目初始化设置

React - 项目初始化设置一. 页面零边距二. 路径别名配置三. 安装使用 scss四. 安装 router一. 页面零边距 可以手写 css 重置页面样式&#xff0c;也可使用 reset-css 自动配置 手写样式不多说&#xff0c;这里使用 reset-css 安装依赖 yarn add reset-css src/App.js 文件中引…

阿里技术人分享的三本书豆瓣评分8.5分,让你的架构思维略窥门径

又逢“金九银十”&#xff0c;年轻的毕业生们满怀希望与忐忑&#xff0c;去寻找、竞争一个工作机会。已经在职的开发同学&#xff0c;也想通过社会招聘或者内推的时机争取到更好的待遇、更大的平台。 然而&#xff0c;面试人群众多&#xff0c;技术市场却相对冷淡&#xff0c;…

ssm+Vue计算机毕业设计校园疫情管理系统(程序+LW文档)

ssmVue计算机毕业设计校园疫情管理系统&#xff08;程序LW文档&#xff09; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技…

我用了几行代码就实现了界面变灰效果

前言 前段时间,各个大厂的 App 首页都变成了灰色,网上还有不少人问界面变灰怎么做到的。有人说是后台换了图片,这个回答显然是不懂技术了,对于个性化推荐系统来说,使用的图片那么多张,怎么可能一一替换。还有一种说法是说后台将图片处理后再返回给前端的,这个显然也不太…