Kann der CALL-Opcode verwendet werden, um einen Vertrag zu erstellen?

Das Yellow Paper Anhang H definiert die CREATE- und CALL-Opcodes. Für ANRUF:

Die Reihenfolge der Operanden ist: gas, to, value, in offset, in size, out offset, out size.

Kann der CALL-Opcode zum Erstellen eines Vertrags verwendet werden, indem der zweite Operand (das "to") auf Null gesetzt wird?

Wenn das möglich ist, was wären die Unterschiede zwischen der Verwendung von CREATE und CALL? Gibt es Fälle, in denen es besser wäre (z. B. billigeres Gas), den CALL-Opcode zum Erstellen eines Vertrags zu verwenden?

Antworten (2)

CALLKann der Opcode zum Erstellen eines Vertrags verwendet werden, indem der zweite Operand (das "to") auf Null gesetzt wird?

Nein, ich kann nicht. Die Nulladresse ist nichts Besonderes. Genau wie jedes andere Nicht-Vertragskonto muss es keinen Code ausführen, wenn es eine Nachricht über den CALLOpcode erhält.

Eine andere intuitive Möglichkeit, darüber nachzudenken, ist, dass jeder Opcode seine eigenen Gaskosten hat, also wäre dies ein lustiger Hack, um die Kosten einer CREATEOperation zu vermeiden.

Ich bin noch neu darin, aber ich verstehe, dass es nicht möglich ist. Der Aufruf ist nur zu verwenden, wenn die Anfrage den Zustand der Blockchain nicht ändert (normalerweise nur das Lesen von Feldern oder das Aufrufen konstant markierter Funktionen.

Das Erstellen einer neuen Vertragsinstanz ändert offensichtlich die Blockchain-Daten, da sie in den Block integriert werden müssen, bevor die Adresse zurückgegeben werden kann.

In meinen Experimenten (bisher) verwende ich nur die folgenden Muster und es ist ausreichend:

  • Vertragsinstanz erstellen: asynchroner Aufruf (mit sendTransaction). Der Abschluss wird über den Callback verwaltet, der einmal mit dem Tx-Hash und ein zweites Mal mit der Vertragsadresse aufgerufen wird.
  • Vertragsdaten lesen: Synchroner Aufruf des lokalen Knotens über die Aufrufmethodik.
  • Aktualisieren von Daten: asynchroner Aufruf (mit sendTransaction) mit Methoden, die keine Werte zurückgeben. Call gibt synchron (oder eventuell asynchron) den Tx-Hash zurück, der dann über getTransactionReceipt auf Vollständigkeit überwacht werden kann (unter Verwendung von eth.filter('latest'), der angibt, wann der nächste Block abgebaut wurde).
  • Informationen asynchron empfangen: Verwendung des Ereignisses im Vertrag. Überwachen Sie den Empfang über eth.filter ( options, callback ).
  • Nachholen von Ereignissen nach einem Zeitraum ohne Verbindung: Verwenden Sie eth.filter({fromBlock: xyz, toBlock: eth.currentBlock, ...}).get()

All dies wird (in synthetischer Form) in der API https://github.com/ethereum/wiki/wiki/JavaScript-API erklärt

Der EVM CALL-Opcode hat nichts mit der eth_call -Schnittstelle zu tun (die möglicherweise Platz für eth_simulateTransaction macht ) .