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 字节),但元数据和索引需要额外的存储。
| 归档时间: |
|
| 查看次数: |
807 次 |
| 最近记录: |