Хранение больших массивов на блокчейне Ethereum

В процессе изучения смарт контрактов Ethereum возник вопрос как хранить структуры большого размера внутри контракта (array или map). Имеется контракт

pragma solidity ^0.8.6;

contract UselessWorker {

    uint32 public successfullyExecutedIterations = 0;


    mapping(uint32 => uint32[6]) items;
    
    event ItemAdded(uint32 result);
    
    function doWork(int _iterations) public {
        for (int32 i = 0; i < _iterations; i++) {
          items[successfullyExecutedIterations] = [uint32(block.timestamp), successfullyExecutedIterations, 10, 10, 10, 10];
          successfullyExecutedIterations++;
        }
        emit ItemAdded(successfullyExecutedIterations);
    }
}

Метод doWork заполняет map items массивами чисел, вызывается внешним скриптом. При этом чем больше записей появляется в items тем быстрее расходуется место на диске (для 1000000 размер блокчейна около 200-300 Мб, для 19000000 размер блокчейна уже около 22Гб. это размер папки .ethereum/net/geth/chaindata/).

Тестирование провожу в приватной сети. Запускаю командой geth --mine --networkid 999 --datadir ~/.ethereum/net --rpccorsdomain "*" --allow-insecure-unlock --miner.gastarget 900000000 --rpc --ws --ws.port 8546 --ws.addr "127.0.0.1" --ws.origins "*" --ws.api "web3, eth" --rpc.gascap 800000000

По прикидкам одна запись в map должна занимать около 224 байт (7*32 байт) и для 19M записей это должно быть около 4,2 Гб.

Складывается ощущение, что происходит утечка памяти. Или я плохо понимаю как выделяется память для хранения map.

Может кто-нибудь подсказать почему блокчейн расходует так много дискового пространства?


Ответы (0 шт):