Хранение больших массивов на блокчейне 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.
Может кто-нибудь подсказать почему блокчейн расходует так много дискового пространства?