Как реализованы указатели хранения на уровне EVM?

Я пытаюсь понять, как работают указатели хранения. Глядя на реализацию ethereumjs-vm, кажется, что фактическое значение возвращается из SLOAD. Обрабатывает ли компилятор функцию «указатель»? (т.е. вызывает SSTORE, если он изменен).

Ответы (1)

Да, компилятор обрабатывает функциональность указателя. Вам не нужно явно отменять ссылку на указатель хранилища, когда вы хотите записывать или читать из места хранения, на которое он указывает.

Я думаю, что тот факт, что они называются указателями, очень сбивает с толку. Это напоминает мне указатели C, но указатели хранения в Solidity гораздо больше похожи на ссылки C++ или PHP, чем на указатели C.

Указатели прочности:

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

Ссылки C++ (аналогично указателям Solidity):

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

Ссылки PHP (также похожие на указатели Solidity):

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

Указатели C ( очень отличаются от указателей Solidity):

int a = 1;
int* b = &a;
b = 7;
// a is now still 1
«тот факт, что они называются указателями, очень сбивает с толку» <-- Где вы видите, что их называют указателями? Я думал, что документация Solidity называет их ссылками.
@smarx Две выдержки из документации Solidity: «Конечно, это не так, если указатели хранилища передаются в качестве аргументов функции, как в случае с библиотеками высокого уровня». «Многомерные массивы памяти — это указатели на массивы памяти».
Фу. Я согласен, что "ссылки" - гораздо лучший термин. Возможно, ошибка или запрос на извлечение в порядке.