泰岳区块链-合约⾯试题之solidity合约Mapping存储
⾯试题:Solidity中Mapping是如何存储的?
泰岳区块链采⽤的是EVM solidity合约。那么Map在solidity合约⾥⾯到底怎么存储的呢?我们写⼀个测试⽤例来测试⼀下。
pragma solidity ^0.6.0;
// SPDX-Licen-Identifier: MIT
contract Test1{
uint256 public pID;
漫画女孩uint256 public rID;徽菜
string public contractName;
//简单写⼀个玩家id,
mapping(uint256=>uint256) public plyid; //rid -> pid
周记100字小学mapping(address=>uint256) public plyAddr_id;
constructor() public{
rID = 1;
contractName = "test1";
}
function joinGame() public{
if (plyAddr_id[msg.nder] == 0){
pID++;
plyAddr_id[msg.nder] = pID ;
plyid[rID] = pID;
}
}
}
这个是⼀个简单的存储合约,⽤户地址可以调⽤。
⾥⾯存储的变量有:uint256 ,string 和map
先对solidity的存储有⼀个⼤概的了解。鸟叫声声大全
solidity存储分为两种:storage和memory 。storage存储是永久存储的(任何修改都需要消耗gas)storage⼀般放到构造函数声明,memory是临时存储,⽐如函数传参,返回值,函数内部调⽤。
针对这个⾯试题,主要是要了解storage。废话少说,直接进⼊调试模式。
激励自己的话简短
从这个图⾥⾯可以看到5个storage存储空间,刚好匹配的是我定义的5个存储,因为EVM存储都是存储在默克⽿树上⾯。所以都是
KEY/Value形式,
其中2,3,4 key 是0,1,2这些事标准的变量。分别是,pID,rID和contractName,另外两个map,其实都是根据map⾥⾯的
什么莺飞
咖喱火锅key/value来⽣成对于的存储key,⽐如5,就是我最开始的加⼊游戏⽣成的1,如果我再加⼊⼀个值,这个storage就会多出⼀个,也就是说吗:
小学德育
Map在solidity存储其实也就是key/value的存储。这个
key 0xf4f7797edbff68274daf92f2532a33b46087e1df1e392890bd510c458053e66c ⽣成是这么⽣成的,⾸选这个存储的是plyAddr_id它⾥⾯的key是address,所以会⽤这个address+偏移量,这些都是会扩产到32位去处理。最后拿相加的结果进⾏Hash。得到这个地址索引的key。