Solidity:在合约内循环还是只调用所有值?

问题描述

我有一个在以太坊网络上运行的 solidity 智能合约,它有一个公共映射,用于存储具有多个属性的结构。我必须遍历所有这些存储的结构,以查找可能唯一或不唯一的特定属性值(即 users['Joe'].age == "30")。这些可能会添加到 1000 多个结构体中,每个结构体大约有 6 个属性

在成本与性能方面,我应该怎么做?在合约内部运行一个内部循环并只得到我想要的结果,或者创建一个循环来单独调用所有结构,然后在区块链之外运行一个循环来找到它们?

我有点迷茫,在这里。谢谢。

解决方法

由于我还不能发表评论,我想我能做的就是回答......

由于关于您的情况的信息有限,我想我会首先确保您决定使用映射是最好的方法。我假设您已经确定它是比阵列更好的存储结构解决方案。

循环遍历智能合约中的项目是一种快速消耗 gas 的方法,并且可能很快让您达到区块 gas 上限。这基本上使检查某些东西的成本非常高,即使您没有找到您要找的东西。

仅从给出的信息来看,也许将这些数据存储在链外是最好的解决方案——只选择关键数据存储在链上。如果将所有内容都存储在链上至关重要,那么我相信您在链外运行循环是正确的。

我很新,所以请相信我之前的任何其他人。只是想扔掉我的 2 维。