Estaba buscando cómo convertir un uint a bytes en Solidity y encontré esta respuesta.
function toBytes(uint256 x) returns (bytes b) {
b = new bytes(32);
assembly { mstore(add(b, 32), x) }
}
De los documentos mstore(p, v) es mem[p..(p+32)] := v
Lo que significa que mstore(add(b, 32), x) se traduce como mem[(b+32)..(b+64)] := x
¿Qué entendí mal aquí? Seguramente b tiene 32 bytes y el valor de x debe copiarse dentro de b , no justo después.
Gracias
La explicación es bastante simple:
Las variables de tipo bytes y cadena son arreglos especiales. Un byte es similar a byte[], pero está empaquetado de forma compacta en calldata. cadena es igual a bytes pero no permite acceso de longitud o índice (por ahora).
En Solidity Assembly, las variables son punteros a direcciones de memoria.
La memoria y el almacenamiento se administran en fragmentos de 32 bytes.
El primer trozo de memoria de una matriz almacena la longitud de esa matriz.
Ahora veamos tu código:
b = new bytes(32);
Esto crea una variable llamada b del tipo bytes .
Por 1, ahora sabemos que b se tratará como una matriz.
Por 2, sabemos que b apuntará a su dirección de memoria.
Por 3 y 4 ahora sabemos que b apuntará a su longitud, y solo 32 bytes después es la dirección de memoria donde comenzará el valor de b .
Sabemos que add(b, 32)
devolverá la dirección de memoria de b agregada por 32 (en otras palabras, la dirección de memoria donde almacenar el valor de b ).
Entonces, finalmente sabemos por qué mstore(add(b, 32), x)
hace b = x
.