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?
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.
libertylocked
eth
enter
sich um eine Funktion handelt, die nur einen Parameter hat und daherh
normalerweise nicht verwendet wird.Andon Mitev