はじめに
solidity の modifier に引数ってどうやって渡すかちょっと迷ったのでメモ
結論
modifier を使う際に渡せる引数は、関数への引数や、そのコントラクトの storage 変数など、modifier を使用する関数の中で参照可能な全ての値が modifier への引数として使える
Arbitrary expressions are allowed for modifier arguments and in this context, all symbols visible from the function are visible in the modifier. Symbols introduced in the modifier are not visible in the function (as they might change by overriding).
以下簡単な利用例
- isItemOwner modifier は address を引数として取る
- checkPrice に渡される id と storage 変数の items から address を計算して modifier への引数として利用できる
pragma solidity ^0.4.19;
contract ItemLdeger {
address public owner;
mapping (address => uint) public balances;
mapping (uint => Item) public items;
struct Item {
uint id;
address owner;
uint price;
}
// 初期化
function ItemLdeger() public {
uint id = 1;
items[id] = Item({ id:id, owner: msg.sender, price: 100 });
owner = msg.sender;
}
// 引数のある modifier
modifier isItemOwner(address _owner) {
require(msg.sender == _owner);
_;
}
// modifier を使う関数
function checkPrice(uint id)
public
view
isItemOwner(items[id].owner) // modifier に渡す引数は、function への引数と storage 変数を参照して作れる
returns (uint) {
return items[id].price;
}
}