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

2023-09-22 11:14:10

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

在这里插入图片描述

  • 博主简介:不写代码没饭吃,一名全栈领域的创作者,专注于研究互联网产品的解决方案和技术。熟悉云原生、微服务架构,分享一些项目实战经验以及前沿技术的见解。
  • 关注我们的主页,探索全栈开发,期待与您一起在移动开发的世界中,不断进步和创造!
  • 本文收录于 不写代码没饭吃 的学习汇报系列,大家有兴趣的可以看一看。
  • 欢迎访问我们的微信公众号:不写代码没饭吃,获取更多精彩内容、实用技巧、行业资讯等。您关注的是我们前进的动力!

这一讲,我们将介绍映射(Mapping)类型,Solidity中存储键值对的数据结构,可以理解为哈希表。

映射Mapping

在映射中,人们可以通过键(Key)来查询对应的值(Value),比如:通过一个人的id来查询他的钱包地址。

声明映射的格式为mapping(_KeyType => _ValueType),其中_KeyType_ValueType分别是KeyValue的变量类型。例子:

mapping(uint => address) public idToAddress; // id映射到地址
mapping(address => address) public swapPair; // 币对的映射,地址到地址

映射的规则

  • 规则1:映射的_KeyType只能选择Solidity内置的值类型,比如uintaddress等,不能用自定义的结构体。而_ValueType可以使用自定义的类型。下面这个例子会报错,因为_KeyType使用了我们自定义的结构体:
// 我们定义一个结构体 Struct
struct Student{
    uint256 id;
    uint256 score; 
}
    mapping(Student => uint) public testVar;
  • 规则2:映射的存储位置必须是storage,因此可以用于合约的状态变量,函数中的storage变量,和library函数的参数(见例子)。不能用于public函数的参数或返回结果中,因为mapping记录的是一种关系 (key - value pair)。

  • 规则3:如果映射声明为public,那么Solidity会自动给你创建一个getter函数,可以通过Key来查询对应的Value

  • 规则4:给映射新增的键值对的语法为_Var[_Key] = _Value,其中_Var是映射变量名,_Key_Value对应新增的键值对。例子:

    function writeMap (uint _Key, address _Value) public{
        idToAddress[_Key] = _Value;
    }

映射的原理

  • 原理1: 映射不储存任何键(Key)的资讯,也没有length的资讯。

  • 原理2: 映射使用keccak256(abi.encodePacked(key, slot))当成offset存取value,其中slot是映射变量定义所在的插槽位置。

  • 原理3: 因为Ethereum会定义所有未使用的空间为0,所以未赋值(Value)的键(Key)初始值都是各个type的默认值,如uint的默认值是0。

在Remix上验证 (以 Mapping.sol为例)

  • 映射示例 1 部署

7-1.jpg

  • 映射示例 2 初始值

7-2.jpg

  • 映射示例 3 key-value pair

7-3.jpg

总结

这一讲,我们介绍了Solidity中哈希表——映射(Mapping)的用法。至此,我们已经学习了所有常用变量种类,之后我们会学习控制流if-else, while等。

在这里插入图片描述

如果这份博客对大家有帮助,希望各位给作者一个免费的点赞👍作为鼓励,并评论收藏一下⭐,谢谢大家!!!
制作不易,如果大家有什么疑问或给作者的意见,欢迎评论区留言。

更多推荐

聚合支付备案对聚合支付系统及安全有何要求?

聚合支付备案,依据《收单外包服务机构备案管理办法》《收单外包服务机构自律规范》《关于加强收单外包服务市场规范管理的意见》等政策,对聚合支付系统及安全要求如下:对聚合支付机构要求一是聚合支付机构应当具备必要的、独立的系统、设施和技术,提供安全、稳定且可持续的聚合支付技术服务。其中,独立的系统是指聚合支付系统逻辑独立并与其

芯科科技第二代平台的所有蓝牙片上系统均可支持蓝牙技术联盟的新功能和新标准

中国,北京-2023年9月21日–致力于以安全、智能无线连接技术,建立更互联世界的全球领导厂商SiliconLabs(亦称“芯科科技”,NASDAQ:SLAB),今日宣布其支持蓝牙技术联盟(BluetoothSIG)针对蓝牙网状网络(BluetoothMesh)实现的新功能增强,以及他们新的网络照明控制(NLC)标准,

