¿Qué significa "Advertencia: esta función solo acepta un único argumento de "bytes". Utilice "abi.encodePacked(...)"

En esta pregunta, el OP se encuentra con una advertencia al usar la keccak256función en Solidity:

Advertencia: esta función solo acepta un único argumento de "bytes". Utilice "abi.encodePacked(...)" o una función similar para codificar los datos.

uint256 _unixTimestamp;
uint256 _timeExpired;

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

¿Cuál es la razón detrás de este error? ¿Por qué necesito usarlo abi.encodePackedy qué hace en comparación con usarlo como se muestra arriba?

Respuestas (2)

Antes de Solidity 0.5.0, ambos funcionaban de la misma manera. La advertencia es parte del proceso de desaprobación de las versiones de argumentos variables keccak256y otras funciones hash.

A partir de Solidity 0.5.0, sha3se eliminó. Consulte https://github.com/ethereum/solidity/issues/3955 para obtener más detalles.

Significa que ahora necesita cambiar su código a:

uint256 _unixTimestamp;
uint256 _timeExpired;

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