
(三)solidity代理调用
代理调用代码示例
1 | // Note:deploy this contract first |
delegatecall的原理
如上代码中演示:
- elegatecall 会执行目标合约(B)的代码,但使用调用合约(A)的存储空间
- 执行环境(包括 msg.sender 和 msg.value )保持不变
- 相当于把B合约的代码”借”到A合约的环境中执行
实际执行的过程是:
- 当A合约通过 delegatecall 调用B合约的 setVars 函数时
- 虽然执行的是B合约的代码逻辑,但所有状态变量的读写操作都发生在A合约的存储空间
- 因此B合约的状态变量不会改变,改变的只是A合约的状态变量
代理调用,存储布局必须要一致:
- 两个合约的状态变量声明顺序必须完全一致
- 这是因为 delegatecall 通过存储槽位置来访问变量,而不是变量名
代理调用的实际应用场景
A. 可升级合约模式(Upgradeable Contracts)
- 通过代理合约保存状态数据
- 逻辑合约可以升级替换而不影响存储数据
- 这是OpenZeppelin等标准库实现的可升级合约基础
B. 库合约调用(Library Calls)
- 复用库合约的代码逻辑
- 但保持调用合约的存储上下文
- 节省部署gas费用
C. 多签钱包实现
- 如Gnosis Safe等智能合约钱包
- 通过代理调用执行交易但保持钱包状态
D. 模块化设计
- 将不同功能拆分为独立合约
- 通过代理调用组合功能
- 类似插件系统架构
E. Gas优化
- 复用已部署合约的代码
- 避免重复部署相同逻辑
- 特别适合多个合约共享相同功能的情况
- Title: (三)solidity代理调用
- Author: viEcho
- Created at : 2025-05-02 16:53:05
- Updated at : 2025-05-11 16:33:28
- Link: https://viecho.github.io/2025/0502/solidity-proxy-call.html
- License: This work is licensed under CC BY-NC-SA 4.0.
Comments