Nodelegatecall详解

本文介绍了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 NoDelegateCall {
    address immutable private originalAddress;

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

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

contract A is NoDelegateCall {
    uint256 public x;

    function increment() noDelegateCall public {
        x++;
    }
}

contract B {
    uint256 public x; // 这个变量不会递增

    function tryDelegatecall(address a) external {
        (bool ok, ) = a.delegatecall(
            abi.encodeWithSignature("increment()")
        );// 忽略 ok
    }
}

合约 B 对使用 nodelegatecall 修饰符的 A 进行 delegatecall。虽然对 B.tryDelegatecall 的交易不会回滚,因为低级调用的返回值被忽略,但存储变量 x 不会递增,因为在 delegatecall 的上下文中,交易会回滚。

nodelegatecall 的动机

Uniswap V2 是历史上被最频繁分叉的 DeFi 协议。Uniswap V2 协议面临来自逐行复制源代码并将新产品宣传为 Uniswap V2 替代品的项目的竞争,有时还通过提供空投来激励用户。

为了防止这种情况发生,Uniswap 团队将 Uniswap V3 授权给了 商业源代码许可证——任何人都可以复制代码,但在许可证导致的 2023 年 4 月过期之前,不能用于商业目的。

然而,如果有人想要“复制” Uniswap V3,他们可以简单地创建一个 克隆代理,并将其指向 Uniswap V3 的实例——然后将该智能合约宣传为 Uniswap V3 的替代品。nodelegatecall 修饰符防止了这一情况的发生。

最初发布于 5 月 11 日

  • 原文链接: rareskills.io/post/nodel...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
RareSkills
RareSkills
https://www.rareskills.io/