[聚合文章] Solidity之Modifier(还有那个酷酷的 _ )

.Net 1900-01-01 15 阅读
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;    }}

那么modifier在solidity中做的是什么工作呢?
答案就是给继承这个modifier修饰的function加上一个特定的约束,比如

  modifier isOwner() {     if (msg.sender != owner) {          throw;      }      _; // 继续执行余下的代码体(其实就是isOwner里的实际代码)  }    doSomething() isOwner {    // 将会检查调用者是不是Owner
                

注:本文内容来自互联网,旨在为开发者提供分享、交流的平台。如有涉及文章版权等事宜,请你联系站长进行处理。