SOLIDITÄT: So erhalten Sie einen bytes32 keccak256-Hash einer Adresse und 2 uint256-Variablen

Ich würde gerne wissen, wie man einen Bytes32-Keccak256-Hash einer Adresse und 2 uint256-Variablen erhält.

Ich möchte etwas, das so aussehen wird. Aber von den Remix-IDE-Fehlern muss ich die 3 Variablen in Bytes32 umwandeln und das dann hashen?

/* here are the variable names and types (Apart from msg.sender which is address */

uint256 _unixTimestamp;
uint256 _timeExpired;

/* This is what I have got so far, what do I need to do to fix the error? */
bytes32 output = keccak256(msg.sender, _unixTimestamp, _timeExpired);

Hier ist die Warnmeldung von der Remix-IDE

Warnung: Diese Funktion akzeptiert nur ein einzelnes "Bytes"-Argument. Bitte verwenden Sie "abi.encodePacked(...)" oder eine ähnliche Funktion, um die Daten zu kodieren.

Bytes32-Ausgabe = keccak256 (msg.sender, _unixTimestamp, _timeExpired);

. . . . . . . . . . . . . .^------------------------------------------------------------- ----------------------- ^

Sie haben uint265stattdessen uint256andere als dass es funktionieren sollte
Ich habe das behoben und bekomme jetzt nur eine Warnung ... "Warnung: Diese Funktion akzeptiert nur ein einzelnes "Bytes" -Argument. Bitte verwenden Sie "abi.encodePacked (...)" oder eine ähnliche Funktion, um die Daten zu codieren. bytes32 output = keccak256(msg.sender, _unixTimestamp, _timeExpired);"
Verwenden Sie einfach die Funktion, die von der Warnung vorgeschlagen wird:keccak256(abi.encodePacked(msg.sender, _unixTimestamp, _timeExpired))

Antworten (1)

Wie in diesem Thread berichtet: https://github.com/ethereum/solidity/issues/3955

Die neuen abi.encode*()-Methoden bieten einen Ersatz für das Packen, das dann an alle diese Hash-Funktionen übergeben werden kann.

Fazit: Wie @mirg kommentierte, verwenden Sie einfach abi.encodePacked() in keccak256(). Das ist:

keccak256(abi.encodePacked(msg.sender, _unixTimestamp, _timeExpired))