Я заметил следующее поведение журнала событий и хотел подтвердить, так ли это должно работать.
Код ниже. Для создания функции требуется два поля. Я поставил «требовать», чтобы проверить, не являются ли поля ненулевыми и не пустыми.
Если я ввожу только одно поле - скажем, «имя», оно выдает ошибку, как и ожидалось. Я ввел пустое поле для имени и 10 для номера как: "",10. Solidity правильно считывает его и определяет, в каком элементе возникла проблема.
Однако, когда функция «создает» ошибки, она не показывает ни одного из предыдущих операторов журнала внутри функции. Я ожидал, что журналы будут печататься последовательно и останавливаться при обнаружении сбоя.
У меня возникли следующие вопросы:
-
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;
}
}
В Solidity нет частичного выполнения функций. Если в какой-либо момент в функции возникает ошибка, вся функция завершается сбоем, и ни один из ваших журналов не будет зарегистрирован. На самом деле все журналы будут появляться в одном и том же объекте транзакции, созданном по завершении всей функции, а не выводиться по одному.
Вы можете думать, require
что это похоже на if (condition) revert()
, где не происходит никаких изменений состояния; при броске все возвращается в исходное состояние (т.е. ничего не происходит), кроме газа, используемого для вызова функции.
Если вы хотите выполнять пошаговую отладку, вы можете использовать remixd ( https://remix.ethereum.org/ ), в котором есть инструмент пошаговой отладки.
В более поздних версиях Solidity также ведется работа, чтобы сделать сообщения об ошибках более наглядными, поэтому вместо просто «недопустимого кода операции» более поздние версии могут позволить вам описать ваше сообщение о выбросе.
пользовательDSSR