Первое что важно понимать что приватными переменные являются только для других смарт контрактов. Сам по себе блокчейн это полностью публичные данные и утаить там что либо невозможно. Просто существует правило что к некоторым переменным нет доступа из других смарт контрактов.
Для публичный переменных смарт контрактов на этапе компиляции автоматически генерируются геттеры и мы можем считать их значения через static call нужного четера. А вот для приватных переменных такого удобства нет, и приходиться ковыряться во внутренностях хранилища каждого конкретного контракта.
Итак процесс получения приватной переменной любого смарт контракта можно разбить на два этапа:
1⃣ Выяснение расположения этой переменной в storage (номера слота и место в слоте)
2⃣ Считывание нужного слота данных и декодирование
Начнём с первого. Сначала нужно разобраться как данные хранятся в памяти смарт контракта, это называется storage layout. Вот вам аналогия:
Хранение данных в смарт-контрактах похоже на организацию конфетной фабрики. Давайте представим, что контракт - это огромная комната, а слоты - это полки для размещения сладостей.
Переменные -- это наши разноцветные конфеты, которые мы хотим сохранить. Мы располагаем их на полках (слотах) комнаты (хранилище контракта, storage).
Одна полка может вмещать до 32 конфетных ячеек (байт), поэтому более крупные сладости могут занимать несколько полок.
Когда мы считаем слоты, мы на самом деле считаем, сколько полок занимают наши конфеты.
Маленькие конфеты, такие как целые числа и булевы значения, занимают всего одну ячейку полки.
Но если у нас есть большая шоколадная плитка (массив или структура данных), она может занимать несколько полок в комнате.
Организация конфетной фабрики:
Чтобы оптимизировать нашу конфетную фабрику, мы стараемся упаковывать маленькие конфеты на одной полке и размещать их рядом для более эффективного доступа.
Когда у нас есть большие сладости, мы занимаем несколько полок и стараемся разместить их рядом друг с другом. Это называется packing.
Вот в принципе и все базовые концепции. Вообще про storage layout можно говорить ещё очень много. Вот материал с деталями и картинками:
https://programtheblockchain.com/posts/2018/03/09/understanding-ethereum-smart-contract-storageПосмотреть storage любого контракта
https://evm.storageВ следующем посте расскажу как этот самый сторадж считывать.
@web3_shool