¿Es seguro usar abi.encodePacked en el código de solidez de producción?

En mi proyecto de juego de solidez, estoy usando esto:

if (king == keccak256(abi.encodePacked(player)){
   //continue as king
} else{
  // not king
}

Donde el tipo de datos del jugador es bytesy kinges la dirección del jugador. ¿Esto se ve bien o podría ser engañado si playerestá controlado por la entrada del usuario? Creo que keccak256lo evitaría, ¿no?

kinges tipo address? Si es así, la comprobación de igualdad es extraña... También tenga en cuenta que keccak256(abi.encodePacked(player))siempre devolverá el mismo resultado para el mismo playervalor. Si el usuario puede controlar el playervalor directamente, también se puede controlar la igualdad. Sin embargo, en general, abi.encodePackedse comporta perfectamente bien y se puede utilizar en sistemas de producción.
@ShawnTabrizi, kinges de tipo byte32. Hm, pero digamos que incluso si el usuario conoce el valor de kingaunque sea una variable privada. Entonces, aún no pueden controlar un playervalor de manera que keccak256 devuelva lo mismo que eso. ¿O ellos?
No sé. No ha proporcionado ningún detalle sobre cómo playerse establece el valor...
No es determinista, es como first2byteof_contractaddr+<24_digit_hex_seed>+remainingbyteof_contractaddrdonde contractaddr == dirección de contrato generada @ShawnTabrizi

Respuestas (1)

La función abi.encodePacked()solo concatena sus datos de entrada en una matriz de bytes en la memoria, no transforma los datos de ninguna manera. Por lo tanto, es totalmente seguro de usar en el código de producción.

La función keccak256()es una función hash criptográfica . Una de sus propiedades es que computacionalmente es difícil encontrar una preimagen, es decir, kingen la práctica es imposible encontrar el valor de player.