Solidity:如何在函数修饰符中应用 OR 运算符?
Posted
技术标签:
【中文标题】Solidity:如何在函数修饰符中应用 OR 运算符?【英文标题】:Solidity: how to apply OR operator in function modifiers? 【发布时间】:2021-07-19 23:47:25 【问题描述】:我与一个私有枚举 state
签订了一个合同,该合同具有三个选项:CREATED
、VALID
和 TERMINATED
。该合约有一个函数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 运算符?的主要内容,如果未能解决你的问题,请参考以下文章
以太坊 solidity 函数修饰符总结 publicprivateinternalexternalviewpure的区别