全面掌握Solidity智能合约开发

2024年11月25日更新 208 人订阅
原价: ¥ 26 限时优惠
专栏简介 比特币区块结构Merkle树及简单支付验证分析 非对称加密技术- RSA算法数学原理分析 智能合约语言 Solidity 教程系列2 - 地址类型介绍 剖析非同质化代币ERC721-全面解析ERC721标准 搞懂 Solidity 事件Event - 如何在DApp中使用 以太坊扩容 之 分片(Sharding) 智能合约语言 Solidity 教程系列12 - 库的使用 深入理解Plasma(四)Plasma Cash 技术工坊42期 - 区块链子链技术及墨客链的实现方案 脱颖而出 | 成都链安入选『腾讯区块链加速器全球32强』 参与Eth2 Staking系列(2) - 激励篇 应用案例之黄金资产证券化Digix白皮书和DGD解读 全面理解智能合约升级 测试文章123456 简析主流匿名币:Dash、门罗币、Zcash、SERO 以太坊ERC1155协议分析及代码测试 Hyperledger Fabric 1.4 Kafka分布式环境搭建 跟我学 Solidity :开发环境 跟我学 Solidity:关于变量 跟我学 Solidity : 变量的存储 跟我学 Solidity :引用变量 跟我学 Solidity :函数 跟我学 Solidity :合约的创建和继承 跟我学 Solidity :工厂模式 用Web3.js构建第一个Dapp 跟我学Solidity:事件 Solidity 中 immutable (不可变量)与constant(常量) [译] Solidity 0.6.x更新:继承 解析 Solidity 0.6 新引入的 try/catch 特性 探究新的 Solidity 0.8 版本 探索以太坊合约委托调用(DelegateCall) 停止使用Solidity的transfer() 使用工厂提高智能合约安全性 Solidity 怎样写出最节省Gas的智能合约[译] Solidity 优化 - 编写 O(1) 复杂度的可迭代映射 Solidity 优化 - 控制 gas 成本 Solidity 优化 - 减少智能合约的 gas 消耗的8种方法 Solidity 优化 - 如何维护排序列表 Solidity 优化:打包变量优化 gas 在 Solidity中使用值数组以降低 gas 消耗 Solidity 技巧:如何减少字节码大小及节省 gas 计算Solidity 函数的Gas 消耗 "Stack Too Deep(堆栈太深)" 解决方案 合约实践:避免区块Gas限制导致问题 如何缩减合约以规避合约大小限制 Solidity 类特性 安全的处理 ERC20 转账(解决非标准 ERC20 问题) Solidity 十大常见安全问题 [译]更好Solidity合约调试工具: console.log 智能合约开发的最佳实践 - 强烈推荐

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

  • Tiny熊
  • 发布于 2020-10-27 17:45
  • 阅读 1814

通过链表来实现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%的内容订阅专栏后可查看

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

1 条评论

请先 登录 后评论