¿Cómo se implementan los punteros de almacenamiento en la capa EVM?

Estoy tratando de entender cómo funcionan los punteros de almacenamiento. Al observar la implementación de ethereumjs-vm, parece que el valor real se devuelve desde SLOAD. ¿El compilador maneja la funcionalidad del 'puntero'? (es decir, llama a SSTORE si se modifica).

Respuestas (1)

Sí, el compilador maneja la funcionalidad del puntero. No es necesario eliminar la referencia explícita de un puntero de almacenamiento cuando desee escribir o leer desde la ubicación de almacenamiento a la que apunta.

Creo que el hecho de que se llamen punteros es muy confuso. Me recuerda a los punteros de C, pero los punteros de almacenamiento en Solidity se parecen mucho más a las referencias de C++ o PHP que a los punteros de C.

Indicadores de solidez:

uint256[] public a;
constructor() public
{
    a.push(1);
    test(a);
}
function test(uint256[] storage b) private
{
    b[0] = 7;
    // a[0] is now 7
}

Referencias de C++ (similares a los punteros de Solidity):

int a = 1;
int& b = a;
b = 7;
// a is now 7

Referencias de PHP (también similares a los punteros de Solidity):

$a = 1;
$b = &$a;
$b = 7;
// a is now 7

Punteros C ( muy diferentes de los punteros Solidity):

int a = 1;
int* b = &a;
b = 7;
// a is now still 1
"el hecho de que se llamen punteros es muy confuso" <-- ¿Dónde ves que se les llame punteros? Pensé que la documentación de Solidity los llamaba referencias.
@smarx Dos extractos de la documentación de Solidity: "Por supuesto, este no es el caso si los punteros de almacenamiento se pasan como argumentos de función como en el caso de las bibliotecas de alto nivel". "Las matrices de memoria multidimensionales son punteros a las matrices de memoria".
Puaj. Estoy de acuerdo en que "referencias" es un término mucho mejor. Tal vez un error o una solicitud de extracción esté en orden.