Содержание

Модификаторы функций в Solidity

Модификаторы используются, чтобы упростить изменение поведения функций. Например, они могут автоматически проверять состояние до выполнения функции. Модификаторы — это наследуемые свойства контрактов, и они могут быть переопределены в контрактах-наследниках.

pragma solidity ^0.4.11;

contract owned {
    function owned() public { owner = msg.sender; }
    address owner;

    // Этот контракт просто объявляет модификатор, но 
    // не использует его: он будет использован в
    // контрактах-наследниках. Тело функции будет вставлено
    // вместо специального символа `_;`.
    // Данный модификатор означает, если собственник
    // вызовет эту функцию, то функция выполнится, а если ее вызовет 
    // кто-то другой, то не выполнится.
    modifier onlyOwner {
        require(msg.sender == owner);
        _;
    }
}

contract mortal is owned {
    // Этот контракт наследует от `owned` модификатор `onlyOwner`
    //  и применяет его к функции `close`, и функция 
    // `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;
    }
}

Чтобы применить несколько модификаторов к одной функции, нужно перечислить их через запятую. Они будут обработаны в представленном порядке.

Предупреждение

В ранней версии Solidity, return в функциях, имеющих модификаторы, ведет себя иначе.

Явные возвращения из модификатора или тела функции оставляют только текущий модификатор или тело функции. Возвращаемые переменные присваиваются и поток управления продолжается после «_» в предыдущем модификаторе.

Произвольные выражения допускаются для аргументов модификатора, и в этом контексте все символы, видимые из функции, видны в модификаторе. Символы, представленные в модификаторе, не видны в функции (поскольку они могут меняться путем переопределения).

Материал был полезен? Поделитесь в соц. сетях:
Логотип echain.ru

Добавить комментарий

Ваш e-mail не будет опубликован.