Как прочитать элемент mapping Solidity напрямую из хранилища

У старого контракта может отсутствовать публичный геттер. Если известна фактическая схема хранения Solidity, позицию значения можно вычислить по ключу и слоту объявления.

Рассчитайте позицию по адресу

Пусть в проверенной схеме mapping(address => uint256) credit занимает слот 3. Дополните 20-байтовый адрес нулями слева до 32 байт и запишите число 3 отдельным 32-байтовым словом. Соедините 64 байта и вычислите Keccak-256.

slot = keccak256(abi.encode(account, uint256(3)))

Передайте хеш как позицию в eth_getStorageAt для контракта на выбранном блоке. Декодируйте слово как uint256. Чтение самого слота 3 не вернёт элементы mapping.

Сопоставьте схему с развёрнутым кодом

Возьмите схему реализации, работавшей на той высоте. В случае прокси с delegatecall читайте хранилище по адресу прокси. У вложенного mapping добавляется ещё один этап хеширования, а для строковых и байтовых ключей применяются другие правила кодирования. docs.soliditylang.org Solidity storage layout