¿Por qué (conceptualmente) las asignaciones no pueden ser variables locales?

Tengo entendido que el mappingtipo no se puede usar como una variable local y debe ser una variable miembro (es decir, de estado).

¿Hay alguna razón conceptual para que esto sea así? No puedo imaginar que esto no pueda implementarse como una variable de memoria.

Respuestas (1)

Tiene razón en que no hay una razón fundamental por la que las asignaciones no se puedan realizar en la memoria, pero la implementación tendría que ser muy diferente a la del almacenamiento.

En el almacenamiento, como se describe en este excelente artículo , la ubicación de almacenamiento de un elemento se indexa mediante un hash de la clave, además de algunas otras cosas. Esto funciona muy bien para el almacenamiento, que bajo el capó es fundamentalmente un almacén de clave=>valor implementado por EVM.

La memoria, sin embargo, está organizada de manera diferente. Las ubicaciones de memoria se indexan secuencialmente desde cero en bytes. Si escribe (o lee desde) una ubicación de memoria con un índice distinto de cero, toda la memoria hasta ese índice se asigna y se cobra en gas. Entonces, si toca solo la ubicación de memoria 1000, se le cobrarán 1000 bytes (1024 para ser precisos). El costo de gas de la asignación de memoria aumenta cuadráticamente con el tamaño asignado, por lo que pronto se vuelve costoso.

Por lo tanto, escribir en Memory[keccak256(key)]es básicamente inviable: asignaría una gran cantidad de memoria vacía desde cero hasta el valor hash de 256 bits de la clave. Con toda probabilidad un costo enorme.

Entonces, para hacer asignaciones en la memoria, se necesitaría la implementación de un almacén de clave => valor estrechamente limitado a la memoria. Estos existen, pero hasta ahora no están implementados por el compilador de Solidity.

Gracias @Benjaminion. Por lo tanto, el EVM mantiene un trie de todos modos, por lo tanto, agregar asignaciones realmente no agrega una sobrecarga en forma de configuración porque el sistema ya tiene un trie al que agregar. Sin embargo, si formó un trie en la memoria, tendría toda la sobrecarga de crear el trie, y eso es prohibitivo y ¿por qué no se ha hecho todavía? ¿Es esa una descripción justa?
Gran respuesta ... aunque esto realmente me está arruinando ...
@Benjaminion, ¿sigue siendo cierto hoy? Realicé un experimento y descubrí que Memory[keccak256(key)] no cuesta una cantidad de gasolina significativamente mayor de lo normal.