Solidify實現一個智慧合約12(字典/對映)
阿新 • • 發佈:2018-12-15
語法
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; } } }