通过链表来实现O(1) 复杂度的可迭代映射。
本系列文章有:
1. [Solidity 优化 – 控制 gas 成本](https://learnblockchain.cn/article/1639)
2. [Solidity 优化 – 编写 O(1) 复杂度的可迭代映射](https://learnblockchain.cn/article/1632)
3. [Solidity 优化 – 维护排序列表](https://learnblockchain.cn/article/1638)
我们探索及讨论了在[以太坊](https://learnblockchain.cn/categories/ethereum/)独特的EVM成本模型下编写高效Solidity代码的数据结构和实现技术。读者应该对Solidity中的编码以及EVM的总体工作方式有所了解。
> 译者注:O(1) 复杂度: 表示即便数量增加,gas 成本也会保持一样。
在[上一篇文章](https://learnblockchain.cn/article/1639)中,我们讨论了使用Solidity编写智能合约同时控制 gas 成本的技术。在本文中,我们将讨论一种经常需要的具体数据结构:*可迭代映射(Iterable Map)*。
如你所知,原生的 Solidity 的 `mapping` [当前是不可以迭代的](https://learnblockchain.cn/docs/solidity/types.html#mapping-types),但是我们将通过扩展映射数据结构来使其成为可能,从而以最小的 gas 成本开销支持迭代功能。
在整篇文章中,你将实现智能合约并与我们一起进行实验。如果你准备好了,那就开始吧!
## 示例问题1:学校和学生
我们想创建一个“学校”智能合约来收集学生地址。合约必须具有3个主要功能:
1. 在合约中添加或删除学生。
2. 询问给定的学生地址是否属于学校。
3. 获取所有学生的名单。
我们的`School(学校)`智能合约将如下所示:

## 简单的解决方案(提示:方案不是很理想)
有2种简单的方法可以部分解决问题。但是,每种解决方案在某些情况下都有其自身的缺点。让我们详细探讨这两种解决方案。
### 简单的解决方案1:使用 `mapping(address => bool)`
我们使用映射来存储每个学生的存在。如果映射到给定地址的值是true,则表示该地址是我们的学生之一。虽然解决方案很简单,但是它有局限性,即它不支持获取所有学生。与大多数其他语言不同,在Solidity中,不支持迭代映射。 Solidity 代码如下所示。

> 简单的解决方案1。我们使用普通映射来存储学生地址。此解决方案不支持迭代。
### 简单的解决方案2:使用`address [] students`
在此解决方案中,我们使用地址数组而不是…
- 原文链接:https://medium.com/bandprotocol/solidity-102-2-o-1-iterable-map-8d905298c1bc,作者:[Bun Uthaitirat](https://medium.com/@taobunoi?source=post_page—–8d905298c1bc——————————–)
- 译文出自:区块链开发网翻译计划
- 译者:Tiny 熊
- 本文永久链接:learnblockchain.cn/article…
本系列文章有:
- Solidity 优化 – 控制 gas 成本
- Solidity 优化 – 编写 O(1) 复杂度的可迭代映射
- Solidity 优化 – 维护排序列表
我们探索及讨论了在以太坊独特的EVM成本模型下编写高效Solidity代码的数据结构和实现技术。读者应该对Solidity中的编码以及EVM的总体工作方式有所了解。
译者注:O(1) 复杂度: 表示即便数量增加,gas 成本也会保持一样。
在上一篇文章中,我们讨论了使用Solidity编写智能合约同时控制 gas 成本的技术。在本文中,我们将讨论一种经常需要的具体数据结构:可迭代映射(Iterable Map)。
如你所知,原生的 Solidity 的 mapping
当前是不可以迭代的,但是我们将通过扩展映射数据结构来使其成为可能,从而以最小的 gas 成本开销支持迭代功能。
在整篇文章中,你将实现智能合约并与我们一起进行实验。如果你准备好了,那就开始吧!
示例问题1:学校和学生
我们想创建一个“学校”智能合约来收集学生地址。合约必须具有3个主要功能:
- 在合约中添加或删除学生。
- 询问给定的学生地址是否属于学校。
- 获取所有学生的名单。
我们的School(学校)
智能合约将如下所示:
简单的解决方案(提示:方案不是很理想)
有2种简单的方法可以部分解决问题。但是,每种解决方案在某些情况下都有其自身的缺点。让我们详细探讨这两种解决方案。
简单的解决方案1:使用 mapping(address => bool)
我们使用映射来存储每个学生的存在。如果映射到给定地址的值是true,则表示该地址是我们的学生之一。虽然解决方案很简单,但是它有局限性,即它不支持获取所有学生。与大多数其他语言不同,在Solidity中,不支持迭代映射。 Solidity 代码如下所示。
简单的解决方案1。我们使用普通映射来存储学生地址。此解决方案不支持迭代。
简单的解决方案2:使用address [] students
在此解决方案中,我们使用地址数组而不是…
剩余50%的内容订阅专栏后可查看
本文参与区块链开发网写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。
- 发表于 2020-10-27 17:45
- 阅读 ( 3380 )
- 学分 ( 272 )
- 分类:Solidity
- 专栏:全面掌握Solidity智能合约开发