通过链表来实现O(1) 复杂度的可迭代映射。
本系列文章有:
我们探索及讨论了在以太坊独特的EVM成本模型下编写高效Solidity代码的数据结构和实现技术。读者应该对Solidity中的编码以及EVM的总体工作方式有所了解。
译者注:O(1) 复杂度: 表示即便数量增加,gas 成本也会保持一样。
在上一篇文章中,我们讨论了使用Solidity编写智能合约同时控制 gas 成本的技术。在本文中,我们将讨论一种经常需要的具体数据结构:可迭代映射(Iterable Map)。
如你所知,原生的 Solidity 的 mapping
当前是不可以迭代的,但是我们将通过扩展映射数据结构来使其成为可能,从而以最小的 gas 成本开销支持迭代功能。
在整篇文章中,你将实现智能合约并与我们一起进行实验。如果你准备好了,那就开始吧!
我们想创建一个“学校”智能合约来收集学生地址。合约必须具有3个主要功能:
我们的School(学校)
智能合约将如下所示:
有2种简单的方法可以部分解决问题。但是,每种解决方案在某些情况下都有其自身的缺点。让我们详细探讨这两种解决方案。
mapping(address => bool)
我们使用映射来存储每个学生的存在。如果映射到给定地址的值是true,则表示该地址是我们的学生之一。虽然解决方案很简单,但是它有局限性,即它不支持获取所有学生。与大多数其他语言不同,在Solidity中,不支持迭代映射。 Solidity 代码如下所示。
简单的解决方案1。我们使用普通映射来存储学生地址。此解决方案不支持迭代。
address [] students
在此解决方案中,我们使用地址数组而不是映射。现在很明显,我们解决了第三个...
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!