Solidity:如何在函数修饰符中应用 OR 运算符?
Solidity: how to apply OR operator in function modifiers?
我与私有枚举 state
签订了合同,该合同具有三个选项:CREATED
、VALID
和 TERMINATED
。该合约有一个只能由合约创建者调用的函数withdrawn
,以及一个只能由合约创建时设置的第三方调用的函数terminatine
。这两个函数都有一个修饰符 requireState(State.VALID)
因此它们只能在合约处于 VALID
状态后调用。
问题是我想配置 withdrawn
函数,以便在 state
设置为 VALID
OR[=33= 时可以调用它] TERMINATED
。我该怎么做?
我的modifier
如下图:
enum State { CREATED, VALID, TERMINATED }
State state;
modifier requireState(State _state) {
require(state == _state);
_;
}
我正在使用 Solidity 0.8.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);
}
我与私有枚举 state
签订了合同,该合同具有三个选项:CREATED
、VALID
和 TERMINATED
。该合约有一个只能由合约创建者调用的函数withdrawn
,以及一个只能由合约创建时设置的第三方调用的函数terminatine
。这两个函数都有一个修饰符 requireState(State.VALID)
因此它们只能在合约处于 VALID
状态后调用。
问题是我想配置 withdrawn
函数,以便在 state
设置为 VALID
OR[=33= 时可以调用它] TERMINATED
。我该怎么做?
我的modifier
如下图:
enum State { CREATED, VALID, TERMINATED }
State state;
modifier requireState(State _state) {
require(state == _state);
_;
}
我正在使用 Solidity 0.8.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);
}