Ich habe einige Fragen zu Solidity CALL
und 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 CALL
Funktion 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 DELEGATECALL
Bibliotheksfunktion 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 import
Erklärung zu Vertragsbeginn importiert wird.
3) Generieren Sie sowohl CALL
als auch DELEGATECALL
Nachrichten mit demselben Format einer Transaktion ( nonce
, to
, value
, ...), mit Ausnahme der Felder gasPrice
und ?gasLimit
4) Schließlich beides CALL
und DELEGATECALL
findet lokal auf jedem Knoten statt?
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 call
Opcode. Die längere Form ist äquivalent zuthis.funct(arg1)
Nein, das sollte gleichwertig sein.
Nein, CALL
und DElEGATECALL
EVM-Opcodes sind genau wie SSTORE
oder MUL
. Es wird keine Transaktion generiert, alles, was passiert, ist, dass Code ausgeführt wird.
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:
eth_call
eine View/Pure-Funktion aufrufen, wird diese lokal nur auf dem Knoten ausgeführt, mit dem Sie sprechen. Ein CALL
oder DELEGATECALL
das ist Teil der Funktionsausführung, die an derselben Stelle ausgeführt wird.