Модификаторы по солидности
Итак, как часть курса 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
}
}
2 ответа
Ваш код модификатора неверен. Вам нужно подчеркнуть, чтобы продолжить.
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");
_;
}
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;
}
}