【从0学习Solidity】17. 库合约 站在巨人的肩膀上

【从0学习Solidity】17.库合约站在巨人的肩膀上博主简介:不写代码没饭吃,一名全栈领域的创作者,专注于研究互联网产品的解决方案和技术。熟悉云原生、微服务架构,分享一些项目实战经验以及前沿技术的见解。关注我们的主页,探索全栈开发,期待与您一起在移动开发的世界中,不断进步和创造!本文收录于不写代码没饭吃的学习汇报系

RHCE---时间服务器

文章目录目录文章目录前言一.安装时间服务器软件初始化系统二.配置时间服务器的服务端三.配置时间服务器的客户端四.远程连接服务器前言Linux中的时间服务器是指NTP服务器,NTP是NetworkTimeProtocol的缩写,即网络时间协议。NTP服务器可以提供精确的时间信息,从而使得网络上的所有设备都能够同步时间,确

表名注解/主键注解/字段注解/乐观锁注解[MyBatis-Plus系列] - 第486篇

悟纤:师傅,脑瓜疼~师傅:徒儿这是怎么了?​悟纤:师傅,你了解冷暴力吗?师傅:略懂略懂。悟纤:那冷暴力是怎么定义的?师傅:冷暴力是暴力的一种,其表现形式多为通过冷淡、轻视、放任、疏远和漠不关心,致使他人精神上和心理上受到侵犯和伤害。冷暴力是目前为社会公认的会对行为相对人造成心理、精神伤害的行为。悟纤:有点抽象呢。师傅:

爬虫代理在数据采集中的应用详解

随着互联网技术的不断发展,数据采集已经成为了各个行业中必不可少的一项工作。在数据采集的过程中,爬虫代理的应用越来越受到了重视。本文将详细介绍爬虫代理在数据采集中的应用。什么是爬虫代理?爬虫代理是指利用代理服务器来隐藏真实的IP地址,从而保护数据采集者的隐私和安全。在数据采集中,使用爬虫代理可以带来以下几个好处:防止被封

QT之QListWidget的介绍

QListWidget常用成员函数1、成员函数介绍2、例子显示图片和按钮的例子1、成员函数介绍1)QListWidget(QWidget*parent=nullptr)构造函数,创建一个新的QListWidget对象。2)voidaddItem(constQString&label)在列表末尾添加一个项目,项目标签为l

【python百炼成魔】Python循环语句:嵌套循环

前言文章目录前言嵌套循环嵌套的用途嵌套循环案例1.输出一个三行四列的矩形2.打印直角三角形3.写一个九九乘法表总结嵌套循环Python中的嵌套循环是指在一个循环体内部包含另一个循环。通过嵌套循环,我们可以在外部循环的每次迭代中,执行内部循环的所有迭代。嵌套循环可以帮助我们处理一些复杂的问题。嵌套循环的逻辑:forxin

算法leetcode|76. 最小覆盖子串(rust重拳出击)

文章目录76.最小覆盖子串:样例1:样例2:样例3:提示:进阶:分析:在这里插入图片描述题解:rust:go:c++:python:java:76.最小覆盖子串:给你一个字符串s、一个字符串t。返回s中涵盖t所有字符的最小子串。如果s中不存在涵盖t所有字符的子串,则返回空字符串""。注意:对于t中重复字符,我们寻找的子

外包干了2个月,技术退步明显...

先说一下自己的情况,大专生,19年通过校招进入湖南某软件公司,干了接近4年的功能测试,今年8月份,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试,已经让我变得不思进取,谈了2年的女朋友也因为我的心态和工资和我分手了。于是,我决定要改变现状,冲击下大厂。刚开始准备

[C/C++]天天酷跑超详细教程-中篇

个人主页:北·海🎐CSDN新晋作者🎉欢迎👍点赞✍评论⭐收藏✨收录专栏:C/C++🤝希望作者的文章能对你有所帮助,有不足的地方请在评论区留言指正,大家一起学习交流!🤗天天酷跑,一款童年游戏,主要是进行跳跃操作,和躲避障碍物,中篇主要实现人物的下蹲,随机障碍物的生成以及优化main函数里面的sleep(30)一.

热文推荐