5 一个关于如何最快、最小成本遍历链上数据的问题。

假设一个情形,可能比较好讲:

我们假设开发一个链游,其中有一种道具(就叫矿石吧),具备“保质期”和“储能量”两个要素。矿石可以开采,但全网的总“储能量”是一定的。

矿石过了“保质期”,自动作废。

所以,一个矿工想开采矿石,首先需要判断:所有在“保质期”内的矿石的总储能量,有没有达到总储能量的红线。如果没有,才能采矿。

我们把每个矿石写成一个结构体,并定义一个“全网总储能量”的全局变量,假设1e18:

struct stone { uint effective;//有效期 uint energy;//储能 }

uint public energyLimit = 1e18;

并且把每一块被开采出来的矿石,列成一个数组,方便查询:

stone[] public stones;

接下来,我们要实现“采矿石”这个方法了,如前所述,我们要先判断目前在“保质期”内的所有矿石,他们的总储能有没有超过全网总储能的红线:

function mining() public {

uint totalEnergy = 0; //先定义“目前总储能” for(uint i = 0; i < stones.length; i++){ //遍历全局,判断哪些矿石在有效期,把他们各自的储能加起来 if(now <= stones[i].time){ totalEnergy += stones[i].energy; } } //然后判断“目前总储能”是否低于全网总储能上限 require(totalEnergy < energyLimit); //满足上述条件后,执行后面的语句 //.... }

那么问题就来了:

如果参与游戏的人很多,全网存在很多矿石,stone被实例化了成千上万次。 那么以上方法里那个for循环,需要遍历的对象库就会极度庞大,会不会导致程序执行极慢,甚至什么奇怪的东西溢出呢?

有什么更优良的解决办法吗?

请先 登录 后评论

最佳答案 2021-07-25 10:27

totalEnergy 可以声明个变量 uint public totalEnergy 。没必要每次算

请先 登录 后评论

其它 1 个回答

Tiny熊
  擅长:智能合约,以太坊
请先 登录 后评论
  • 2 关注
  • 1 收藏,2664 浏览
  • jimmy 提出于 2021-07-23 17:33