首页 > 其他分享 >【从0学习Solidity】7. 映射类型 mapping

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

时间:2023-09-27 15:02:59浏览次数:50  
标签:映射 Solidity mapping Value Key public


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

【从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 部署

【从0学习Solidity】7. 映射类型 mapping_键值对_02

  • 映射示例 2 初始值

【从0学习Solidity】7. 映射类型 mapping_原力计划_03

  • 映射示例 3 key-value pair

【从0学习Solidity】7. 映射类型 mapping_区块链_04

总结

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

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

如果这份博客对大家有帮助,希望各位给作者一个免费的点赞

标签:映射,Solidity,mapping,Value,Key,public
From: https://blog.51cto.com/u_15344421/7625408

相关文章

  • 【从0学习Solidity】 4. 函数输出
    【从0学习Solidity】4.函数输出博主简介:不写代码没饭吃,一名全栈领域的创作者,专注于研究互联网产品的解决方案和技术。熟悉云原生、微服务架构,分享一些项目实战经验以及前沿技术的见解。关注我们的主页,探索全栈开发,期待与您一起在移动开发的世界中,不断进步和创造!本文收录于不写代......
  • 【从0学习Solidity】 6. 引用类型, array, struct
    【从0学习Solidity】6.引用类型,array,struct博主简介:不写代码没饭吃,一名全栈领域的创作者,专注于研究互联网产品的解决方案和技术。熟悉云原生、微服务架构,分享一些项目实战经验以及前沿技术的见解。关注我们的主页,探索全栈开发,期待与您一起在移动开发的世界中,不断进步和创造!本......
  • 【从0学习Solidity】 5. 变量数据存储和作用域 storage/memory/calldata
    【从0学习Solidity】5.变量数据存储和作用域storage/memory/calldata博主简介:不写代码没饭吃,一名全栈领域的创作者,专注于研究互联网产品的解决方案和技术。熟悉云原生、微服务架构,分享一些项目实战经验以及前沿技术的见解。关注我们的主页,探索全栈开发,期待与您一起在移动开发的......
  • 【从0学习Solidity】 3. 函数详解
    【从0学习Solidity】3.函数详解博主简介:不写代码没饭吃,一名全栈领域的创作者,专注于研究互联网产品的解决方案和技术。熟悉云原生、微服务架构,分享一些项目实战经验以及前沿技术的见解。关注我们的主页,探索全栈开发,期待与您一起在移动开发的世界中,不断进步和创造!本文收录于不写代......
  • 3、SpringMVC之RequestMapping注解
    3.1、环境搭建创建名为spring_mvc_demo的新module,过程参考2.1节3.1.1、创建SpringMVC的配置文件<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/......
  • 智能合约-solidity
    智能合约-solidity语言学习Solidity是一种静态类型语言,这意味着每个变量(状态变量和局部变量)都需要在编译时指定变量的类型。Solidity提供了几种基本类型,并且基本类型可以用来组合出复杂类型。除此之外,类型之间可以在包含运算符号的表达式中进行交互。关于各种运算符号,可以参......
  • Ubuntu安装Samba(阿里云服务器、samba端口映射)Win10可访问
    1、安装Samba服务sudoapt-getinstallsamba #安装Samba服务器sudoapt-getinstallsmbclient #安装Samba客户端查看samba版本samba-V2、配置需要共享的目录#新建目录,用于共享mkdir/usr/local/volumes#更改权限信息sudochownnobody:nogroup/usr/local......
  • 综合概念映射和网络问题解决方法对学生学习成绩、感知和认知负荷的影响
    (Effectsofanintegratedconceptmappingandweb-basedproblem-solvingapproachonstudents’learningachievements,perceptionsandcognitiveloads) Computers&Education71(2014)77–86一、摘要研究目的:虽然学生可以通过适当的关键词有效地搜索到网络数据,并......
  • 418_RaiDrive—将网盘映射为磁盘
    这是一篇原发布于2020-02-0815:24:00得益小站的文章,备份在此处。前言前日写了篇教程免费申请officeE5开发者订阅,不仅能够激活office365,其中更包含了5T的onedrive空间。但onedrive的Windows客户端默认是同步盘,文件会自动同步到云端,但是此文件也同时占用你电脑的存储,虽可以通过......
  • windows+iis脚本映射方式实现伪静态(包括asp.net)
    一.Windows2008、2012或更高系统     只需要在设置脚本影射的目录下创建web.config文件,其内容为<?xml version="1.0" encoding="UTF-8"?>    <configuration>      <system.webServer>        <handlers>                   ......