Tengo entendido que el mapping
tipo 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.
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.
franco
Alex
Maxareo