Wie funktioniert keccak256 mit abi.encodePacked intern? Ich bekomme zwei widersprüchliche Ergebnisse

Ich habe zwei uint256-Werte -> 2 und 0

Beim Aufführen:keccak256(abi.encodePacked(uint(2), uint(0)))

Ich habe das richtige Ergebnis:

0xabbb5caa7dda850e60932de0934eb1f9d0f59695050f761dc64e443e5030a569

Was mich verwirrt, ist, wenn ich versuche, nur keccak256 für den Wert zu verwenden: 0x00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000was das Ergebnis von istabi.encodePacked(uint(2), uint(0))

In diesem Fall bekomme ich mit keccak256:0x608133906c7feb1802e3582d4a7765ca241f9618f3eabaa89a6a14fdea761d9d

Was fehlt mir hier? Ich würde erwarten, dass ich die gleichen Ergebnisse erhalte.

Etwas zusammenfassen. Warum erhalte ich mit den Funktionen A und B unterschiedliche Ergebnisse? Welchen Rohwert muss ich keccak256 von testB zur Verfügung stellen, um die gleichen Ergebnisse wie testA zu erhalten?

function testEncode() public pure returns(bytes memory) {
  return abi.encodePacked(uint(2), uint(0)); 
  // returns 0x00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000
}

function testA() public pure returns(bytes32) {
  return keccak256(abi.encodePacked(uint(2), uint(0)));
  // returns 0xabbb5caa7dda850e60932de0934eb1f9d0f59695050f761dc64e443e5030a569
}

function testB() public pure returns(bytes32) {
  // abi.encodePacked(uint(2), uint(0)) // 0x00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000
  return keccak256("0x00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000"); 
  // returns 0x608133906c7feb1802e3582d4a7765ca241f9618f3eabaa89a6a14fdea761d9d
}

Ich werde wirklich dankbar für Ihre Hilfe sein. Ich schaue mir das stundenlang an. Ich versuche nur zu verstehen, wie es intern funktioniert.

Beifall,

Antworten (2)

abi.encodePackedDas Problem ist, wie Sie das Ergebnis an die Funktion übergeben keccak256. keccak256 nimmt ein Hex-Argument und keine Zeichenfolge, wie Sie es in Ihrer testB().

Mit einem Online-Tool konnte ich das richtige Ergebnis erzielen, indem ich einen Hex-Eingabetyp ohne das 0x am Anfang der Eingabe übergab. Für Ihren Fall hier reicht es aus, nur das Hex direkt ohne die Zeichenfolgen-Anführungszeichen ("") zu übergeben.

Danke schön! So ein Fehler. Ich habe das Online-Tool zuvor ausprobiert, aber ich habe nicht von "Text" auf "Hex" umgestellt. und darum ging es! so dumm :D

In testB ist ein String das Argument von keccak256, während in testA ein hexadezimales Literal das Argument ist. Es gibt zwei Lösungen:

1- Wie @Kaki Master Of Time erwähnt hat, können Sie Anführungszeichen ("") entfernen

2- Ersetzen durch hex "0000....0002000....0000"

Vielleicht machen die folgenden Codes das Konzept klarer:

bytes2 a1 = "12"; // fine
bytes2 a2 = "0x1234"; // compile error
bytes2 a3 = "0x"; // fine
bytes2 a4 = hex"1234"; // fine
bytes2 a5 = 0x1234; // fine