本系列会详细解释智能合约案例,供大家感受 solidity 语言的魅力。
要求如下:要有受益人和资助者,且可以查看合约状态。
一、分步骤解释
// SPDX-License-Identifier: MIT
pragma 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: MIT
pragma 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 数组中,用于记录所有捐款者的地址
}}
}
复制代码
三、演示
评论