首页 > 其他分享 >Solidity极简入门#7. 映射类型

Solidity极简入门#7. 映射类型

时间:2023-02-01 17:00:33浏览次数:50  
标签:极简 映射 Solidity mapping Value Key address public

这一讲,我们将介绍solidity中的哈希表:映射(Mapping)类型。

映射Mapping

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

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

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

映射的规则

  • 规则1:映射的_KeyType只能选择solidity默认的类型,比如uint,address等,不能用自定义的结构体。而_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(key)当成offset存取value。
  • 原理3: 因为Ethereum会定义所有未使用的空间为0,所以未赋值(Value)的键(Key)初始值都是各个type的默认值,如uint的默认值是0。

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

  • 映射示例 1 部署
  • 映射示例 2 初始值
  • 映射示例 3 key-value pair

总结

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

标签:极简,映射,Solidity,mapping,Value,Key,address,public
From: https://blog.51cto.com/sleep666/6031692

相关文章

  • Solidity极简入门#8. 变量初始值
    变量初始值在solidity中,声明但没赋值的变量都有它的初始值或默认值。这一讲,我们将介绍常用变量的初始值。值类型初始值boolean:falsestring:""int:0uint:0enum:枚举中......
  • ResultMap结果集映射
         让数据库中的列映射到实体类中的属性    ......
  • 好用的端口映射
    现在ipv4短缺,普通用户越来越难使用固定公网ip,好多都是大内网。外部无法访问。如果你有外部访问nas的需求。。你有远程办公的需求。。。你有远程内网电脑的需求。。。你有自......
  • Solidity极简入门#5. 变量数据存储和作用域
    Solidity中的引用类型引用类型(ReferenceType):包括数组(array),结构体(struct)和映射(mapping),这类变量占空间大,赋值时候直接传递地址(类似指针)。由于这类变量比较复杂,占用存储空间......
  • 配置之映射器说明
       ......
  • 【KAWAKO】MobaXterm-使用MobaSSHTunnel进行端口映射
    目录在Tools中打开MobaSSHTunnel(portforwarding)点击NewSSHtunnel配置信息点击运行访问端口在Tools中打开MobaSSHTunnel(portforwarding)点击NewSSHtunnel配置......
  • 【ASP.NET Core】动态映射MVC路由
    ASP.NETCore中的几大功能模块(RazorPages、MVC、SignalR/Blazor、Mini-API等等)都以终结点(EndPoint)的方式公开。在HTTP管道上调用时,其扩展方法基本是以Map开头,如 Map......
  • H5页面获取微信用户openid极简攻略
    背景之前每次写到获取openid就觉得特别麻烦,网上很多代码段会把一部分功能分开写,确实相对合理,但是对于复制粘贴代码来说依赖越少越方便,所以根据自己的经验做了一个极简的......
  • 基于AbstractProcessor扩展MapStruct自动生成实体映射工具类
    作者:京东物流王北永姚再毅1背景日常开发过程中,尤其在DDD过程中,经常遇到VO/MODEL/PO等领域模型的相互转换。此时我们会一个字段一个字段进行set|get设置。要么使......
  • 基于AbstractProcessor扩展MapStruct自动生成实体映射工具类
    作者:京东物流王北永姚再毅1背景日常开发过程中,尤其在DDD过程中,经常遇到VO/MODEL/PO等领域模型的相互转换。此时我们会一个字段一个字段进行set|get设置。要么使用工具类......