Solidify实现一个智能合约12(字典/映射)

语法

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;
  }
}
  
}

 

你可能感兴趣的:(区块链智能合约)