详解函数动态调用的作用——call

动态调用的作用

  • 类似于其他语言的反射
  • 能够开发框架性代码

Call调用语法

(bool success, bytes data) = <address>.call(bytes calldata)
  • call是address的方法
  • call返回值(bool success, bytes data)
  • 忽视返回值success,会造成严重问题

calldata的结构

  • call的参数是calldata
  • calldata的前四个字节是selector,剩下的是参数编码
  • selector = bytes(keccak256())
  • keccak256:哈希sha3->256

Abi工具函数

  • calldata = abi.encodeWithSignature(sig, ps)–会用
  • 返回值解码abi.decode(bytes)

编码、解码 decoder.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;contract AbiDecode {struct MyStruct {string name;uint[2] nums;}function encode(uint x,address addr,uint[] calldata arr,MyStruct calldata myStruct) external pure returns (bytes memory) {return abi.encode(x, addr, arr, myStruct);}function decode(bytes calldata data)externalpurereturns (uint x, address addr, uint[] memory arr, MyStruct memory myStruct){// (uint x, address addr, uint[] memory arr, MyStruct myStruct) = ...(x, addr, arr, myStruct) = abi.decode(data, (uint, address, uint[], MyStruct));}
}

效果:
在这里插入图片描述
Callee.sol

// SPDX-License-Identifier: GPL-3.0pragma solidity >=0.8.2 <0.9.0;contract Callee {uint public x;function setX(uint _x)public returns(uint){x = _x;return x;}
}

Caller.sol

// SPDX-License-Identifier: GPL-3.0pragma solidity >=0.8.2 <0.9.0;contract Caller{address calleeAddress;uint public xx;constructor(address _calleeAddress){calleeAddress = _calleeAddress;}function setCalleeX(uint _x)public{bytes memory cd = abi.encodeWithSignature("setX(uint256)", _x);(bool suc, bytes memory rst) = calleeAddress.call(cd);if(!suc){revert("call failed");}(uint x) = abi.decode(rst, (uint));xx = x;}
}

效果:
在这里插入图片描述

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

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

相关文章

183.二叉树:二叉搜索树中的众数(力扣)

代码解决 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* Tre…

Linux2(文件类型分类 基本命令2 重定向)

目录 一、文件类型分类 二、基本命令2 1. find 帮助查询 2. stat 查看文件的信息 3. wc 统计文本 4. 查看文本内容 4.1 cat 4.2 more 4.3 less 4.4 head 4.5 tail 5. cal 显示日历 6. date 显示时间 7. du 文件大小 8. ln 链接 软链接 硬链接 区别 9. histo…

碳中和研究院OLED透明屏2x2整机项目方案

一、项目背景 随着全球气候变化和环境问题的日益严重&#xff0c;碳中和成为各国政府和企业的重要议题。为了响应这一趋势&#xff0c;黑龙江碳中和研究院计划引入先进的OLED透明屏技术&#xff0c;以展示其研究成果和碳中和理念。本项目旨在为该研究院提供一套高质量的OLED透明…

关于Mysql 中 Row size too large (> 8126) 错误的解决和理解

提示&#xff1a;啰嗦一嘴 &#xff0c;数据库的任何操作和验证前&#xff0c;一定要记得先备份&#xff01;&#xff01;&#xff01;不会有错&#xff1b; 文章目录 问题发现一、问题导致的可能原因1、页大小2、行格式2.1 compact格式2.2 Redundant格式2.3 Dynamic格式2.4 Co…

vmmare虚拟机没有被分配ip地址问题;NAT模式下一直变化问题

打开任务管理器–>服务–>找到与VM和server相关的服务 发现NAT和DHCP服务被关闭了 尝试启动&#xff0c;报错 尝试一 虚拟网络编辑器点击还原默认设置 尝试二 可以了 ip变化 更改租用时长

性能测试常见的内存溢出问题: JVM 内存溢出如何调优?

针对java项目做性能测试的时候,很多同学都见过一个报错,就是OOM【Out Of MemoryError】;那出现这种报错就是项目发生了内存溢出的问题,这是比较严重的性能问题。所以,作为一个性能测试工程师,我们要能够分析JVM内存的问题以及理解其中的原理,才能更好的给JVM内存出现的性…

Wireless Network(百练,POJ)

题目链接: http://bailian.openjudge.cn/tm2019/F/ 2236 -- Wireless Network 题面描述: 思路: 这题开了10s&#xff0c;所以可以暴力点&#xff0c;每次修复一个点&#xff0c;就将该点相连的那些边建出来&#xff0c;总的时间复杂度为: O(nm)。关键在于如何判定两个点是否…

新能源汽车不安全?新能源汽车测试之方案篇——充电桩综合测试

背景 随着全球对气候变化和环境污染问题的日益加剧&#xff0c;新能源汽车作为一种环保、节能的交通工具备受关注。其发展背景主要源于对环境问题的关注以及对传统燃油汽车依赖的减少。新能源汽车的出现&#xff0c;带来了减少尾气排放、节能减排、保护环境等多方面的优点&…

