当前位置: 首页 > news >正文

Solidity 高级合约交互 3| 委托调用 (Delegatecall)

在 Solidity 中,委托调用(delegatecall是一种特殊的低级函数调用方式,它与call类似,但有一个关键区别:delegatecall**在目标合约的代码环境下执行,但使用当前合约的存储、msg.sender** 和msg.value。简单来说,它允许一个合约 “借用” 另一个合约的函数逻辑,但所有状态变化都发送在调用者自己的存储中。

1. 基本语法

(bool success, bytes memory data) = address(logicContract).delegatecall( abi.encodeWithSignature("functionName(args)", args) );
  • logicContract:包含要执行逻辑的合约地址。
  • 返回值:success表示调用是否成功,data是函数返回的原始数据。
  • 同样可以使用{gas: ...}{value: ...}选项,但value只能在被调用的函数是payable时使用(因为delegatecall保留当前交易的msg.value)。

2.delegatecallcall的核心区别

特性calldelegatecall
代码执行目标合约的代码目标合约的代码
存储读写目标合约的存储当前合约的存储
msg.sender调用者(即当前合约)原始交易发送者
msg.value当前调用发送的 ether原始交易的 ether 数量
应用场景普通跨合约交互、发送 ether实现可升级代理合约、库函数

3. 工作原理示例

逻辑合约Logic

// SPDX-License-Identifier: MIT pragma solidity 0.8.7; contract Logic { uint public x; address public sender; function setX(uint _x) external payable { x = _x; sender = msg.sender; // 记录调用者 } }

代理合约Proxy使用delegatecall

contract Proxy { uint public x; // 与 Logic 中相同的存储布局 address public sender; address public logic; // 逻辑合约地址 constructor(address _logic) { logic = _logic; } function setX(uint _x) external payable { // 通过 delegatecall 执行 Logic 的 setX (bool success, ) = logic.delegatecall( abi.encodeWithSignature("setX(uint256)", _x) ); require(success, "delegatecall failed"); } }

4. 总结

  • delegatecall允许合约在自身上下文中执行外部代码,是实现可升级合约和库的核心工具。
  • 使用时必须严格管理存储布局,并理解msg.sendermsg.value的特殊性。
  • 大多数开发者应优先使用经过审计的代理库(如 OpenZeppelin 的Proxy系列),而不是手动实现delegatecall,以避免细微的安全漏洞。
http://www.jsqmd.com/news/449872/

相关文章:

  • 苹果发布iPhone 17e和搭载M4芯片的新iPad Air
  • 唯品会购物额度合规回收全攻略(2026全方面总结) - 容易提小溪
  • 计算机毕业设计之jsp飞机订票系统
  • WordPress 文章如何更改作者
  • 时间序列趋势检验方法
  • 降重压力小了!全网爆红的降AI率软件 —— 千笔·降AIGC助手
  • C++学习笔记:类和对象
  • 打造直线电机12槽10极Maxwell模型:参数化之路
  • 毕业论文神器 10个AI论文写作软件测评:本科生高效写作与格式规范全攻略
  • 2026年天津继承律师电话查询推荐:高效解决遗产纠纷指南 - 品牌推荐
  • 意识正遭围攻:迈克尔·波伦谈聊天机器人、社交媒体与精神自由
  • SAP发布Cloud ERP Private 2025 FPS01:AI驱动、数据就绪与全球核心能力全面升级
  • 效率直接起飞 8个降AIGC软件测评:专科生降AI率必备神器
  • 风光储结合并网仿真模型 光伏:拓扑采用Boost电路、应用最大功率跟踪(MPPT)算法实现光伏...
  • 永辉超市购物卡闲置别浪费,教你快速变现! - 团团收购物卡回收
  • 小白初学递归
  • 1111 (12)
  • 收藏!AI大模型训练师详解(小白/程序员必看,月薪3w+职业新机遇)
  • RHEL - 笔记本合盖不休眠
  • php方案 PHP的消息幂等消费
  • 基于AMT双参数动力性换挡规律的燃油车自动变速模型研究——采用MATLAB m文件编写,实现直接运行
  • 基于主从博弈理论的共享储能与综合能源微网优化复现之旅
  • AI泡沫幸存者:从烧钱到盈利的残酷转型——软件测试从业者的专业视角
  • 工厂注意!以后SLCP审核机构不能随便选了:高分才能上榜,低分直接消失!
  • 台达DVP 16ES2与DT3系列温控器通讯程序TDES-1
  • 深入剖析AI 大语言模型 LLM
  • 深度盘点:AI行业支持远程办公的十大热门岗位及招聘渠道一览
  • 助人为乐之客观分析:女性如何选择才不吃亏?——技术岗 vs 管理岗
  • 【无标题】C语言中的循环与分支语句
  • 摆脱论文困扰!千笔,专科生专属AI写作神器