当前位置: 首页 > news >正文

智能合约中如何返回mapping

在 Solidity 中,直接返回一个 mapping 的所有数据是不可能的,因为 mapping 本身不支持直接遍历。但是,可以使用一些技巧来实现这一目标,例如通过维护一个额外的数组来跟踪 mapping 中的键,并通过这个数组来返回所有的键值对。

示例代码

假设有一个 mapping(uint256 => uint256),并且想要创建一个函数来返回该 mapping 的所有键值对,可以按照以下步骤操作:

  1. 维护一个额外的数组来存储所有的键
  2. 创建一个新的数组来存储键值对
  3. 使用循环来填充新数组
  4. 返回新数组
示例代码
pragma solidity ^0.8.0;contract MappingIteration {mapping(uint256 => uint256) public pledgeMap;uint256[] public pledgeKeys;function addEntry(uint256 _key, uint256 _value) public {pledgeMap[_key] = _value;// 如果键不存在于数组中,则添加到数组if (!contains(_key)) {pledgeKeys.push(_key);}}function contains(uint256 _key) private view returns (bool) {for (uint256 i = 0; i < pledgeKeys.length; i++) {if (pledgeKeys[i] == _key) {return true;}}return false;}function getAllEntries() public view returns (uint256[] memory, uint256[] memory) {uint256[] memory keys = new uint256[](pledgeKeys.length);uint256[] memory values = new uint256[](pledgeKeys.length);for (uint256 i = 0; i < pledgeKeys.length; i++) {keys[i] = pledgeKeys[i];values[i] = pledgeMap[keys[i]];}return (keys, values);}
}

解释

  1. 添加条目:

    • addEntry 函数在向 mapping 添加条目时,还会检查该键是否已经存在于 pledgeKeys 数组中,如果不存在,则添加到数组中。
  2. 遍历:

    • getAllEntries 函数创建两个数组 keysvalues,并将 mapping 中的所有键值对复制到这两个数组中。
  3. 包含检查:

    • contains 函数用于检查键是否已经存在于 pledgeKeys 数组中。

示例用法

假设想要从合约中获取 pledgeMap 的所有键值对,可以这样调用函数:

MappingIteration myContract = new MappingIteration();
myContract.addEntry(1, 100);
myContract.addEntry(2, 200);
myContract.addEntry(3, 300);(uint256[] memory keys, uint256[] memory values) = myContract.getAllEntries();

在这个例子中,keysvalues 数组将分别包含 pledgeMap 中的所有键和值。

注意事项

  • 在使用额外数组的方法时,要注意在删除条目时也需要更新数组。
  • 使用自定义库的方法需要更多的代码和维护工作,但提供了更灵活的功能。
http://www.lryc.cn/news/408716.html

相关文章:

  • nginx的学习(二):负载均衡和动静分离
  • 普中51单片机:DS1302时钟芯片讲解与应用(十)
  • Preact:轻量级替代React的选择
  • 全栈嵌入式C++、STM32、Modbus、FreeRTOS和MQTT协议:工业物联网(IIoT)可视化系统设计思路(附部分代码解析)
  • Greenplum数据库中的数据倾斜问题及处理方法
  • 缓存设计理论
  • IDEA-安装插件 驼峰下划线转换
  • 乾坤: 微前端项目切换时样式闪动(从无样式变为正常样式需要等 css chunk 文件加载完成, 加载延时受网速影响)
  • 《电子元器件之固态电容》
  • PLC 远程下载网关
  • 【Django】 读取excel文件并在前端以网页形式显示-安装使用Pandas
  • 自动控制:带死区的PID控制算法
  • 橙单后端项目下载编译遇到的问题与解决
  • EasyExcel 初使用—— Java 实现多种写入 Excel 功能
  • MySQL 和 SQL Server 中的连表更新 UPDATE JOIN 写法比较
  • 手把手教你FL Studio 24.1.1.4234中文破解安装激活图文激活教程
  • 使用Spring Boot与Spire.Doc实现Word文档的多样化操作
  • 从食堂采购系统源码到成品:打造供应链采购管理平台实战详解
  • 在window将Redis注册为服务
  • PHP商城案例
  • Linux:bash在被调用时会读取哪些启动文件?
  • 帆软FineReport之替换函数
  • Redis的应用场景及类型
  • 【图像处理】不智能的目标识别
  • 《500 Lines or Less》(5)异步爬虫
  • Transformer!自注意力机制的高层级理解Attention Is All You Need!
  • 关于使用Postman在请求https网址没有响应,但是用浏览器有响应的问题解决
  • 【React 】开发环境搭建详细指南
  • 结构体笔记
  • Elasticsearch:Golang ECS 日志记录 - zerolog