稳固性修饰符

Modifiers on solidity

因此,作为关于 solidity 的 bitdegree 课程的一部分,我希望创建一个名为 onlyOwner 的修饰符并将其分配给 changePrice 函数。我必须确保仅当发件人的地址与所有者的地址匹配时,修饰符才允许执行函数。可以使用msg.sender.

获取发件人地址

我试过输入这个来创建修改器,但它对我不起作用,我不确定为什么。任何 help/recommended 代码将不胜感激!

pragma solidity ^0.4.17;

contract ModifiersTutorial {

address public owner;
uint256 public price = 0;
address public sender=msg.sender;

//
modifier onlyOwner(sender){
if (owner==sender);
}
//

// Use your modifier on the function below
function changePrice(uint256 _price) public onlyOwner {
    price = _price;
}

function ModifiersTutorial () {
    owner = msg.sender; // msg.sender in constructor equals to the address that created the contract
}

}

您的修饰符代码不正确。您需要一个下划线才能继续。

modifier onlyOwner(sender){
  if (owner==sender) _; // Note the underscore
}

此外,出于安全原因,您真的应该只使用 msg.sender 而不是传入它。

modifier onlyOwner() {
  if (owner == msg.sender) _;
}
pragma solidity ^0.4.17;

contract ModifiersTutorial {

    address public owner;
    uint256 public price = 0;

    modifier onlyOwner(){
    if( owner == msg.sender ) _;
    }

    function changePrice(uint256 _price) public onlyOwner{
        price = _price;
    }

    function ModifiersTutorial () {
        owner = msg.sender; 
    }
}

不确定它是否与给定的规范冲突,但另一种做法是 require(owner == msg.sender) 而不是使用 if 语句——前者告诉用户发生了什么,而后者只是默默地失败了。这就是它的样子:

modifier onlyOwner(){
  require(owner == msg.sender, "error-only-owner");
  _;
}