¿Cómo ocupan memoria las asignaciones en Solidity?

Digamos que declaro una asignación que usa números uint256 como claves y los asigna a un solo carácter de 8 bits. Agrego 5 miembros a este mapeo.

Obviamente, puedo acceder a cualquiera de estos 5 caracteres utilizando sus respectivos índices.

Entonces, lo que quiero saber es si esta asignación consume 5*8 = 40 bits de memoria o 5*8 + 5*256 = 1320 bits.

Respuestas (1)

Una asignación es de tipo dinámico y funciona como una base de datos de clave-valor de almacenamiento (no de memoria).

tomemos el siguiente ejemplo

contract C {
    mapping(uint256 => uint256) items;
    function C() {
      items[0xC0FEFE] = 0x42;
    }
}

El código ensamblador para la función C contendrá:

  // Storing 0x42 to the address 0x798...187c
  0x42
  0x79826054ee948a209ff4a6c9064d7398508d2c1909a392f899d301c6d232187c
  sstore

lo que significa que almacenamos el valor 0x42en el valor correspondiente a la clave 0x79826054ee948a209ff4a6c9064d7398508d2c1909a392f899d301c6d232187cque es el hash de la clave de mapeo0xC0FEFE

Aquí hay una discusión interesante sobre por qué la asignación no se puede diseñar para el uso de la memoria. ¿ Por qué (conceptualmente) las asignaciones no pueden ser variables locales?

¿Significa eso efectivamente que los índices no ocuparán ningún almacenamiento ya que solo se utilizan para asignar una dirección de almacenamiento al valor? Lo siento si suena tonto (soy bastante nuevo en ethereum), pero ¿eso significa que el ejemplo mencionado en la pregunta de hecho solo consumirá 40 bits de almacenamiento?
1-sí 2-en este ejemplo almacenamos solo 1 byte
¿No se almacena el valor 0x0000000000000000000000000000000000000000000000000000000000000042 ya que las ranuras son de 32 bytes?
Exactamente cada valor tiene 32 bytes de ancho. pero inicialmente es solo 1 byte. es como almacenar 1 byte en una matriz con un tamaño de 32 bytes (en mi comentario estaba hablando del tamaño en el punto de entrada)