Ethereum 固化改性剂

Ethereum 固化改性剂,ethereum,solidity,smartcontracts,modifiers,Ethereum,Solidity,Smartcontracts,Modifiers,所以,作为关于坚固性的bitdegree课程的一部分,我希望创建一个名为onlyOwner的修饰符,并将其指定给changePrice函数。我必须确保修饰符只允许在发送者的地址与所有者的地址匹配时执行函数。可以使用msg.sender获取发件人的地址 我试着输入这个来创建修改器,但它对我不起作用,我不知道为什么。如有任何帮助/推荐代码,将不胜感激 pragma solidity ^0.4.17; contract ModifiersTutorial { address public owne

所以,作为关于坚固性的bitdegree课程的一部分,我希望创建一个名为onlyOwner的修饰符,并将其指定给changePrice函数。我必须确保修饰符只允许在发送者的地址与所有者的地址匹配时执行函数。可以使用msg.sender获取发件人的地址

我试着输入这个来创建修改器,但它对我不起作用,我不知道为什么。如有任何帮助/推荐代码,将不胜感激

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) _;
}

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

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

谢谢你,我有犯语法错误的坏习惯。我花了数小时“修复”小语法错误。我很感激你的回复,兄弟!没有任何介绍或解释的代码块是不好的。你能提供一些背景吗?
modifier onlyOwner(){
  require(owner == msg.sender, "error-only-owner");
  _;
}