Solidity 中的 modifier 是什么?

  • Alchemy
  • 发布于 2022-10-05 22:11
  • 阅读 12

本文介绍了Solidity中的modifier,它是一种特殊的函数,用于修改其他函数的行为,例如在函数执行前检查条件是否满足。

Brady Werkheiser 头像

Brady Werkheiser 审核

发布于 2022 年 10 月 4 日 阅读需 5 分钟


Solidity 是一种面向对象的高级语言,用于实现智能合约。在 学习 Solidity 时,你会遇到 修饰器(modifiers),这是一种特殊类型的函数,用于修改其他函数的行为

在本文中,我们将解释 Solidity 修饰器 的作用,介绍 修饰器 的类型,并向你展示如何使用它们。在本文结束时,你将能够识别 Solidity 修饰器 并理解如何使用它们。

Solidity 修饰器 有什么作用?

修饰器 是一种特殊的 Solidity 函数类型用于修改其他函数的行为。 例如,开发者可以使用 修饰器 来检查是否满足特定条件,然后再允许函数执行。

修饰器 类似于函数,因为它们可以接受参数并具有返回类型。修饰器 也可以链接在一起,这意味着你可以在单个函数上使用多个 修饰器

但是,修饰器 只能修改合约逻辑,并且它们 不能修改合约的存储,包括结构体(structs)。修饰器 减少了开发者必须编写的样板代码量,并且可以使你的 Solidity 代码更具可读性。

你可以在 Solidity 函数上使用多个 修饰器 吗?

是的,开发者可以在单个 Solidity 函数上使用多个 修饰器 多个 修饰器 用逗号分隔。关于使用多个 修饰器 需要注意的一点是,修饰器 的顺序很重要。列表中的第一个 修饰器 将首先执行,第二个 修饰器 将第二个应用,依此类推。

例如,如果你有一个 修饰器 检查用户是否已通过身份验证,以及另一个 修饰器 检查用户是否有权查看某个资源,那么应用这些 修饰器 的顺序将决定用户是否能够查看该资源。

Solidity 修饰器 有哪些不同的类型?

Solidity 修饰器 主要有四种类型:门卫检查(gate checks)、先决条件(prerequisites)、过滤器(filters)和重入攻击预防(reentrancy attack prevention)。

1. 门卫检查

“门卫检查” 是一个 修饰器,用于检查某个条件是否为真,然后再允许函数执行。

例如,你可能有一个允许用户从他们的帐户中提取资金的函数,但在函数执行之前,开发者可能想检查用户的帐户中是否有足够的资金来进行提款。该检查被认为是门卫检查 修饰器

门卫检查的另一个例子是,在允许用户查看某个资源之前,检查用户是否已通过身份验证的函数。

2. 先决条件

“先决条件” 是一个 修饰器,用于设置函数执行的环境,而不是检查某个条件是否为真。

例如,Solidity 开发者可能会使用一个函数,该函数需要随之发送一定数量的以太币才能执行。在这种情况下,先决条件将是设置以太币余额的函数。

3. 过滤器

“过滤器” 是一个 修饰器,用于检查某个条件是否为真,如果是,则允许函数执行。如果条件不为真,则函数将不会执行。

与门卫检查不同,即使条件为真,门卫检查也不会自动允许函数执行,而过滤器会在条件为真时允许函数执行。

4. 预防重入攻击

重入攻击 是一种攻击类型,其中恶意行为者尝试通过递归调用多次执行函数,以利用它。

例如,假设你有一个允许用户从他们的帐户中取款的函数。重入攻击者可能会尝试多次调用该函数以提取比他们实际拥有的更多的钱。

为了防止重入攻击,你可以使用一个 修饰器 来检查该函数是否正在被递归调用。如果是,则该函数将不会执行。

require 和 Solidity 修饰器 之间有什么关系?

