Limpieza de Variables
Cuando un valor es inferior que a 256 bits, en algunos casos se deben limpiar los bits restantes. El compilador Solidity está diseñado para limpiar los bits restantes antes de cualquier operacion que pueda verse afectada negativamente por la basura potencial en los bits restantes. Por ejemplo, antes de escribir un valor en la memoria, los bits restantes deben borrarse porque el contenido de la memoria se puede usar para calcular hashes o enviarse como datos de una llamada de mensaje. Del mismo modo, antes de almacenar un valor en el almacenamiento, es necesario limpiar los bits restantes porque de lo contrario se puede observar el valor ilegible.
En última instancia, todos los valores en el EVM se almacenan en palabras de 256 bits. Por lo tanto, en algunos casos, cuando el tipo de un valor tiene menos de 256 bits, es necesario limpiar los bits restantes. El compilador Solidity está diseñado para realizar tal limpieza antes de cualquier operación que pueda verse afectada negativamente por la basura potencial en los bits restantes. Por ejemplo, antes de escribir un valor en la memoria, los bits restantes deben borrarse porque el contenido de la memoria se puede usar para calcular hashes o enviarse como datos de una llamada de mensaje. Del mismo modo, antes de almacenar un valor en el almacenamiento, los bits restantes deben limpiarse porque de lo contrario se puede observar el valor confuso.
Tenga en cuenta que el acceso a través del ensamblado en línea no se considera una operación de este tipo: Si utiliza un ensamblado en línea para acceder a variables de Solidity inferiores a 256 bits, el compilador no garantiza que el valor se limpie correctamente.
Además, no limpiamos los bits si la operación inmediatamente siguiente no se ve afectada.
Por ejemplo, dado que cualquier valor distinto de cero se considera true
por la instruccion JUMPI
,
no limpiamos los valores booleanos antes de que se usen como condición para JUMPI
.
Además del principio de diseño anterior, el compilador Solidity limpia los datos de entrada cuando se cargan en la pila.
Los diferentes tipos tienen diferentes reglas para limpiar valores no válidos:
Tipo |
Valores Validos |
Valores no Válidos Significan |
---|---|---|
enum of n miembros |
0 hasta n - 1 |
excepción |
bool |
0 or 1 |
1 |
enteros con signo |
firmar palabras extendidas |
actualmente se envuelve silenciosamente; en el futuro se producirán excepciones |
enteros sin signo |
bits más altos puestos a cero |
actualmente se envuelve silenciosamente; en el futuro se producirán excepciones |
La siguiente tabla describe las reglas de limpieza aplicadas a diferentes tipos,
donde bits superiores
se refiere a los bits restantes en caso de que el tipo tenga menos de 256 bits.
Type |
Valid Values |
Cleanup of Invalid Values |
---|---|---|
enum de n miembros |
0 hasta n - 1 |
produce una excepción |
bool |
0 o 1 |
resulta in 1 |
enteros firmados |
bits superiores establecidos en el bit con el signo |
actualmente, en silencio, se extiende a un valor valido, es decir todos los bits superiores se. establacen en el bit de signo; puede producir una excepción en el futuro |
enteros no firmados |
bits superiores establecidos a cero |
actualmente, en silencio, enmascara a un valorto a válido, es decir, todos los bits superiores establecen en cero; puede producir una excepción en el futuro |
Tenga en cuenta que los valores válidos y no válidos dependen de su tamaño de tipo.
Considere uint8
, el tipo de 8-bit sin signo, que tiene los siguientes valores válidos:
0000...0000 0000 0000
0000...0000 0000 0001
0000...0000 0000 0010
....
0000...0000 1111 1111
Cualquier valor no válido tendrá los bits más altos establecidos en cero:
0101...1101 0010 1010 invalid value
0000...0000 0010 1010 cleaned value
Para int8
, el tipo de 8-bit firmado, los valores válidos son:
Negativo
1111...1111 1111 1111
1111...1111 1111 1110
....
1111...1111 1000 0000
Positivo
0000...0000 0000 0000
0000...0000 0000 0001
0000...0000 0000 0010
....
0000...0000 1111 1111
El compilador signextend
el bit de signo, que es 1 para valores negativos y 0 para
valores positivos, sobrescribiendo los bits superiores:
Negativo
0010...1010 1111 1111 valor inválido
1111...1111 1111 1111 valor limpiado
Positivo
1101...0101 0000 0100 valor inválido
0000...0000 0000 0100 valor limpiado