Declarar una matriz de memoria de punteros de almacenamiento en Solidity

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 array0y 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 storageArraysasí:

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.

Discúlpeme si me equivoco, pero incluso si quisiera establecer la primera dimensión en el almacenamiento y los datos en ese almacenamiento en la memoria, y aumentara o disminuyera los datos, solo sería un cambio de memoria para los datos. sí mismo.
@ReyHaynes Quiero colocar punteros de almacenamiento en una matriz de memoria, no punteros de memoria en una matriz de almacenamiento.

Respuestas (2)

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