Solidity 优化 - 编写 O(1) 复杂度的可迭代映射

  • Tiny熊
  • 更新于 2023-06-30 16:26
  • 阅读 8010

通过链表来实现O(1) 复杂度的可迭代映射。

本系列文章有:

  1. Solidity 优化 - 控制 gas 成本
  2. Solidity 优化 - 编写 O(1) 复杂度的可迭代映射
  3. Solidity 优化 - 维护排序列表

我们探索及讨论了在以太坊独特的EVM成本模型下编写高效Solidity代码的数据结构和实现技术。读者应该对Solidity中的编码以及EVM的总体工作方式有所了解。

译者注:O(1) 复杂度: 表示即便数量增加,gas 成本也会保持一样。

上一篇文章中,我们讨论了使用Solidity编写智能合约同时控制 gas 成本的技术。在本文中,我们将讨论一种经常需要的具体数据结构:可迭代映射(Iterable Map)

如你所知,原生的 Solidity 的 mapping 当前是不可以迭代的,但是我们将通过扩展映射数据结构来使其成为可能,从而以最小的 gas 成本开销支持迭代功能。

在整篇文章中,你将实现智能合约并与我们一起进行实验。如果你准备好了,那就开始吧!

示例问题1:学校和学生

我们想创建一个“学校”智能合约来收集学生地址。合约必须具有3个主要功能:

  1. 在合约中添加或删除学生。
  2. 询问给定的学生地址是否属于学校。
  3. 获取所有学生的名单。

我们的School(学校)智能合约将如下所示:

School合约

简单的解决方案(提示:方案不是很理想)

有2种简单的方法可以部分解决问题。但是,每种解决方案在某些情况下都有其自身的缺点。让我们详细探讨这两种解决方案。

简单的解决方案1:使用 mapping(address => bool)

我们使用映射来存储每个学生的存在。如果映射到给定地址的值是true,则表示该地址是我们的学生之一。虽然解决方案很简单,但是它有局限性,即它不支持获取所有学生。与大多数其他语言不同,在Solidity中,不支持迭代映射。 Solidity 代码如下所示。

School合约 - mapping实现

简单的解决方案1。我们使用普通映射来存储学生地址。此解决方案不支持迭代。

简单的解决方案2:使用address [] students

在此解决方案中,我们使用地址数组而不是映射。现在很明显,我们解决了第三个...

剩余50%的内容订阅专栏后可查看

点赞 1
收藏 3
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

2 条评论

请先 登录 后评论
Tiny熊
Tiny熊
0xD682...E8AB
登链社区发起人 通过区块链技术让世界变得更好而尽一份力。