【STM32】uc/OS-III多任务程序

目录 一、背景介绍二、UCOS-III简单介绍&#xff08;一&#xff09;源码&#xff08;二&#xff09;功能 三、实验&#xff08;一&#xff09;基于STM32CubeMX建立工程1、创建项目2、配置项目 &#xff08;二&#xff09;实现 四、总结五、参考 一、背景介绍 学习嵌入式实时操…

《精通ChatGPT:从入门到大师的Prompt指南》第7章:创意写作

第7章&#xff1a;创意写作 7.1 角色设定 角色设定是创意写作中最关键的环节之一。成功的角色设定能够让读者对故事产生共鸣&#xff0c;使故事更加生动有趣。角色不仅仅是情节发展的载体&#xff0c;更是读者情感的投射对象。因此&#xff0c;深入了解如何设定一个生动而有深…

【React】json-server

1.安装到开发环境 npm install json-server -D2.在根目录下下&#xff0c;新建db.json文件 {"list": [{"rpid": 3,"user": {"uid": "13258165","avatar": "http://toutiao.itheima.net/resources/images/9…

Go Module详解

文章目录 基本介绍相关环境变量Go Module的使用初始化项目&#xff08;go mod init&#xff09;管理依赖项&#xff08;go mod edit&#xff09;获取依赖项&#xff08;go mod download&#xff09;整理依赖项&#xff08;go mod tidy&#xff09;导入vendor目录&#xff08;go…

【DevOps】Ubuntu基本使用教程

目录 引言 Ubuntu简介 安装Ubuntu 准备工作 创建启动盘 安装过程 桌面环境 基本操作 定制桌面 文件管理 文件操作 文件权限 软件管理 安装软件 更新软件 系统设置 用户账户 网络设置 电源管理 命令行操作 常用命令 管理权限 安全与维护 系统更新 备份…

傲星一个在线工具箱源码附搭建教程

傲星工具箱源码是一款功能强大的在线工具箱程序&#xff0c;您可以通过安装扩展来增强其功能。同时&#xff0c;该程序还提供了插件模板的功能&#xff0c;让您可以将其作为网页导航使用。 1.PHP版本需不低于7.2.5。 2.Mysql版本需不低于5.7。 3.需要安装fileinfo扩展。 4.…

蓝牙音频解码芯片TD5163介绍,支持红外遥控—拓达半导体

蓝牙芯片TD5163A是一颗支持红外遥控、FM功能和IIS音频输出的蓝牙音频解码芯片&#xff0c;此颗芯片的亮点在于同时支持真立体声&单声道、TWS功能、PWM、音乐频谱和串口AT指令控制等功能&#xff0c;芯片在支持蓝牙无损音乐播放的同时&#xff0c;还支持简单明了的串口发送A…

idea有这个类却报红,无法用快捷键找到

idea有这个类却报红&#xff0c;无法用快捷键找到&#xff0c;但是项目启动却没有任何问题&#xff0c;严重影响到了开发效率&#xff0c;关idea 重新打开没有用。 找了一圈&#xff0c;办法如下&#xff1a; 1、点击左上角的 File—>Invalidate Caches/Restar 2、点击 In…

企业如何禁止员工电脑插u盘?禁用U盘的七个方法

禁止电脑插入U盘其实很简单&#xff0c;有多种方法&#xff0c;有适合个人的有适合企业的&#xff0c;今天一次性给你介绍清楚。 1.禁用USB端口&#xff1a; 通过组策略&#xff1a;在Windows域环境中&#xff0c;管理员可以使用组策略来禁用所有或部分USB端口。这可以通过编…

云手机的 Socks5 网络配置指南

当你在使用云手机之前&#xff0c;了解和正确配置 Socks5 网络代理是提升其性能和功能的关键一步&#xff1b; 直白点来说利用 Socks5 代理进行网络配置&#xff0c;可以带来诸多优势。 什么是socks5&#xff1f; Socks5 是一种重要的网络代理协议&#xff0c;主要功能在于它…

计算机哈佛架构、冯·诺依曼架构对比

哈佛架构和冯诺依曼架构是两种不同的计算机系统架构&#xff0c;它们在存储器组织方式上有着显著的区别。下面是它们的原理、优缺点的对比以及一些常见的 MCU 采用的架构&#xff1a; 哈佛架构&#xff1a; 原理&#xff1a;哈佛架构将指令存储器&#xff08;程序存储器&#x…

【后端】Java学习笔记(二周目-1)

环境 安装JDK8并配置环境变量 jvm核心类库jre jre开发工具jdk Java基础运行流程&#xff0c;代码从上到下&#xff0c;从左往右&#xff0c;只运行一次 桌面—>新建文件夹—>新建记事本—>打开编写代码 public class Hello{public static void main(String[] arg…