Soliditätsfunktion erhält Wert und übergibt ihn an eine andere Vertragsfunktion

Ich versuche, einen Vertrag zu erstellen, der einen Wert für eine Funktion namens Contribute erhält.

Dann werde ich eine andere Vertragsfunktion mit Wert aufrufen. Ich frage mich, wie das gemacht wird, es ist nicht sehr klar.

Dies ist der Code, den ich bisher erhalten habe (alle anderen Funktionen und Variablen werden der Einfachheit halber weggelassen):

contract Hub {
    function contribute(address _address) payable {
       Project project = Project(_address);
       project.fund.value(msg.value)();
    }
}

contract Project {
    function fund(address sender) payable {
       amount += msg.value;
       contributors[sender] = msg.value;
    }
}

Dies gibt mir aus irgendeinem Grund einen ungültigen Opcode. Was könnte falsch sein? Versuche ich es falsch zu machen?

Der Opcode-Stack ist hier: https://gist.github.com/vongohren/160b61e5fd2b6c0c85fb8829aed9b3b2

Antworten (2)

funderfordert einen Parameter, also versuchen Sie, ihm ein Argument zu übergeben:

project.fund.value(msg.value)( msg.sender )


Indem Solidity kein Argument übergibt, versucht Solidity wahrscheinlich, nach einer Funktion zu suchen fund, die keine Parameter akzeptiert, und wird die Fallback-Funktion nicht finden und daher aufrufen , was wiederum eine interne Ausnahme über einen ungültigen Opcode verursacht , wenn dies nicht der Fall ist payable.

Das war es nicht, ich habe es mit und ohne Parameter versucht, aber es liefert immer noch ungültigen Opcode :(
Möglicherweise müssen Sie mehr Code auskommentieren oder mehr anzeigen. Gist wurde in Remix getestet und es hat funktioniert.

Das Problem für mich war, dass ich nicht genug Benzin geschickt habe. Ich habe das auf verschiedene Weise herausgefunden, aber das Hauptproblem war, dass ich da eine andere Vertragsmethode anrufe, die dann mehr Benzin kostet als gesendet. Es warf einen ungültigen Op-Code und kein Gas aus.

Daher kann es sinnvoll sein, in Ihrem Vertrag auch den Gasverbrauch anzugeben, der andere Verträge aufruft, damit der Benutzer ein angemessenes Feedback erhält. Wenn auf diese Weise nicht genug Gas an den Hauptvertrag gesendet wird, ist dies der richtige Fehler! Kein falscher ungültiger Opcode-Fehler.