Solidity 小白教程:7. 映射类型 mapping

Solidity 小白教程:7. 映射类型 mapping

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

映射 Mapping

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

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

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

映射的规则

  • 规则 1 :映射的**_KeyType只能选择 solidity默认的类型,比如 uint**,address 等,不能用自定义的结构体。而**_ValueType可以使用自定义的类型。下面这个例子会报错,因为_KeyType**使用了我们自定义的结构体:
solidity 复制代码
// 我们定义一个结构体 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**对应新增的键值对。例子:
solidity 复制代码
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**等。

相关推荐
BullSmall3 小时前
第三方软件安全-Dependency‑Track Docker 部署
安全·docker·容器
AImatters4 小时前
国产算力底座,支撑油气储运数字化迈过关键分水岭
安全·cpu·算力·海光·油气储运
叠叠乐7 小时前
中国移动家庭云电脑window关闭所有安全脚本
安全
Jmyd01237 小时前
实训室的 3D 模型涉及肖像文物,数据安全与合规怎么做?
安全·3d·数据安全·虚拟实训
芯盾时代7 小时前
《金融业网络安全管理办法(征求意见稿)》全条款深度拆解(三)
网络·安全·网络安全
敢敢是只喵i8 小时前
一个本地 AI Agent 要操作多个门店或 SaaS 账号,应该怎样安全切换身份?
人工智能·安全·ai·系统架构·业界资讯
Acrel12348 小时前
DC800V 大规模落地,算力机房安全该如何保障
安全
其实防守也摸鱼9 小时前
权限提升与横向移动:从内网渗透到域控的完整技术图谱
运维·服务器·数据库·安全·github·copilot·渗透
深圳海导科技9 小时前
资产防盗追踪系统:物联网高价值资产安全管理|海导科技navynav
科技·物联网·安全
波多利希最高礼仪的握力器10 小时前
安全复制SCP
linux·服务器·安全