ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

solidity学习(四)---解释modifier修饰器

2021-07-01 19:04:46  阅读:261  来源: 互联网

标签:function require solidity --- msg price modifier public


我们可以将modifier理解为一个方法,对function的函数进行权限管理+代码复用。_;里面就是复用的代码,就是function函数里面的。打个比喻,就是我说我喜欢男孩子,function boy() public{},但是我modifier boy{require(boy=handsome); _;}。如果按照这个顺序,那我在人群中先定义我要找的是男孩子,后面再modifier;但是一般情况下,modifier会放在前面,所以先找帅哥,再执行_;也就是boy()。

例子1:

pragma solidity ^0.4.11;

contract owned {
    function owned() public { 
        owner = msg.sender; 
        } 
        address owner; 
    // 这个合约只定义一个修饰器,但并未使用: 它将会在派生合约中用到。 
    // 修饰器所修饰的函数体会被插入到特殊符号 _; 的位置。 
    // 这意味着如果是 owner 调用这个函数,则函数会被执行,否则会抛出异常。 
    //modifier(修饰器),我们可以理解为代码复用,在智能合约中一般用于“权限判断”。比如一个合约中,不同用户的权限不同,onlyowner()本来为public权限,拥有者可以是发送者,但是modifier后,发送者必须是拥有者,就不能代转了
    modifier onlyOwner { 
        require(msg.sender == owner); 
        _; //先运行require里面的函数,如果为true则继续运行下面的onlyOwner(),但是这里没有这个函数。。。这憨憨例子。。
        }
}

contract mortal is owned { 
    // 这个合约从 `owned` 继承了 `onlyOwner` 修饰符,并将其应用于 `close` 函数, 
    // 只有在合约里保存的 owner 调用 `close` 函数,才会生效。 
    function close() public onlyOwner {
        selfdestruct(owner); 
        }
}

contract priced { 
    // 修改器可以接收参数: 
    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;
        } 
    // 在这里也使用关键字 `payable` 非常重要,否则函数会自动拒绝所有发送给它的以太币。 
    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;
        } // 这个函数受互斥量保护,这意味着 `msg.sender.call` 中的重入调用不能再次调用  `f`。 
         // `return 7` 语句指定返回值为 7,但修改器中的语句 `locked = false` 仍会执行。 
         function f() public noReentrancy returns (uint) { 
             require(msg.sender.call()); 
             return 7; 
             }
}

https://bbs.huaweicloud.com/blogs/223213

 

例子2:

pragma solidity ^0.4.22;

contract Purchase {
    address public seller;

    modifier onlySeller() { // 修饰器,这时即将调用onlyseller(),但是先require
        require(
            msg.sender == seller,
            "Only seller can call this."
        );
        _;//只运行满足require的
    }

    function abort() public onlySeller { // Modifier usage
        //
    }
}

 

标签:function,require,solidity,---,msg,price,modifier,public
来源: https://www.cnblogs.com/TEAM0N/p/14960218.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有