Nodelegatecall详解

RareSkills 发布于 2024-05-13 阅读 2876

本文介绍了Solidity中的nodelegatecall修饰符,用于防止合约使用delegatecall来调用函数,并通过代码示例详细展示了其实现和测试方法,同时讨论了Uniswap V3使用该技术的动机。

nodelegatecall 修饰符防止 delegatecalls 被发送到合约。我们将首先展示如何实现这一机制,然后讨论为什么有人可能会这样做。

如下,我们简化了最初由 Uniswap V3 的 noDelegateCall 创建的 nodelegatecall 修饰符:

contract NoDelegateCallExample {
    address immutable private originalAddress;

    constructor() {
        originalAddress = address(this);
    }

    modifier noDelegateCall() {
        require(address(this) == originalAddress, "no delegate call");
        _;
    }
}

address(this) 会根据执行环境的不同而变化,但 originalAddress 将始终是使用 nodelegatecall 的代码的已部署地址。因此,如果另一个合约对使用 noDelegateCall 修饰符的函数进行 delegatecall,则 address(this) 将不等于 originalAddress,交易将回滚。原始地址是一个不可变变量非常重要,否则发出 delegatecall 的合约可能会策略性地将使用 NoDelegateCall 的合约地址放在该槽位中,从而绕过 require 语句。

测试 nodelegatecall

下面我们提供测试 nodelegatecall 的代码。

contract NoDelegateCal...

剩余50%的内容订阅专栏后可查看

该文章收录于
代理模式与 Delegatecall 规范手册
36 订阅 19 篇内容

0 条评论