solidity中的Mapping遍历 案例

Solidity 遍历mapping 以太坊基金会为我们提供了以uint为例子的遍历mapping的库(iterable_mapping)。 insert 方法 function insert(itmap storage self, uint key, uint value) returns (bool replaced) { uint keyIndex = self.data[key].keyIndex; ... 阅读详情
pragma solidity ^0.4.18;

// mapping 遍历库
library IterableMapping {

    // 增、删、改、查
    struct itmap {
        uint size;
        mapping(uint => IndexValue) data;
        KeyFlag []keys;
        // value
    }

    // key值的列表
    struct KeyFlag {
        uint key;
        bool deleted;
    }

    // value
    struct IndexValue {
        uint KeyIndex;
        uint value;
    }


    // 插入数据
    function insert(itmap storage self, uint key, uint value) returns(bool replaced) {
        uint keyIdx = self.data[key].KeyIndex;
        self.data[key].value = value;
        if (keyIdx > 0) {
            return true;
        }else {
            keyIdx = self.keys.length++;
            self.data[key].KeyIndex = keyIdx + 1;
            self.keys[keyIdx].key = key;
            self.size++;
            return false;
        }
    }

    // 删除数据(逻辑删除)
    function remove(itmap storage self, uint key) returns(bool) {
        uint keyIdx = self.data[key].KeyIndex;
        if (keyIdx == 0) {
            return false;
        } else {
            delete self.data[key]; //逻辑删除
            self.keys[keyIdx - 1].deleted = true;
            self.size --;
            return true;
        }
    }

    // 获取数据
    function iterate_get(itmap storage self, uint KeyIdx) returns(uint key, uint value) {
        key = self.keys[KeyIdx].key;
        value = self.data[key].value;
    }

    // 包含
    function iterate_contains(itmap storage self, uint key) returns(bool) {
        return self.data[key].KeyIndex > 0;
    }

    // 获取下一个索引
    function iterate_next(itmap storage self, uint _keyIndex) returns(uint r_keyIndex) {

        _keyIndex++;
        while(_keyIndex < self.keys.length && self.keys[_keyIndex].deleted) {
            _keyIndex++;
        }
        return _keyIndex;
    }

    // 开始遍历
    function iterate_start(itmap storage self) returns(uint keyIndex) {
        iterate_next(self, uint(-1));
    }

    // 循环退出条件
    function iterate_valid(itmap storage self, uint keyIndex) returns(bool) {
        return keyIndex < self.keys.length;
    }
}

 

pragma solidity ^0.4.18;
import "./Mapping.sol";
// 调用合约
contract User {
    IterableMapping.itmap data;

    // 插入数据
    function insert(uint key, uint value) returns(uint size) {
        IterableMapping.insert(data, key, value);
        return data.size;
    }

    // 遍历求和
    function sum() returns(uint s) {
        for(var i = IterableMapping.iterate_start(data);
            IterableMapping.iterate_valid(data, i);
            i = IterableMapping.iterate_next(data, i)) {
            var (key ,value) = IterableMapping.iterate_get(data, i);
            s += value;
        }
    }
}

 

Solidity之Mappings篇 你只需要通过传入**_KeyType**参数给getter就能返回**_ValueType.**关键数据不是储存在一个mapping中的,相反的它的keccak256 hash值用来存储关键数据指向的value值。Solidity中****Mappings**** 的概念类似于java中的hashmap或者python中的dictionnary。可以记录一个counter的计数器,来告诉你mapping的长度当有新增的value值的时候。# 关于****Mappings**** 阅读详情

相关推荐

Solidity中的mapping为何不提供按照key遍历的功能?

举个例子 pragma solidity ^0.6.12; contract Test { mapping(uint256 => uint256) numMap; function testMap() public { numMap[1001] = 1; } } 这个Test合约定义了一个mapping数据结构numMap,key和value都是uint256类型 使用solc生成汇编: solc --bin --asm --optimize Test.sol

biakia的专栏 1068

solidity 遍历mapping, 获取mapping 长度

solidity 遍历mapping, 获取mapping 长度

lovo1的专栏 313

多目标优化NSGA-II(快速精英非支配排序遗传算法)及python实现

文章目录前言一、什么是NSGA-II?二、学习NSGA-II1.快速非支配排序算法2.密度估计3.拥挤比较算子4.主循环5.代码6.总结 前言 NSGA-II适用于复杂的多目标优化问题,是K-Deb教授在2000年在一篇paper《MOEAs — A fast and elitist multi-objective genetic algorithm: nsga2》提出。 Keywords: optimization; multi-objective evolutionary algorithm; no

ricky_blog 9745

Solidity极简入门|第六讲:映射类型 mapping、控制流

映射 Mapping在映射中,人们可以通过键(Key)来查询对应的值(Value),比如:通过一个人的 id 来查询他的钱包地址。声明映射的格式为 mapping(_KeyType => _ValueType),其中 _KeyType 和 _ValueType 分别是 Key 和 Value 的变量类型。例子:映射的规则规则 1:映射的 _KeyType 只能选择 solidity 默认的类...

weixin_31351409的博客 408

MIT 18.03 微分方程 ODE 学习笔记分享——目录

从B站上看到了MIT 微分方程的课程,觉得老爷子讲的真好! 其实微分方程对于工科来说相当重要,但是很多学习也仅把他放在高数里作为单独的一个章节来讲,这是远远不够的。所以对于同学们来说 ,一定要认真听讲,做好笔记! 以下是我的个人学习比较分享。有需要的同学可以做一个参考。 注:个人认为笔记的作用是用来回想起课堂所讲的内容(细节),所以我的笔记风格为以老师讲课思路为准,板书为辅。建议刚开始听这门课的同...

weixin_40664094的博客 2630

飞书应用开发脚手架lark-harness:从零构建企业级机器人

在构建企业级应用时,开发脚手架是提升工程效率和规范性的关键工具。其核心原理在于通过预设的项目模板、最佳实践和通用模块封装,自动化处理项目初始化、配置管理和基础架构搭建。这种技术价值在于将开发者从重复性劳动中解放出来,确保团队技术栈统一,并降低维护成本。在Node.js生态中,脚手架常与Express或Koa等Web框架结合,用于快速构建Web服务、API接口和实时事件处理系统。具体到飞书开放平台开发场景,开发者需要处理OAuth 2.0授权、事件订阅验证、消息加解密等复杂且标准的流程。lark-harnes

weixin_30703911的博客 613

Base项目映射类型详解:高效数据存储与查询的终极指南 [特殊字符]

Base项目中的映射(Mapping)类型是Solidity智能合约开发中实现高效数据存储与快速查询的核心工具。本文将通过实际项目代码示例,带你掌握映射类型的基础用法、高级技巧及最佳实践,让你的合约开发效率提升300%! ## 🔍 什么是Solidity映射类型? 映射(Mapping)是Solidity中一种键值对存储结构,类似于其他编程语言中的哈希表或字典。它允许你通过唯一键快速查找对应

gitblog_07343的博客 439

YOLO26涨点改进| TGRS 2026 | 独家创新首发、注意力改进篇| 引入CSSCA频谱-空间交叉注意力,含多种创新改进,小目标检测、图像分割、高光谱图像分类、语义分割任务任务涨点

🔥本文提出CSSCA(频谱-空间交叉注意力)模块,通过中心像素引导的光谱与空间交叉注意力机制,有效提升YOLO26模型的特征表达能力。该模块实现了光谱与空间信息的协同优化,能够自适应强化关键通道与重要空间区域,增强模型对小目标和复杂场景的感知能力。文章详细介绍了CSSCA的网络结构、工作原理及四大优势,包括精准特征表达、协同信息优化、小样本适应性和轻量化设计。同时提供了完整的代码实现和四种改进方案的YAML配置文件,包括基础版、增强版、C3k2融合版和C2PSA融合版,为YOLO26模型的性能提升

Ai缝合怪、助力小伙伴高效发论文 269

大白话解析:​​Solidity 中的“映射(mapping)”​​

这表示:每个地址(用户)对应一个 uint 类型的余额。​​Solidity 中的 mapping,就是一个通过“键”瞬间找到“值”的超级对照表,类似字典或表格,但它不能直接列出所有内容,适合用来高效存储和查询一对一的数据关系。​​。

weixin_58431882的博客 1223

Fiori Elements 表格之 Tree Tables:从数据建模到交互行为的全链路剖析

SAP Fiori elements的Tree Table组件将分层数据以表格形式展示,支持展开/折叠操作,适用于组织结构、物料清单等多级数据场景。该组件在List Report和Object Page中均可使用,支持懒加载、多选、列冻结等标准表格功能,并与OData V4服务层级注解深度集成。后端需通过RAP或CAP建模提供层级数据,前端通过清单配置切换表类型。需注意在草稿模式下仅显示活动实体,且展开状态在编辑时不保留。性能方面建议采用懒加载策略,避免全量加载树节点。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 160

Autosar CAN 网络管理标准文档

Autosar CAN 网络管理标准文档

蚂蚁小兵 925

用通俗易懂的方式解释 Solidity 中的 library、mapping 和 event

console.log(`${event.from} 转给 ${event.to} ${event.amount} 个 Token`);// 调用库中的 add 函数(像调用成员函数一样):当合约中发生重要事情(如转账)时,触发一个事件,告诉外界发生了什么。像是一个装满了工具的箱子,里面定义了可复用的函数,供其他合约调用。:类似现实中的电话簿,通过“名字”(键)快速查找“号码”(值)。// 记录每个地址的余额(地址 → 余额):工具箱,装可复用的函数(如防止溢出的数学工具)。

小宝哥Code的专栏 974

2025年GESP3月认证C++五级真题解析

小 A 有 2n 件物品,小 B 和小 C 想从小 A 手上买走这些物品。对于第 i 件物品,小 B 会以 bi 的价格购买,而小 C 会以 ci 的价格购买。对于所有测试点,保证 1 <= T <= 100, 2 <= g < p <= 10^9, g, p 为整数, p 为质数。对于所有测试点,保证 1 <= n <= 10^5, 0 <= bi, ci <= 10^9, bi, ci 为整数。对于另外 50 % 的测试点,保证 n <= 100000, 0 <= bi, ci <= 10^9。

lan_in的博客 1036

Solidity学习 - 映射(mapping)

在Solidity智能合约开发中,映射(mapping)是一种非常重要的数据结构,它提供了键值对的映射关系存储功能,类似于Java中的Map或Python中的Dict。本文将详细介绍Solidity中映射的定义、特性、使用场景以及相关操作,帮助开发者更好地理解和应用这一数据结构。映射类型是一种键值对的映射关系存储结构,在合约中常充当类似数据库的角色。映射的定义形式为,其中KeyType表示键的类型,ValueType表示值的类型。通过键可以获取对应的值,例如。

本郡主是喵 926

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

智能合约中如何返回mapping

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

以择人之心择己,以恕己之心恕人。 3222

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Solidity 合约设计与功能 5| 数据结构--映射(Mapping)

Solidity中的映射(mapping)是一种高效的键值对数据结构,用于存储和查找数据。它类似于其他语言的哈希表,但具有独特特性:仅能作为状态变量存储在区块链上,不实际存储键值而是使用哈希定位,且无法直接遍历或获取长度。映射支持嵌套结构,适合代币余额、权限管理等场景。与数组相比,映射查找更快但不可迭代,常需配合数组实现遍历功能。文中提供了银行账户系统的完整实现示例,展示映射的基本操作(存取款)及注意事项,如默认值处理和Gas成本优化。

庭前云落的博客 530

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

【从0学习Solidity】映射类型mapping

总结一下,在Solidity编程语言里面,“mapping”类型提供了一种灵活且强大的方式来管理和操作数据集合。在Solidity中,映射类型(mapping)是一种关键的数据结构,它允许我们在键值对中存储和检索数据。映射类型的工作方式类似于哈希表或字典,在其他编程语言如Python或JavaScript中也有类似的概念。的私有变量, 它将地址(address) 映射到另一层 mapping 中去. 这个内部 mapping 将地址(address)再次映像到布尔值 (bool)。关键字来声明一个映射。

高性价比服务器就选:蓝易云 825

Solidity编程语言:字节数组、Mapping

字节数组 字节数组可以看作一种特殊的数组,其元素类型是字节。在类型声名时有其专有的声名方式。作为数组他有不固定长度字节数组和固定长度字节数组。 固定长度字节数组 pragma solidity >=0.4.0 <0.6.0; contract EgFixedByteArray { byte[5] ba5; bytes5 bs5; function modify() public{ ...

weixin_43932460的博客 1036

solidity编程中遇到的各种问题--数据结构篇

solidity的数据结构 1.Mapping的删除 情景:在完成合约的一些交易后要将本次使用过的一些mapping数据删除(或重置),以供下次或其他人使用合约的状态变量 注意: mapping的delete:只是删除对应某个key的value,而不能直接删除整个mapping,所以要想删除该mapping的每一个key时,往往要把每一个key放进一个动态数组,然后遍历该数组进行删除。 问题:如果要删除一个mapping里的另一个mapping,是直接删除外层mapping,还是要把里层mapping的每个

qq_40411401的博客 886

Solidity05 Solidity 引用类型

Solidity 引用类型

J_Lee 1449

Solidity 合约设计与功能 6| 数据结构--可迭代映射 (Iterable Mapping)

本文摘要: Solidity中的映射类型无法直接遍历或获取大小,因此提出了可迭代映射的实现方案。通过维护一个键数组和插入标记映射,构建了具备遍历功能的映射结构。核心实现包括:1) 使用set函数更新余额并记录新键;2) 通过getSize获取键数组长度作为映射大小;3) 通过索引访问特定元素的余额。文中提供了完整合约代码,包含余额映射、键数组和插入标记三个核心数据结构,实现了设置余额、获取大小和按索引查询功能。测试要求验证添加地址、获取大小和查询首尾元素余额的正确性。该方案解决了Solidity映射不可遍历

