Funktionsvererbung funktioniert nicht

test()Warum wirft der angehängte Vertrag immer einen ungültigen Opcode, wenn ich und verify()(in dieser Reihenfolge) ausführe ?

pragma solidity ^0.4.10;

contract Parent
{

    uint value;

    function isValueOne() public constant returns (bool) {
        return value == 1;
    }

}


contract Child is Parent
{

    uint public value;

    function test() public {
        value = 1;
    }

    function verify() {
        require(isValueOne());
    }
}

Nach meinem Verständnis sollte dies niemals der Fall sein. Ich habe die Dokumente über Vererbung gelesen und konnte nicht herausfinden, was los ist. Nach dem Umzug isValueOnefunktioniert Childalles.

Ich habe diesen Code auf testrpc und remix mit den gleichen Ergebnissen getestet.

Antworten (1)

Ihr Code schlägt aus mehreren Gründen fehl.

1- Die Funktion verify() ist nicht als Konstante gekennzeichnet. Es sollte als konstant markiert werden, da es Daten liest und nicht schreibt. (Wenn Sie dies beheben, wird der Fehler, den Sie erhalten, behoben).

2- Selbst wenn dieser Fehler behoben ist, funktioniert der Vertrag nicht wie beabsichtigt, da Sie den öffentlichen Wert von uint im untergeordneten Element deklarieren, wodurch die Deklaration der Variablen mit demselben Namen/Typ im übergeordneten Element überschattet wird.

So sollte Ihr Code aussehen, damit er funktioniert:

pragma solidity ^0.4.10;

contract Parent
{

    uint public value;

    function isValueOne() public constant returns (bool) {
        return (value == 1);
    }

}


contract Child is Parent
{

    function test() public {
        value = 1;
    }

    function verify() constant returns (bool) {
        require(isValueOne());
        return true;
    }
}
Danke für die schnelle Antwort und es funktioniert. Ich habe irgendwo gelesen, dass constantderzeit nichts getan wird. Was würde dazu führen, dass dies hier fehlschlägt? Dies sollte unbedingt dokumentiert werden.
Der Compiler erzwingt das Hinzufügen nicht, aber Sie müssen es hinzufügen, um ihm mitzuteilen, dass es die Funktion eth_call anstelle von eth_sendTransaction verwenden soll.
Da ich etwas ändere verify()und eine Eigenschaft aktualisiere und daher entferne constant, schlägt dieser Code fehl. Ich denke nicht, dass das richtig ist
Sie ändern derzeit keine Zustandsvariable in verify().
Als Referenz war das Problem, dass ich valuein neu definiert habe Child. Der Compiler sollte in diesem Fall einen Fehler ausgeben, dieses Problem ist bereits auf github github.com/ethereum/solidity/issues/2563 geöffnet (ich konnte dies finden, nachdem ich an das Shadowing erinnert wurde.)