Я пытаюсь получить какое-то подтверждение после того, как я уничтожу контракт, вернув true
, но когда я запускаю команду kill, она всегда возвращает false
. Есть какая-то причина, почему, или контракт не убивают?
Вот код моего контракта:
function killContract() constant returns (bool) {
require(msg.sender == owner);
selfdestruct(owner);
return true;
}
Вот мой код трюфеля, который я пытаюсь вернуть true, но он продолжает возвращать false:
MyContract.at('0x...')
.then(instance => {
c = instance;
return c.getOwner()
})
.then(owner => {
console.log(`Owner: ${owner}`);
return c.killContract()
})
.then(killed => {
console.log(`If killed return true: ${killed}`);
})
.catch(error => {
console.log(`${error}`);
})
Здесь происходит 2 вещи:
1- Функция killContract изменяет состояние блокчейна, поэтому пометить его как константу/представление не получится. Функции константы/представления могут только читать состояние.
Учитывая, что это НЕ будет постоянной функцией, вы не сможете вернуть какие-либо значения из-за твердости.
2- После вызова самоуничтожения кажется, что дальнейшие инструкции не будут обрабатываться.
Что вы можете сделать, так это запустить событие перед вызовом самоуничтожения, чтобы сообщить web3, что функция была вызвана. Если самоуничтожение не удалось, функция вернется, и событие не сработает.
pragma solidity 0.4.19;
contract A{
event debug(bool destroyed);
function destroyMeAndLog() onlyOwner{
debug(true);
selfdestruct(this);
}
}
Еще одна вещь, которую вы можете сделать, это добавить фиктивную функцию, которая возвращает true при вызове. Если вы вызвали его после самоуничтожения контракта, то он вернул бы false.
Если я не ошибаюсь, контракт расторгнут и некому/ничего не осталось return true;
. Это уничтожило следующий шаг.
Я считаю, что вы можете создать событие раньше selfdestruct
, и оно появится в журнале транзакций. Это дало бы наблюдателю положительное подтверждение того, что это selfdestruct
имело место. Что-то вроде:
event LogSelfDestruct(address sender, uint amount);
function kill() public onlyOwner {
LogSelfDestruct(msg.sender, this.balance);
selfdestruct(owner);
}
Затем просмотрите этот журнал событий, чтобы наблюдать за событиями самоуничтожения.
Надеюсь, поможет.
PS Я согласен с Пабло. constant
не принадлежит.
ДжораФрендзона
Роб Хитченс