was bedeutet "Warnung: Diese Funktion akzeptiert nur ein einzelnes "bytes"-Argument. Bitte verwenden Sie "abi.encodePacked(...)"?

In dieser Frage stößt das OP bei der Verwendung der keccak256Funktion in Solidity auf eine Warnung:

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

uint256 _unixTimestamp;
uint256 _timeExpired;

bytes32 output = keccak256(msg.sender, _unixTimestamp, _timeExpired);

Was ist der Grund für diesen Fehler - warum muss ich es verwenden abi.encodePackedund was bewirkt es im Vergleich zur Verwendung wie oben gezeigt?

Antworten (2)

Vor Solidity 0.5.0 funktionierten beide auf die gleiche Weise. Die Warnung ist Teil des Prozesses, die Versionen mit variablen Argumenten keccak256und andere Hash-Funktionen zu verwerfen.

Ab Solidity 0.5.0 sha3wurde entfernt. Siehe https://github.com/ethereum/solidity/issues/3955 für Details.

Das bedeutet, dass Sie jetzt Ihren Code ändern müssen in:

uint256 _unixTimestamp;
uint256 _timeExpired;

bytes32 output = keccak256(
  abi.encodePacked(msg.sender, _unixTimestamp, _timeExpired)
);