Журнал событий в Solidity

Я заметил следующее поведение журнала событий и хотел подтвердить, так ли это должно работать.

Код ниже. Для создания функции требуется два поля. Я поставил «требовать», чтобы проверить, не являются ли поля ненулевыми и не пустыми.

Если я ввожу только одно поле - скажем, «имя», оно выдает ошибку, как и ожидалось. Я ввел пустое поле для имени и 10 для номера как: "",10. Solidity правильно считывает его и определяет, в каком элементе возникла проблема.

Однако, когда функция «создает» ошибки, она не показывает ни одного из предыдущих операторов журнала внутри функции. Я ожидал, что журналы будут печататься последовательно и останавливаться при обнаружении сбоя.

У меня возникли следующие вопросы:

  1. Когда функция дает сбой - игнорирует ли она все журналы событий внутри функции? Если да, есть ли другой способ запустить это, чтобы последовательно отображать журналы для целей отладки.
  2. Когда «требовать» не удается: он автоматически возвращает значение по умолчанию (что в данном случае ложно). Это, вероятно, хорошо, потому что у нас нет операторов write return после каждой проверки «require».

-

    pragma solidity ^0.4.15;
    contract ABC {
        bytes32 public name;
        uint public number;

        event Log(string _myString);

        function ABC (bytes32 _name, uint _number) public {
            Log("Creating Object");
            name = _name;
            number = _number;

        }
    }    
    contract XYZ {

        ABC myABC;

        event Log(string _myString);

        function create(bytes32 _name, uint _number) public returns (bool isSuccess) {

            Log("checking name");
            require(_name != "");

            Log("name valid, now checking number");
            require(_number != 0);

            Log("name and number non-empty, creating a new contract");
            myABC = new ABC(_name,_number);

            Log("new contract created");

            return true;

        }
    }

Ответы (1)

В Solidity нет частичного выполнения функций. Если в какой-либо момент в функции возникает ошибка, вся функция завершается сбоем, и ни один из ваших журналов не будет зарегистрирован. На самом деле все журналы будут появляться в одном и том же объекте транзакции, созданном по завершении всей функции, а не выводиться по одному.

Вы можете думать, requireчто это похоже на if (condition) revert(), где не происходит никаких изменений состояния; при броске все возвращается в исходное состояние (т.е. ничего не происходит), кроме газа, используемого для вызова функции.

Если вы хотите выполнять пошаговую отладку, вы можете использовать remixd ( https://remix.ethereum.org/ ), в котором есть инструмент пошаговой отладки.

В более поздних версиях Solidity также ведется работа, чтобы сделать сообщения об ошибках более наглядными, поэтому вместо просто «недопустимого кода операции» более поздние версии могут позволить вам описать ваше сообщение о выбросе.

Спасибо @carlolm за быстрый ответ. Это помогает сделать концепции более ясными.