Wie werden Anrufdaten im Speicher gespeichert?

Wenn ich das ausführe:

bytes8 h = 0x000008dfe2f440000733c;
t.call.gas(0x7e0b0)(bytes4(keccak256("enter(bytes8)")),0x8dfe2f440000733c0000000,h);

Die Anrufdaten sind:

0: 0x3370204e000000000000000000000000000000000000000008dfe2f440000733c00000008dfe2f440000733c000000000000000000000000000000000000000000000000

Ich habe es in 32 Bytes aufgeteilt:

3370204e000000000000000000000000000000000000000008dfe2f440000733
c00000008dfe2f440000733c0000000000000000000000000000000000000000   
00000000   

Warum ist das?

Der Funktionsselektor ist immer 4 Bytes groß, also in einem eigenen "Slot"
Diese Frage zeigt die Auffüllung in Anrufdaten, wie @Mikhail antwortet. Der eigentliche Aufruf ergibt normalerweise keinen Sinn, da es entersich um eine Funktion handelt, die nur einen Parameter hat und daher hnormalerweise nicht verwendet wird.
Wie finde ich die maximale Größe der Anrufdaten heraus?

Antworten (2)

3370204e // bytes4(keccak256("enter(bytes8)"))
000000000000000000000000000000000000000008dfe2f440000733c0000000 // 0x8dfe2f440000733c0000000 uint96 padded to 32 bytes
8dfe2f440000733c000000000000000000000000000000000000000000000000 // 0x000008dfe2f440000733c bytes8 padded to 32 bytes

Aus Dokumentation :

Darüber hinaus wird als Schnittstelle zu Verträgen, die nicht der ABI entsprechen, der Funktionsaufruf bereitgestellt, der eine beliebige Anzahl von Argumenten beliebigen Typs entgegennimmt. Diese Argumente werden auf 32 Bytes aufgefüllt und verkettet. Eine Ausnahme ist der Fall, wo das erste Argument auf genau vier Bytes codiert ist. In diesem Fall wird es nicht aufgefüllt, um hier die Verwendung von Funktionssignaturen zu ermöglichen.

Beachten Sie, dass uintN links aufgefüllt wird und bytesN rechts aufgefüllt wird. Aus Dokumentation :

uint<M>: enc(X) ist die Big-Endian-Codierung von X, die auf der höherwertigen (linken) Seite mit Null-Bytes aufgefüllt wird, sodass die Länge 32 Bytes beträgt.

bytes<M>: enc(X) ist die Folge von Bytes in X, aufgefüllt mit abschließenden Null-Bytes auf eine Länge von 32 Bytes.

Wie @libertylocked in ihrem Kommentar sagte, ist der Funktionsselektor 4 Bytes groß, also müssen Sie diese 4 Bytes entfernen, bevor Sie sie durch 32 Bytes aufteilen, um die einzelnen Wörter zu erhalten.