Require 通常与 修饰器 互换使用,因为它们都允许你 [检查某个条件是否为真](https://www.alchemy.com/university/courses/solidity?a=313ac76819) ,然后再允许函数执行。** 如果指定的条件不为真,则编译器将抛出一个错误。

例如,以下语句使用 require 关键字,以便只有所有者才能与函数交互:

require(msg.sender == owner)

使用 修饰器 可以实现完全相同的结果,如下所示:

modifier onlyOwner() {
    require(msg.sender == owner);
    _;
}

require 和 Solidity 修饰器 之间存在一些重要的区别:

  1. 修饰器 可用于设置函数执行的环境(如先决条件的情况)

  2. Require 只能用于检查某个条件是否为真

  3. 修饰器 可以被覆盖

  4. Require 无法被覆盖

与 Vyper 相比,Solidity 如何处理 修饰器

Vyper 是一种用于以太坊智能合约开发的 pythonic 语言,它做出某些权衡以提高安全性,包括 不使用 修饰器** 相反,开发者应该在函数中使用内联检查和断言,并且如果修改智能合约,再次将更改显式地作为函数的一部分。

Vyper 选择删除使用 修饰器 的能力提高了智能合约的可审计性,因为读者不必在脑海中将 修饰器 放在函数周围以查看它将做什么。

什么是 修饰器 覆盖?

关键字 "virtual" 可用于指示 修饰器 可以在派生合约中被覆盖。 例如,假设你有一个带有 修饰器 "myModifier" 的合约 "Base Contract"。你还有一个从 "Base Contract" 继承的合约 "Derived Contract"。

如果 "Base Contract" 被标记为 "virtual",那么它可以在派生合约中被覆盖。这通常用在库的上下文中,合约允许自定义。

修饰器 如何与继承一起使用?

继承让你扩展合约的属性和特性,并且在 修饰器 的上下文中,继承让你添加新的 修饰器 或覆盖现有的 修饰器 这可以通过关键字 virtual 来完成,这在上一节中已经讨论过。

下面的简单示例演示了继承和 修饰器 如何协同工作:

contract A {
modifier X virtual {
}
}
contract B is A {
modifier X override {
}
}

在此示例中,合约 B 继承自合约 A。两个合约都有一个名为 "X" 的 修饰器。但是,在合约 B 中,修饰器 被标记为 "override",这表明它覆盖了合约 A 中的 修饰器

如何在 Solidity 中使用 修饰器

使用 修饰器 时,你首先需要在合约中定义 修饰器 函数。修饰器 使用一个特殊符号 “_;”,函数体只有在满足 修饰器 的条件时才会被插入。

下面的合约演示了如何使用 修饰器

contract Owner {
modifier onlyOwner {
    require(msg.sender == owner);
    _;
}
modifier costs(uint price) {
    if (msg.value >= price) {
        _;
    }
}
}

在上面的示例中,合约有两个 修饰器:"onlyOwner" 和 "costs"。

第一个 修饰器 检查 msg.sender 是否是合约的所有者,第二个 修饰器 检查 msg.value 是否大于或等于某个价格。

这两个 修饰器 都可以用于合约中的任何函数。

继续学习 Solidity 修饰器

修饰器 是用于修改其他函数行为的函数。通过使用 修饰器,你可以减少必须编写的样板代码量,并且可以使你的 Solidity 代码更具可读性。

继续了解 Solidity 修饰器 以及如何成为 Solidity 开发者,请在 Alchemy University 的为期 7 周的以太坊开发者训练营中锁定你的位置。最初由 ChainShot 团队创建,这个免费的 Solidity 速成课程 是学习 Solidity 的最佳方式。如果开发者通常不熟悉开发,那么 Alchemy University 的 3 周 JavaScript 速成班 是开始以太坊训练营之前的一个很好的先决条件。

Supercharged | Alchemy | Substack

注册 Alchemy University 并开始免费学习 Solidity 开发 立即注册

📚 目录


  • Solidity 修饰器 有什么作用?
  • Solidity 修饰器 有哪些不同的类型?
  • require 和 Solidity 修饰器 之间有什么关系?
  • 与 Vyper 相比,Solidity 如何处理 修饰器
  • 如何在 Solidity 中使用 修饰器
  • 继续学习 Solidity 修饰器

分享:

概述卡片背景图形

相关概述

精选内容卡片叠加层\ \ 学习 Solidity\ \ Solidity 中的 selfdestruct 是什么?\ \ 它是什么,它是如何工作的,以及如何开始 精选内容卡片叠加层\ \ 学习 Solidity\ \ 学习 Solidity 开发的 7 门最佳课程(2025)\ \ 探索学习 Solidity 开发的最佳免费和付费课程 精选内容卡片叠加层\ \ 学习 Solidity\ \ 什么是 Solidity 数组?\ \ 你的 Solidity 数组入门指南——函数、声明和故障排除

桌面部分背景图片

构建区块链魔法

Alchemy 将最强大的 web3 开发者产品和工具与资源、社区和传奇支持相结合。

获取你的 API 密钥

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

0 条评论

请先 登录 后评论
Alchemy
Alchemy
江湖只有他的大名,没有他的介绍。