solidity struct 中经常会有嵌套 mapping
的情况:
pragma solidity >=0.6.0 <0.9.0;
struct Funder {
address addr;
uint amount;
}
contract CrowdFunding {
// 也可以在合约内部定义结构体,这使得它们仅在此合约和衍生合约中可见。
struct Campaign {
address beneficiary;
uint fundingGoal;
uint numFunders;
uint amount;
mapping (uint => Funder) funders;
}
uint numCampaigns;
mapping (uint => Campaign) campaigns;
function newCampaign(address payable beneficiary, uint goal) public returns (uint campaignID) {
// campaignID 作为一个变量返回,也就是说不一定要有return,而且函数的返回值定义中也可以初始化变量。
campaignID = numCampaigns++;
// 不能使用 "campaigns[campaignID] = Campaign(beneficiary, goal, 0, 0)"
// 因为RHS会创建一个包含映射的内存结构体 "Campaign",而映射只能是storage
Campaign storage c = campaigns[campaignID];
c.beneficiary = beneficiary;
c.fundingGoal = goal;
}
function contribute(uint campaignID) public payable {
Campaign storage c = campaigns[campaignID];
// 以给定的值初始化,创建一个新的临时 memory 结构体,
// 并将其拷贝到 storage 中。
// 注意你也可以使用 Funder(msg.sender, msg.value) 来初始化。
c.funders[c.numFunders++] = Funder({addr: msg.sender, amount: msg.value});
c.amount += msg.value;
}
function checkGoalReached(uint campaignID) public returns (bool reached) {
Campaign storage c = campaigns[campaignID];
if (c.amount < c.fundingGoal)
return false;
uint amount = c.amount;
c.amount = 0;
c.beneficiary.transfer(amount);
return true;
}
}
资料
https://zhuanlan.zhihu.com/p/388738378