在以太坊区块链上存储大型数组

use*_*452 5 ethereum solidity smartcontracts

在研究以太坊智能合约的过程中,出现了如何在合约内存储大型结构(数组映射)的问题。有合同

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

doWork方法用数字数组填充地图 项,由外部脚本调用。同时,项目中出现的记录越多,消耗的磁盘空间就越快(对于 1,000,000 条,区块链大小约为 350 MB,对于 2,000,000 条,约为 1.1 GB,对于 19,000,000 条,约为 22 GB。这是 .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

据估计,映射中的一条记录大约需要 224 字节(7 * 32 字节),对于 19M 的记录,大约需要 4.2 GB。

感觉就像发生了内存泄漏。或者我不太明白如何分配内存来存储map

谁能解释为什么区块链消耗如此多的磁盘空间?

小智 1

磁盘空间的增加是预期的,因为映射中的每条记录都会消耗区块链上的存储空间。在以太坊中,存储以 32 字节块的形式分配,尽管每条记录估计大约需要 224 字节(7 * 32 字节),但元数据和索引需要额外的存储。