Gibt eine Antwort von der Selbstzerstörungsfunktion zurück

Ich versuche, eine Art Bestätigung zu haben, nachdem ich einen Vertrag durch Rückkehr beendet truehabe, aber wenn ich meinen Kill-Befehl ausführe, kehrt er immer zurück false. Gibt es eine Begründung dafür oder wird der Vertrag nicht gekündigt?

Hier ist mein Vertragscode:

function killContract() constant returns (bool) {
    require(msg.sender == owner);
    selfdestruct(owner);
    return true;
}

Hier ist mein Trüffelcode, den ich versuche, wahr zurückzugeben, aber er gibt immer wieder falsch zurück:

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}`);
    })

Antworten (2)

Hier passieren 2 Dinge:

1- Die killContract-Funktion ändert den Zustand der Blockchain, daher wird es nicht funktionieren, sie als Konstante/Ansicht zu markieren. Konstanten-/Ansichtsfunktionen können nur den Status lesen.

Da dies KEINE konstante Funktion wäre, können Sie keine Werte aus der Solidität zurückgeben.

2- Sobald Selfdestruct aufgerufen wird, scheint es, als würden weitere Anweisungen nicht verarbeitet.

Was Sie tun können, ist, ein Ereignis auszulösen, bevor Sie selfdestruct aufrufen, um web3 mitzuteilen, dass die Funktion aufgerufen wurde. Wenn die Selbstzerstörung fehlschlägt, wird die Funktion zurückgesetzt und das Ereignis wird nicht ausgelöst.

pragma solidity 0.4.19;

contract A{

    event debug(bool destroyed);

    function destroyMeAndLog() onlyOwner{
        debug(true);
        selfdestruct(this);


    }
}

Eine andere Sache, die Sie tun könnten, ist, eine Dummy-Funktion hinzuzufügen, die beim Aufrufen wahr zurückgibt. Wenn Sie es aufgerufen haben, nachdem der Vertrag selbst zerstört wurde, würde es false zurückgeben.

Wenn ich mich nicht irre, ist der Vertrag beendet und es bleibt niemand/nichts mehr übrig return true;. Es verwischte den nächsten Schritt.

Ich glaube, Sie können vorher ein Ereignis ausgeben selfdestructund das Ereignis wird im Transaktionsprotokoll angezeigt. Das würde einem Beobachter eine positive Bestätigung geben, was selfdestructstattgefunden hat. Etwas wie:

event LogSelfDestruct(address sender, uint amount);

function kill() public onlyOwner {
  LogSelfDestruct(msg.sender, this.balance);
  selfdestruct(owner);
}

Beobachten Sie dann dieses Ereignisprotokoll, um Selbstzerstörungsereignisse zu beobachten.

Ich hoffe es hilft.

ps Ich stimme Pablo zu. constantgehört nicht.

Ich möchte ein true zurückgeben, weil ich versuche, ein weiteres Ereignis auszulösen, wenn der Vertrag beendet wird. Gibt es eine Möglichkeit, das zu tun?
Ich glaube wirklich nicht, aber vielleicht meldet sich jemand mit einer Einsicht.