Solidity学习::(11)mapping映射类型
映射类型
作⽤:
映射是⼀种引⽤类型,存储键值对,提供根据键查值,与其它语⾔中的字典类似,但也有不同
定义(声明) :
由于在映射中键的数量是任意的,导致映射的⼤⼩也是变长的。映射只能声明为storage的状态变量,或被赋值给⼀个storage的对象引⽤。
声明举例:
mapping(uint => uint) stateVar;
赋值(建⽴映射):
storageRef[1] = uint(64);// 将64赋值给map映射的1
pragma solidity ^0.4.0;
contract StateVariableOnly{
//状态变量
mapping(uint => uint) stateVar;
//uint 对应 uint 这个映射就类似于数组了
//当然也可以string 对应 uint 等
function mappingTest() returns (uint){
//可以被赋值为storage的引⽤
mapping(uint => uint) storageRef = stateVar; //引⽤传值,传指针
storageRef[1] = uint(64);// 将64赋值给map映射的1
return storageRef[1];
}
}
solidity可建⽴映射的类型:
键除了映射,变长数组,合约,枚举,结构体以外的任意类型
值允许任意类型,甚⾄是映射
举例:
pragma solidity ^0.4.0;
contract MappingType{
struct s{
string name;
uint8 age;
}
mapping(bytes => s) structMapping;
mapping(address => s) addrMapping;
mapping(string => mapping(uint => s)) complexMapping;
}
setter⽅法:
对于映射类型,也能标记为public。以让Solidity为我们⾃动⽣成访问器。
测试代码:
pragma solidity ^0.4.0;
contract MappingGetter{
mapping(uint => uint) public intMapp;
mapping(uint => mapping(uint => string)) public mapMapp;
function set(){
intMapp[1] = 100;
mapMapp[2][2] = "aaa";
}
}
映射在区块链中的储存模型:
由于状态变量是存储在区块链上的,所以存储空间需要预先分配,但映射的存储值是可以动态增改的,那么最终是如何⽀持的呢。关于状态的存储模型⾥⾯提到,实际存储时是以哈希键值对的⽅式。其中哈希是由键值和映射的存储槽位序号拼接后计算的哈希值(映射只占⼀个槽位序号),也就是说值是存到由keccak256(k . p)计算的哈希串⾥,这⾥的k表⽰的是映射要查的键,p表⽰映射在整个合约中相对序号位置。
如何从哈希串提取到键值对信息?
答:可⽤web3.js提供的getStorageAt()⽅法将值取出来
getStorageAt的第⼀个参数是合约地址,第⼆个参数是键和映射所在槽序号的哈希值。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论