语法
mapping(_keyType => _ValueType)
字典/映射其实就是一个一对一键值对存储关系。
举个例子:{age:18,stuId:10003,name:"Hisee"},age的值为18,stuId的值为10003,name的值为Hisee。
PS:Value可以相同,但KeyType不可以相同。
示例
pragma solidity ^0.4.4;
contract testMapping {
//0x5967eB267B40D68f479d1878dFAc3B73dAC05c0e
//0x68f5E0B7bA23CDaC76B55925546213b92156f217
//0x753335A5d86A1dba081a61b311b8F4698bf6EAfc
//定义一个名为balances的mapping类型,其键类型为address,值类型为uint。
mapping (address => uint) balances;
function update(address a, uint newBalance) {
balances[a] = newBalance;
}
function searchBalance(address a) constant returns (uint) {
return balances[a];
}
}
结构体和字典综合案例
背景:该案例是一个集资合约的案例,里面有两个角色,一个是投资人:Funder。另一个角色是运动员:Campaign,被赞助者。一个Funder可以给多个Campaign赞助,一个Campaign也可以接受多个Funder赞助。
pragma solidity ^0.4.4;
contract MappingAndStructs {
// 0x14723a09acff6d2a60dcdf7aa4aff308fddc160c 第一个运动员
// 0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db 第二个运动员
//定义一个Funder结构体,表示赞助人,有赞助人的钱包地址和出资金额两个类型。
struct Funder {
address addr; //赞助人地址
uint amount; // 给某个运动员的出资总额
}
// 定义一个运动的结构体。
struct Campaign {
address beneficiary; //运动员的钱包地址
uint fundingGoal; // 需要赞助的总额度
uint numFunders; // 有多少人赞助
uint amount; //已赞助的总额度
mapping (uint => Funder) funders; //按照索引存储赞助人的信息
}
uint public numCampaigns; // 统计运动员的数量
mapping (uint => Campaign) campaigns; //以键值对的形式存储被赞助人的信息
// 新增一个Campaign对象,需要传入受益人的地址和需要筹集的资金总额
function newCampaign(address beneficiary, uint goal) returns (uint campaignID) {
campaignID = numCampaigns++; //计算+1
//创建一个Campaign对象,并存储到‘campaigns’中。
campaigns[campaignID] = Campaign(beneficiary,goal,0,0);
}
// 通过campaignID给某个Campaign对象赞助。
function contribute(uint campaignID) payable {
Campaign storage c = campaigns[campaignID]; //通过campaignID获取campaignID对应的Campaign对象
c.funders[c.numFunders++] = Funder({addr:msg.sender,amount:msg.value}); //存储投资人的信息
c.amount += msg.value; //计算收到的总额度
c.beneficiary.transfer(msg.value); // 转账
}
// 检查某个campaignID编号的受益人集资是否达标,不达标返回false,否则返回true。
function checkGoalReached(uint campaignID) view returns (bool reached) {
Campaign storage c = campaigns[campaignID];
if(c.amount > c.fundingGoal){
return true;
}
return false;
}
}
}