Дано:
pragma solidity ^0.4.24;
contract changeSomVal{
address owner;
bool test;
event showBool(bool showBool);
constructor() public {
owner = msg.sender;
}
modifier onlyOwner() {
if(msg.sender == owner)
_;
}
function () public payable{
emit showBool(test);
}
function changeBoolTrue () public onlyOwner { // returns (bool)
test = true;
emit showBool(test);
}
function changeBoolFalse () public onlyOwner {
test = false;
emit showBool(test);
}
}
На etherscan он всегда возвращает 64 символа длиной 0...0 eventLog. Неважно, какая функция была вызвана. Я также пробовал это с uint8 (1,2)
for changeBoolTrue() -> test = 1
и changeBoolFalse() -> test = 2
. Меня это тоже утомило с возвратом : function changeBoolTrue () public onlyOwner returns (bool)
. EventLog всегда выдает одно и то же.
В ремиксе выглядит нормально. Но в реальности это не работает. В чем дело?
Я не вижу ничего плохого в том, что вы написали. Но по соглашению вы должны начинать имена событий с символов верхнего регистра.
Еще одним недостатком может быть то, что вы назвали параметр bool так же, как и событие. Учитывая, что вам не нужно ссылаться на аргумент, я бы изменил ваше событие, чтобы оно выглядело следующим образом:
event ShowBool(bool);
и корректируйте свои emit
звонки соответствующим образом.
Редактировать0:
Я развернул ваш фиксированный контракт на Ринкеби, здесь . Вы можете видеть, что EtherScan проверил, что источник соответствует байт-кодам здесь .
Причина всех транзакций в том, что я вызвал резервную копию function ()
— между вызовами changeBoolTrue()
и changeBoolFalse()
, которые показывают, что состояние test
сохраняется в контракте между вызовами.
changeBoolTrue()
. То же самое снова (etherscan eventLog): 000000000000000000000000000000000000000000000000000000000000000000Run
вкладке, в Ремиксе, список вызываемых функций виден справа внизу, в панели Deployed Contracts
(можно нажать на красное поле и проверить транзакцию). В качестве альтернативы, если вы отправите небольшое количество ETH в контракт, будет вызвана резервная функция.
Эдмунд Эдгар
Сохам Лавар
маргаритка