Каков порядок выполнения для нескольких модификаторов функций? [Дубликат]

    

У этого вопроса уже есть ответ:

    

Я не знаю, почему никто не задает этот вопрос (я сделал домашнее задание и сделал тонны Google для ответа), но мне трудно понять, как работают функции-модификаторы на самом деле .

Конечно, тривиально, когда вы просто используете один модификатор или используете нотацию _ всегда в конце. Но я нахожу код, который выглядит примерно так:

modifier modA {
  // verify something
  _;
  // verify something
  _;
}
modifier modB {
  // verify something
  _;
  // verify something
  _;
}
modifier modC {
  // verify something
  _;
  // verify something
  _;
}

function Fun() modA modB modC {
  // Do something
}

Затем я, наконец, понимаю, что я понятия не имел, что происходит внизу.

В приведенном выше случае, как это должно работать? Рассмотрение документации на самом деле не помогает, потому что просто говорит, что модификаторы просто заменяют код _ кодом функции. Но что, если их несколько?

Итак, если мы перейдем от modA к modB, замените ли код _ следующим модификатором? Что они означают, «замените на оригинальную функцию»?

5 голосов | спросил Vlad 31 +03002017-10-31T11:41:44+03:00312017bEurope/MoscowTue, 31 Oct 2017 11:41:44 +0300 2017, 11:41:44

1 ответ


2

Я думаю, что хороший способ понять, что происходит, это поэкспериментировать с

Я создал этот контракт в Remix, чтобы проверить /доказать некоторые мои предположения о том, что происходит с модификаторами:


pragma solidity ^0.4.18;

contract modifierTest {
    uint public modState1;
    uint public modState2;
    uint public modState3;

    modifier modA() {
        modState1 = modState1 + 1;
        _;
    }

    modifier modB() {
        modState2 = modState2 + 1;
        _;
        modState2 = modState2 + 1;
        _;
    }

    function func() public modA modB {
        modState3 = modState3 + 1;
    }
}

Изначально все переменные состояния контракта устанавливаются в /по умолчанию на 0.

После выполнения функции func и проверки переменных состояния мы видим следующий результат:


modState1 - uint256: 1
modState2 - uint256: 2
modState3 - uint256: 2
  • Мы видим, что модификатор modA запускался только один раз.
  • Мы видим, что модификатор modB запускался только один раз.
  • Мы видим, что наличие более одного символа _; является допустимым синтаксисом
  • Мы видим, что функция func вызывалась дважды

Из этого можно понять, что ; в модификаторе * modA * был заменен кодом модификатора * modB * и что * ; * s в модуле модификатора modB были заменены функцией func код.

  

Итак, если мы перейдем от modA к modB, замените ли _ на следующий модификатор? Что они означают, «заменив исходную функцию»?

Надеюсь, этот пример демонстрирует, как _ заменяется следующим модификатором и что последний модификатор _ заменяется кодом функции.

ответил SteveJaxon 31 +03002017-10-31T21:48:50+03:00312017bEurope/MoscowTue, 31 Oct 2017 21:48:50 +0300 2017, 21:48:50

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132