1. 程式人生 > >Solidify實現一個智慧合約12(字典/對映)

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