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 bytes
y king
es la dirección del jugador. ¿Esto se ve bien o podría ser engañado si player
está controlado por la entrada del usuario? Creo que keccak256
lo evitaría, ¿no?
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, king
en la práctica es imposible encontrar el valor de player
.
shawn tabrizi
king
es tipoaddress
? Si es así, la comprobación de igualdad es extraña... También tenga en cuenta quekeccak256(abi.encodePacked(player))
siempre devolverá el mismo resultado para el mismoplayer
valor. Si el usuario puede controlar elplayer
valor directamente, también se puede controlar la igualdad. Sin embargo, en general,abi.encodePacked
se comporta perfectamente bien y se puede utilizar en sistemas de producción.cabeza de anuncio
king
es de tipobyte32
. Hm, pero digamos que incluso si el usuario conoce el valor deking
aunque sea una variable privada. Entonces, aún no pueden controlar unplayer
valor de manera que keccak256 devuelva lo mismo que eso. ¿O ellos?shawn tabrizi
player
se establece el valor...cabeza de anuncio
first2byteof_contractaddr+<24_digit_hex_seed>+remainingbyteof_contractaddr
donde contractaddr == dirección de contrato generada @ShawnTabrizi