Me gustaría declarar una variable como una matriz de memoria de punteros a matrices de almacenamiento de uint256
.
Por ejemplo:
pragma solidity ^0.4.24;
contract A
{
uint256[] public array0;
uint256[] public array1;
constructor () public
{
array0.push(123);
array1.push(456);
}
function test() public
{
uint256[][] memory storageArrays = new uint256[][](2);
storageArrays[0] = array0;
storageArrays[1] = array1;
storageArrays[0][0]++;
storageArrays[1][0]--;
}
}
Quiero que esto cambie los valores de array0
y array1
, pero no cambian porque las matrices de almacenamiento se copiaron implícitamente en la memoria. Este código solo cambia su copia en la memoria.
Esto se debe a que ambas dimensiones de la matriz están configuradas en memory
. Me gustaría que la primera dimensión de la matriz fuera storage
, y la segundamemory
Traté de declarar storageArrays
así:
uint256[] storage [] memory storageArrays = new uint256[][](2);
Pero da este error de sintaxis:
ParserError: Expected identifier but got '['
uint256[] storage [] memory storageArrays = new uint256[][](2);
^
¿Es posible? ¿Si es así, cómo? Gracias de antemano.
Solidity, de forma deliberada, no soporta punteros de memoria “a la C”, ni tiene ninguna aritmética de punteros en su lugar. Esto significa que incrementar o disminuir una variable de puntero no es una operación significativa. Puede hacer algo similar en el ensamblaje, pero debe administrar todo al nivel más bajo posible y sin pensar en poder sincronizar las variables de solidez y las variables de ensamblaje para cualquier versión futura del protocolo Ethereum.
Entiendo que desea colocar punteros de almacenamiento en una matriz de memoria ( storageArrays[0] = array0
) para que pueda actualizar el valor de almacenamiento de manera más eficiente más adelante...
... lamentablemente, la referencia al puntero de almacenamiento en esa matriz de memoria storageArrays[0 or 1]
es básicamente una copia de la memoria, junto con cualquier actualización de esa copia en sí, por lo que solo verá los cambios, el incremento y la disminución del valor uint en el storageArrays
cambio en la memoria .
En lo que a mí respecta, no es posible... y en realidad sería un riesgo de seguridad tener datos temporales (memoria) que tengan la capacidad de señalar y cambiar cualquier dato en el almacenamiento duro.
Al menos en Solidity, este parece ser el caso.
reyhaynes
jesús