Was sind Anrufdaten? Ich habe gelernt, dass es drei Arten von Erinnerungen gibt:
In den Ethereum-Dokumenten heißt es, dass die Funktionsparameter standardmäßig vom Typ Speicher sind.
Allerdings habe ich auch einen Artikel gelesen, der besagte, dass Funktionsargumente in calldata gespeichert werden.
Nun, ich weiß nicht, was Anrufdaten sind, kann mir bitte jemand helfen?
Vielen Dank!
Hier ist ein Beispiel aus Was ist ein ABI und warum wird es benötigt, um mit Verträgen zu interagieren?
contract Foo {
function baz(uint32 x, bool y) returns (bool r) { r = x > 32 || y; }
}
baz()
Wenn wir mit den Parametern 69
und aufrufen wollten true
, würden wir insgesamt 68 Bytes übergeben, die sich aufteilen lassen in:
0xcdcd77c0: die Methoden-ID. Dies wird als die ersten 4 Bytes des Keccak-256-Hashes der ASCII-Form der Signatur baz(uint32,bool) abgeleitet. 0x000000000000000000000000000000000000000000000000000000000045: Der erste Parameter, ein uint32-Wert 69, aufgefüllt auf 32 Byte. (69 ist hex 0x45.) 0x00000000000000000000000000000000000000000000000000000000000001: der zweite Parameter – boolesch wahr, auf 32 Bytes aufgefüllt
Die 68 Bytes sind die calldata
: 0xcdcd77c000000000000000000000000000000000000000000000000000000000000000450000000000000000000000000000000000000000000000000000000000000001
.
calldata
Hier werden Daten von externen Aufrufen von Funktionen gespeichert.
Funktionen können intern, zB aus dem Vertrag, oder extern aufgerufen werden. Wenn die Sichtbarkeit einer Funktion ist external
, können nur externe Verträge diese Funktion aufrufen.
Wenn ein solcher externer Anruf stattfindet, werden die Daten dieses Anrufs in gespeichert calldata
.
Lesen Sie auch hier: „externe“ vs. „öffentliche“ Best Practices
Das Calldata
ist ein schreibgeschützter Byte-adressierbarer Raum, in dem der Datenparameter einer Transaktion oder eines Anrufs gehalten wird. Im Gegensatz zum Stapel müssen Sie zur Verwendung dieser Daten einen genauen Byte-Offset und die Anzahl der zu lesenden Bytes angeben. Die Opcodes im Zusammenhang mit den von EVM bereitgestellten Calldata sind:
• CALLDATASIZE gibt die Größe der Transaktionsdaten zurück
• CALLDATALOAD importiert 32 Byte Transaktionsdaten auf den Stack
• CALLDATACOPY kopiert Transaktionsdaten einer bestimmten Anzahl von Bytes in den Speicher
calldata
verhält sich fast so memory
. Es ist ein nicht modifizierbarer und temporärer Bereich, der zum Speichern von Funktionsargumenten verwendet werden kann. Da das Kopieren zwischen Speicher und Speicher recht teuer sein kann, kann die Angabe eines Speicherorts manchmal hilfreich sein, um den Gasverbrauch zu kontrollieren.
Badr Bellaj