本系列会详细解释智能合约案例,供大家感受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 数组中,用于记录所有捐款者的地址
}}
}
三、演示
文章来源:CSDN博主「发呆...」
文章原标题:《solidity案例详解(二)众筹合约》
旨在传播区块链相关技术,如有侵权请与我们联系删除。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。