Pregunta de montaje de Solidity - mstore

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

Respuestas (1)

La explicación es bastante simple:

  1. En Solidity, bytes es una matriz de bytes de tamaño dinámico:

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).

  1. En Solidity Assembly, las variables son punteros a direcciones de memoria.

  2. La memoria y el almacenamiento se administran en fragmentos de 32 bytes.

  3. 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.