本系列会详细解释智能合约案例,供大家感受 solidity 语言的魅力。
要求如下:要有受益人和资助者,且可以查看合约状态。
一、分步骤解释
// SPDX-License-Identifier: MITpragma solidity ^0.8.11;contract CrowFunding {
复制代码
1.
address public immutable beneficiary; uint256 public immutable fundingGoal;
复制代码
创建受益者和募集目标,immutable 为不可改变
2.
uint256 public fundingAmount; mapping(address=>uint256) public funders
复制代码
通过映射,表示每个地址对应的筹款金额。
mapping(address=>bool) private fundersInserted; address[] public fundersKey;
复制代码
每个地址是否已插入到 fundersKey 数组中。
bool public AVAILABLED =true;
复制代码
3.
//合约的初始状态是 AVAILABLED(真),表示合约当前可用。
constructor(address beneficiary_,uint256 goal_){ beneficiary =beneficiary_; fundingGoal = goal_; }
复制代码
初始化受益者的地址和募集目标。
4.
function contribute() external payable{ require(AVAILABLED,"crowFounding is closed");
复制代码
定义函数 contribute,判断募集是否关闭。
funders[msg.sender]+= msg.value; fundingAmount += msg.value;
复制代码
//增加捐款金额
5.
if(!fundersInserted[msg.sender]){
复制代码
//是否有捐款者的地址
fundersInserted[msg.sender] = true; fundersKey.push(msg.sender); }} }
复制代码
//将捐款者的地址添加到 fundersKey 数组中,用于记录所有捐款者的地址
}}
}
二、完整代码
// SPDX-License-Identifier: MITpragma solidity ^0.8.11;contract CrowFunding { address public immutable beneficiary; uint256 public immutable fundingGoal; //创建受益者和募集目标 uint256 public fundingAmount; mapping(address=>uint256) public funders; mapping(address=>bool) private fundersInserted; address[] public fundersKey; bool public AVAILABLED =true; //合约的初始状态是AVAILABLED(真),表示合约当前可用。 constructor(address beneficiary_,uint256 goal_){ beneficiary =beneficiary_; fundingGoal = goal_; } function contribute() external payable{ require(AVAILABLED,"crowFounding is closed"); funders[msg.sender]+= msg.value; fundingAmount += msg.value; //增加捐款金额 if(!fundersInserted[msg.sender]){//是否有捐款者的地址 fundersInserted[msg.sender] = true; fundersKey.push(msg.sender);//将捐款者的地址添加到 fundersKey 数组中,用于记录所有捐款者的地址 }} }
复制代码
三、演示
评论