Solidity之Modifier(还有那个酷酷的|Solidity之Modifier(还有那个酷酷的 _ )
pragma solidity ^0.4.11;
contract owned {
function owned() public { owner = msg.sender;
}
address owner;
// This contract only defines a modifier but does not use
// it: it will be used in derived contracts.
// The function body is inserted where the special symbol
// `_;
` in the definition of a modifier appears.
// This means that if the owner calls this function, the
// function is executed and otherwise, an exception is
// thrown.
定义了一个modifier但是没有使用,将在继承的合约中使用
函数体将在特殊符号 _ 出现的位置被插入
这里代表的是只有Owner调用这个方法时才会被执行,否则报错
modifier onlyOwner {
require(msg.sender == owner);
_;
}
}contract mortal is owned {
// This contract inherits the `onlyOwner` modifier from
// `owned` and applies it to the `close` function, which
// causes that calls to `close` only have an effect if
// they are made by the stored owner.
这个合约从owned继承了onlyOwner的modifier,应用在close方法上
这将造成只有Owner才能调用close方法
function close() public onlyOwner {
selfdestruct(owner);
}
}contract priced {
// Modifiers can receive arguments:
modifiers可以接受参数
modifier costs(uint price) {
if (msg.value >= price) {
_;
}
}
}contract Register is priced, owned {
mapping (address => bool) registeredAddresses;
uint price;
function Register(uint initialPrice) public { price = initialPrice;
}// It is important to also provide the
// `payable` keyword here, otherwise the function will
// automatically reject all Ether sent to it.
function register() public payable costs(price) {
registeredAddresses[msg.sender] = true;
}function changePrice(uint _price) public onlyOwner {
price = _price;
}
}contract Mutex {
bool locked;
modifier noReentrancy() {
require(!locked);
locked = true;
_;
locked = false;
}/// This function is protected by a mutex, which means that
/// reentrant calls from within `msg.sender.call` cannot call `f` again.
/// The `return 7` statement assigns 7 to the return value but still
/// executes the statement `locked = false` in the modifier.
function f() public noReentrancy returns (uint) {
require(msg.sender.call());
return 7;
}
}
【Solidity之Modifier(还有那个酷酷的|Solidity之Modifier(还有那个酷酷的 _ )】那么modifier在solidity中做的是什么工作呢?
答案就是给继承这个modifier修饰的function加上一个特定的约束,比如
modifier isOwner() {
if (msg.sender != owner) {
throw;
}
_;
// 继续执行余下的代码体(其实就是isOwner里的实际代码)
}doSomething() isOwner {
// 将会检查调用者是不是Owner// code
}
推荐阅读
- PMSJ寻平面设计师之现代(Hyundai)
- 太平之莲
- 闲杂“细雨”
- 七年之痒之后
- 深入理解Go之generate
- 由浅入深理解AOP
- 期刊|期刊 | 国内核心期刊之(北大核心)
- 生活随笔|好天气下的意外之喜
- 感恩之旅第75天
- python学习之|python学习之 实现QQ自动发送消息