Solidity:如何在函数修饰符中应用 OR 运算符?

Posted

技术标签:

【中文标题】Solidity:如何在函数修饰符中应用 OR 运算符?【英文标题】:Solidity: how to apply OR operator in function modifiers? 【发布时间】:2021-07-19 23:47:25 【问题描述】:

我与一个私有枚举 state 签订了一个合同,该合同具有三个选项:CREATEDVALIDTERMINATED。该合约有一个函数withdrawn只能被合约创建者调用,还有一个函数terminatine只能被合约创建时设置的第三方调用。这两个函数都有一个修饰符requireState(State.VALID),所以它们只能在合约处于VALID 状态后调用。

问题是我想配置 withdrawn 函数,以便在 state 设置为 VALID OR TERMINATED 时调用它。我该怎么做?

我的modifier如下图:

enum State  CREATED, VALID, TERMINATED 
State state;

modifier requireState(State _state) 
   require(state == _state);
   _;

我正在使用 Solidity 0.8.1。

【问题讨论】:

最简单的解决方案:我建议不要使用modifier,而是在你的函数的开头有这个条件。 【参考方案1】:

一个函数的所有修饰符都需要在这个函数执行之前通过。所以他们总是表现得好像他们是由AND运营商连接的一样。

您可以创建一个接受多个值并对其执行OR 操作的新修饰符。

但是,您需要使用固定数量的参数或固定长度的数组,因为 Solidity 目前不允许动态长度数组的单行声明。

示例:[State.VALID, State.TERMINATED] 是一个定长数组的声明,因此它与State[] 动态长度定义不匹配。

modifier requireAnyOfStates(State[2] memory _states) 
    require(_states[0] == state || _states[1] == state);
    _;

    
function foo() external requireAnyOfStates([State.VALID, State.TERMINATED]) 

但在这种情况下,更简单的方法是在函数中使用 require 语句而不是修饰符。

function foo() external 
    require(state == State.VALID || state == State.TERMINATED);

【讨论】:

以上是关于Solidity:如何在函数修饰符中应用 OR 运算符?的主要内容,如果未能解决你的问题,请参考以下文章

在最终修饰符中接收错误

Smarty:在修饰符中组合两个变量

Solidity函数修饰符

以太坊 solidity 函数修饰符总结 publicprivateinternalexternalviewpure的区别

Solidity 基础知识之访问修饰符

条件“if”修饰符中的 Ruby 变量赋值