Solidity CALL und DELEGATECALL: Nachrichten und Datenformat

Ich habe einige Fragen zu Solidity CALLund DELEGATECALL. Ich habe bereits einige verwandte Threads gelesen ( Link ), aber keine Antworten auf meine Zweifel gefunden.

1) Gibt es einen Unterschied bei der Ausführung einer CALLFunktion in einem Solidity-Vertrag durch direkten Aufruf der Funktion (z. B. funct(arg1)) oder durch Verwendung von addressOfTheContract.call(bytes4(sha3("funct(uint256)")), _n)?

2) Gibt es einen Unterschied bei der Ausführung einer DELEGATECALLBibliotheksfunktion durch direkten Aufruf der Funktion (z. B. lib.funct(arg1)) oder durch Verwendung von addressOfTheLibraryContract.delegatecall(bytes4(sha3("funct(uint256)")), _n)? Nehmen wir an, dass in beiden Fällen die Bibliothek mit einer importErklärung zu Vertragsbeginn importiert wird.

3) Generieren Sie sowohl CALLals auch DELEGATECALLNachrichten mit demselben Format einer Transaktion ( nonce, to, value, ...), mit Ausnahme der Felder gasPriceund ?gasLimit

4) Schließlich beides CALLund DELEGATECALLfindet lokal auf jedem Knoten statt?

Antworten (2)

  1. Es gibt einen Unterschied, wenn Sie eine Funktion innerhalb des Vertrags aufrufen (ein "interner" Aufruf). Interne Funktionsaufrufe erfolgen durch Sprünge und erfordern keinen tatsächlichen callOpcode. Die längere Form ist äquivalent zuthis.funct(arg1)

  2. Nein, das sollte gleichwertig sein.

  3. Nein, CALLund DElEGATECALLEVM-Opcodes sind genau wie SSTOREoder MUL. Es wird keine Transaktion generiert, alles, was passiert, ist, dass Code ausgeführt wird.

  4. Die gesamte Ausführung, die in einer abgebauten Transaktion stattfindet, findet auf jedem vollständigen Knoten im Netzwerk statt. Wenn Sie die Transaktion lokal simulieren, zB mit einem web3 .call(nicht zu verwechseln mit solidity .call), dann wird sie nur lokal ausgeführt

Ich bin mir bei den ersten beiden Antworten nicht 100% sicher, also warte auf eine Bestätigung von anderen:

  1. Nein, diese sollten dasselbe tun.
  2. Nein, diese sollten dasselbe tun.
  3. Nein, Anrufe zwischen Verträgen erzeugen überhaupt keine Transaktionen.
  4. Das hängt davon ab. Sie werden überall dort ausgeführt, wo der Rest des Codes ausgeführt wird. Wenn Sie eine Transaktion durchführen, wird der Code auf allen Knoten ausgeführt. Wenn Sie eth_calleine View/Pure-Funktion aufrufen, wird diese lokal nur auf dem Knoten ausgeführt, mit dem Sie sprechen. Ein CALLoder DELEGATECALLdas ist Teil der Funktionsausführung, die an derselben Stelle ausgeführt wird.