庭前云落的博客 250

mapping映射

用 struct 来“描述对象”,用 mapping 来“快速查找对象”。struct 定义数据结构,mapping 做索引存储。

sj18838107211的博客 483

Solidity - 035 WhileLoop

These comments are designed to provide detailed insights into each part of the contract, from the purpose of the mapping and counter to the specifics of how the while loop functions.

m0_61408373的博客 941

Solidity的地址 数组如何判断是否包含一个给定的地址?

Q: givenaddress[] wallets. What is the correct method to check that the list contains a given address? Does solidity provide any native list contains function? If not, is the only way to d...

weixin_30315905的博客 1893

mapping复杂映射以及映射数据的增加与移除处理

4. 嵌套映射的移除:若为嵌套映射(如mapping(address => mapping(address => uint256))),需逐层处理——先移除内层映射的值,再处理外层(如设为默认值或标记为不存在)。在Solidity中,mapping(映射)的数据操作核心是**“键值对的新增/更新”和“逻辑上的移除”**(因映射无法真正删除键,需通过标记或清零实现“移除”效果)。• 对“键需彻底不可见”的场景:额外用数组记录已存在的键,移除时从数组中删除(需配合映射标记)。

haizhongjien的博客 846
上一篇: DAPP与传统web开发的区别
下一篇: 宠物商店分析与合约实现
The_Reader
博客等级 码龄10年 74粉丝 97原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值