写点什么

solidity 案例详解(二)众筹合约

作者:BSN研习社
  • 2024-02-07
    浙江
  • 本文字数:1167 字

    阅读完需:约 4 分钟

solidity案例详解(二)众筹合约

本系列会详细解释智能合约案例,供大家感受 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 数组中,用于记录所有捐款者的地址                    }}          }
复制代码


三、演示





用户头像

BSN研习社

关注

还未添加个人签名 2021-11-05 加入

还未添加个人简介

评论

发布
暂无评论
solidity案例详解(二)众筹合约_区块链_BSN研习社_InfoQ写作社区