Los mapeos no tienen una longitud, ni tienen el concepto de clave o valores que se establecen.
¿Es esta declaración verdadera o falsa?
Por favor proporcione la explicación también.
Los documentos de solidez dicen: "Las asignaciones se pueden ver como tablas hash que se inicializan virtualmente de modo que existen todas las claves posibles y se asignan a un valor cuya representación de bytes es todo ceros
True
, porque tenemos el concepto de claves y valores en las asignaciones , pero en realidad no se configuran dentro de la asignación , solo se usa su keccak256
hash para buscar el valor.
Por qué usan keccak256
hash en lugar de valor real en las asignaciones (según los documentos ):
Los tipos que no ocupan los 32 bytes completos pueden contener "bits sucios de orden superior". Esto es especialmente importante si accede msg.data
; plantea un riesgo de maleabilidad: puede crear transacciones que llamen a una función f(uint8 x)
con un argumento de byte sin procesar de 0xff000001
y con 0x00000001
. Ambos se alimentan al contrato y ambos se verán como el número 1
en lo que x
respecta, pero msg.data será diferente, por lo que si lo usa keccak256(msg.data)
para algo, obtendrá resultados diferentes.
Si desea leer más información y desea comprender cómo funciona internamente, debe intentar leer -> ¿ Cómo puede borrar las asignaciones?
emilebaizel
0xff000001
a unuint8
parámetro, aparece el errorError encoding arguments: Error: value out-of-bounds (argument=null, value="0xff000001", code=INVALID_ARGUMENT, version=abi/5.5.0)
. Esto fue en Remix.