call 与 delegatecall - all-in

news/2025/11/22 20:10:02/文章来源:https://www.cnblogs.com/songlee/p/19258512

一、为什么要用底层调用

我们知道,在一个合约中调用另一个合约的接口,通常使用contractName(address).functionName() 来进行调用,比如:

contract MyContract {function add(address _counter) public {// 调用 Counter 合约的方法Counter(_counter).increment();}
}

但是,有时我们在编写合约时,还不知道要调用的目标合约的接口,甚至是目标合约还没有创建。这时就无法用上面的方法进行调用。

这个问题该如何解决呢?

你也许知道很多编程语言(如Java和Go)有反射的概念,反射允许在运行时动态地调用函数或方法。地址的底层调用和反射非常类似。

使用address底层调用功能,是在运行时动态地决定调用目标合约和函数, 因此在编译时,可以不知道具体要调用的函数或方法。

二、底层调用

address类型还有3个底层的成员函数:

<address>.call(bytes memory abiEncodeData) returns (bool, bytes memory)<address>.delegatecall(bytes memory abiEncodeData) returns (bool, bytes memory)<address>.staticcall(bytes memory abiEncodeData) returns (bool, bytes memory)
  • 其中,call 是常规调用,delegatecall 为委托调用,staticcall 是静态调用(不修改合约状态, 相当于调用 view 方法)。

这三个函数都可以用于与目标合约<address>交互,三个函数均接受 abi 编码数据作为参数(abiEncodeData)来调用对应的函数。

这里我们使用底层方法调用一下《手把手教你部署智能合约》中的合约:

contract CallTest {function makeCallGet(address _counter) public view returns (uint) {// staticcall调用bytes memory payload = abi.encodeWithSignature("get()");(bool success, bytes memory returnData) = address(_counter).staticcall(payload);// 判断一下require(success, "Call to target contract failed.");// 将returnData解析成指定类型(e.g. uint)(uint res) = abi.decode(returnData, (uint));return res;}function makeCallCount(address _counter) public {// call调用bytes memory payload = abi.encodeWithSignature("count()");(bool success, ) = address(_counter).call(payload);// 判断一下require(success, "Call to target contract failed.");}
}// https://testnet.routescan.io/address/0xcF10C1b7DA166987a1D9bB81C072C339cb7205fd

使用底层方法调用合约函数时, 当被调用的函数发生异常时(revert),异常不会冒泡到调用者(即不会回退), 而是返回布尔值 false。因此在使用所有这些低级函数时,一定要记得检查返回值

三、call 与 delegatecall

常规调用 call 与 委托调用 delegatecall 的区别是什么呢?

image

  1. 执行上下文:当使用call函数时,被调用的函数在目标合约的上下文中执行,这意味着它有自己的thismsg.sender。而delegatecall函数则在调用合约(当前合约)的上下文中执行被调用的函数。—— 相当于将函数代码 pull 到当前合约中执行

  2. 状态存储call函数在执行时不会改变调用合约的状态,它只会改变被调用合约的状态。而delegatecall函数则可以改变调用合约的状态,因为它在调用合约的上下文中执行。

  3. 用途call函数通常用于调用其他合约的函数,而delegatecall函数允许一个合约借用另一个合约的代码,在自己的上下文中执行,常用于实现可升级合约和库函数。

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

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

相关文章

20232417 2025-2026-1 《网络与系统攻防技术》实验六实验报告

1.实验内容 1.1实验要求 本实践目标是掌握metasploit的用法,通过实战演练理解常见漏洞的利用原理和渗透测试流程。 1.2学习内容 2.实验过程 2.1前期渗透 2.1.1主机发现 在靶机中输入ipconfig得到靶机的IP地址。其IP地址…

Trick——字符串

Part1 问题:两个等长字符串的不同后缀与另两个字符串的不同后缀分别匹配。 问题有些抽象,举个例子: aaaaaaabbbc aaaaaaddcdbsdscabbbc sdscddcdb这样的两组字符串就存在匹配。 可以用字符串\(hash\)解决。 设字符串…

2022年春季研究资助计划征集技术提案

某中心研究奖项计划发布2022年春季提案征集,涵盖AI信息安全、公平AI、广告技术、社区机器学习等五大技术领域,提供资金和云计算资源支持学术研究。某中心研究奖项发布2022年春季提案征集 某中心研究奖项(ARA)宣布启…

BLOG-1-电梯调度算法

一、前言 对三次题目总结: 三次题目难度逐渐递增。题目数量适当,规定时间内足已完成。每一次题目集前面小题像是练手最后一题难度飙升是真正考验学习成果的时候。第一次题目集让人眼前一亮以前从没做过类似的题目,光…

线圈公司质量排名,线圈生产厂家性价比推荐,变压器公司行业排名,变压器生产厂家客户推荐。滤波器公司技术排名,开关变压器公司性价比榜单

线圈公司质量排名,线圈生产厂家性价比推荐,变压器公司行业排名,变压器生产厂家客户推荐。滤波器公司技术排名,开关变压器公司性价比榜单线圈公司质量排名,线圈生产厂家性价比推荐,变压器公司行业排名,变压器生产…

IDA之修复结构体

修复结构体有两种方法 一是C语言式修复(麻烦) 二是直接设置(更简单,更推荐) 首先学会设置IDB快照(其实本人很少使用) IDB快照:.idb文件,可快速帮我们恢复某个时间点的快照,可以防止错误太多View - Database sn…

2025年专业集成房屋安装公司排名,集成活动房十大靠谱厂家推荐榜,石家庄集成房屋公司十大排行:义广达彩钢口碑推荐榜,河北集成活动房厂家十大推荐榜

2025年专业集成房屋安装公司排名,集成活动房十大靠谱厂家推荐榜,石家庄集成房屋公司十大排行:义广达彩钢口碑推荐榜,河北集成活动房厂家十大推荐榜2025年专业集成房屋安装公司排名,集成活动房十大靠谱厂家推荐榜,…

真的好怪题解:P14314 [Aboi Round 2] Oneshot

来一篇真的好怪的题解。 正文 首先有一个很低级的做法,就是每次询问直接拉出来 \(\frac np\) 个数,然后排好序,用另外 \(\frac nq\) 个数在那上面二分就结束了。 这样做的复杂度是 \(\mathcal{O}(nm\log n)\)。 然后…

ElasticSearch索引库操作 - 努力-

ElasticSearch索引库操作一、ElasticSearch基础概念 1.1 文档和字段:ElasticSearch是面向文档(Document)存储的,可以是数据库中的一条商品数据,一个订单信息。文档数据会被序列化为json格式后存储在ElasticSearch…

2025年集成房屋设计公司十大排名,岗亭加工厂家十大排行榜,专业岗亭定制工厂怎么选?彩钢移动厕所厂家推荐。

2025年集成房屋设计公司十大排名,岗亭加工厂家十大排行榜,专业岗亭定制工厂怎么选?彩钢移动厕所厂家推荐。2025年集成房屋设计公司十大排名,岗亭加工厂家十大排行榜,专业岗亭定制工厂怎么选?彩钢移动厕所厂家推荐…

洛谷 P5658 [CSP-S 2019] 括号树 题解

题目大意 给定一棵树,每个节点有一个括号。对于每个节点 \(i\),定义 \(s_i\) 为从根节点到 \(i\) 的路径上所有括号按顺序组成的字符串。求每个 \(s_i\) 中互不相同的合法括号子串的个数 \(k_i\)。 思路 首先,\(k_i…

礼盒拖车公司推荐,礼盒拖车定制公司排行榜,礼盒拖车厂家口碑推荐,礼盒拖车生产厂家-航利通达

礼盒拖车公司推荐,礼盒拖车定制公司排行榜,礼盒拖车厂家口碑推荐,礼盒拖车生产厂家-航利通达礼盒拖车公司推荐,礼盒拖车定制公司排行榜,礼盒拖车厂家口碑推荐,礼盒拖车生产厂家-航利通达在当下这个视觉至上的时代…

360笔试

看到 PC 客户端对 ACMer 有加分项,就投了下这个。 \(2\) 个小时,前面有 \(40\) 道选择题,涉及内容包含数学、数据结构、操作系统、网络安全,还有一些关于 C++ 的类什么的和一些简单算法的原理什么的,不过前面那些…

图像的颜色模式

图像的颜色模式0.1 灰度模式 也就是灰度图(黑白照片),每个像素只有明暗变化,用0~255共256个亮度级来表示,用8个bit来表示,所以每个像素信息用8bit储存. 0.2 位图模式(二值图像) 即只有纯黑和纯白两种亮度,没有渐变…

.NET+AI | MEAI | Function Caling 实操(4)

.NET+AI | MEAI | Function Caling 实操 TL;DR✅ 注册你的方法为工具(Tool) ✅ 启用中间件 UseFunctionInvocation() ✅ 设置 ChatOptions.ToolMode = Auto ✅ 发起对话,MEAI 自动完成:请求 → 调用 → 回填 → 作…

高频变压器公司口碑榜单,电感公司技术排名,电感厂家交付效率排名,磁性元器件公司客户推荐,电感器公司产能排名,线圈公司行业排名-汉翔电子

高频变压器公司口碑榜单,电感公司技术排名,电感厂家交付效率排名,磁性元器件公司客户推荐,电感器公司产能排名,线圈公司行业排名-汉翔电子高频变压器公司口碑榜单,电感公司技术排名,电感厂家交付效率排名,磁性…

noip13

11.2211.22 颓死了,不想改。 t1 场切。 观察大样例大胆猜测答案很小(实际上答案不超过6,伏笔)。 然后手模inf组数据即可发现结论。 将每个数在这几步中每次选几个看成 \(x\) 进制数 (\(x=a_{i+1}/a_i\)) ,而 \(x^…

高频变压器厂家,电感生产厂家,磁性元器件源头厂家推荐,滤波器生产厂家有哪些,高频变压器公司排行榜,高频变压器公司交付效率排名,高频变压器公司小型化解决方案

高频变压器厂家,电感生产厂家,磁性元器件源头厂家推荐,滤波器生产厂家有哪些,高频变压器公司排行榜,高频变压器公司交付效率排名,高频变压器公司小型化解决方案高频变压器厂家,电感生产厂家,磁性元器件源头厂家…

Java中HashMap的核心原理与使用注意事项

大家好,我是一名正在实习的Java开发。最近在参与项目迭代时,遇到了一个很棘手的问题:线上环境有个接口偶尔会出现响应超时,排查了半天才发现,原来是并发场景下误用了HashMap导致的哈希冲突恶化,查询性能直接从O(…

MinIo介绍 - 努力-

MinIo介绍MinIo介绍,文件存储一、 MinIO介绍MinIO作为文件存储的软件,这是一个基于Go编写的开源对象存储套件,虽然轻量,却拥有着不错的性能。  MinIO非常适合于存储大容量非结构化的数据,例如图片、视频、日志文…