Delegatecall是以太坊虚拟机中的一种底层调用方式,经常出现在代理合约、模块化合约和可升级合约系统中。它与普通的合约调用存在一个重要区别:被调用代码可以在调用方的执行上下文中运行。
普通Call调用通常进入目标合约自己的执行环境,目标合约使用自己的存储空间处理状态变化。而Delegatecall虽然执行的是另一个地址上的代码,却保留调用方的上下文,包括调用方的存储、余额和地址等环境信息。
这种机制为合约复用提供了便利。例如,代理合约可以通过Delegatecall执行逻辑合约中的代码,使用户始终与代理地址交互,而业务逻辑可以放在另一个合约中维护。
但Delegatecall也带来了特殊的安全要求。由于代码执行时访问的是调用方存储,如果两个合约的存储布局不一致,可能导致变量被错误读取或覆盖。
更严重的情况是,代理合约如果错误地允许用户控制Delegatecall目标地址,攻击者可能让代理合约执行恶意代码,并直接修改代理合约中的关键状态。
因此,在设计Delegatecall系统时,需要严格管理目标地址、存储布局和调用权限。对于可升级合约,还要确保新旧实现合约的存储结构兼容,不能随意调整关键变量的位置和类型。
普通用户虽然不会直接编写Delegatecall,但在使用代理合约部署的DeFi协议时,实际上可能一直与代理地址进行交互。理解这一机制,可以帮助用户更好地认识合约升级、实现地址和代理地址之间的关系。

