以太坊--众筹ICO实现

github首页:区块链学习有用链接和25本区块链书籍可免费阅读

  • 地址:https://github.com/cancerts/study-blockchain-referrence 点击这

第三节 我是实现了token的一些高级功能,如增发,冻结,撤销等,这一小节我就来实现一个众筹的项目ICO,我在学习solidity的时候好像也看见几个合约的例子,其中一个就是众筹的例子,好久了,我不记得了,大家可以去官网下载solidity去看一下,其中就有一个,今天呢,用自己的规则来实现,要完成一个众筹需要完成以下的内容:

众筹就是在约定的时间,完成约定的目标金额

第一步:设定众筹目标

众筹的目标金额,时间,兑换的价格,以及受益人

contract ico is owner{
    uint public fundingGoal;
    uint public  deadline ;
    uint public price;
    token public tokenReward;
    address public beneficiary;
 
    constructor(uint fundingGoalInEthers,uint durationInMinutes,uint costOfEachToken,address addressOfToken)public{
        fundingGoal=fundingGoalInEthers*1 ether;
        deadline=now + durationInMinutes* 1 minutes;
        price=costOfEachToken* 1 ether;
        tokenReward=token(addressOfToken);
        beneficiary=msg.sender;
        
    }
}

第二步: 实现以太和代币的兑换

我们知道,我们众筹是通过代币来完成的,但是,代币是没有价值的,只是作为一个交换的媒介

function() public payable{
        require(now

第三步:受益人提款或是投资人退款

当目标完成,大家都开心,齐了融融,万一达不到,也不至于去跳海把,好吧,开玩笑,这就是合约的魅力之处在于,没有达到预定的值,自动原路返回你投的钱

function checkGoalReached()public afterDeadline{
         if(fundAmount>=fundingGoal){
             emit CheckGoal(true);
         }   
    }
    
    function withdramal()public afterDeadline{
       
        if(fundAmount>=fundingGoal){
            if(beneficiary==msg.sender){
                 beneficiary.transfer(fundAmount);
            }
           
        }else{
            uint amount=balanceOf[msg.sender];
            if(amount>0){
                msg.sender.transfer(amount);
                balanceOf[msg.sender]=0;
            }
        }
    }

最主要的就是要实现以上的这三步,当然还有一些为了安全和健壮做的一些添加和代码的修改

下面将完整代码给出来,大家作为一参考

pragma solidity ^0.4.20;

import './owner.sol';
//===========
//转账接口
//==========
interface token{
   function transfer(address _to,uint amount) external ;
}
//=====================================================
//ico合约,继承token的owner,另外定义一个账本保存信息和两个事件输出显示众筹实现输出信息
//=====================================================
contract ico is owner{
    uint public fundingGoal;
    uint public  deadline ;
    uint public price;
    uint public fundAmount;
    token public tokenReward;
    address public beneficiary;
    mapping(address=>uint )public balanceOf;
    event FundingTransfer(address backer ,uint amount);
    event CheckGoal(bool success);
    //===========================================================================
    //构造函数,定义了众筹的目标,截止时间,每个代币的价格,还有就是投资人的收益哦
	//===========================================================================
	
    constructor(uint fundingGoalInEthers,uint durationInMinutes,uint costOfEachToken,address addressOfToken){
        fundingGoal=fundingGoalInEthers*1 ether;
        deadline=now + durationInMinutes* 1 minutes;
        price=costOfEachToken* 1 ether;
        tokenReward=token(addressOfToken);
        beneficiary=msg.sender;
        
    }
    //============================
	//代币所有者拥有设定价格的权限
	//============================
	
    function setPrice(uint costOfEachToken )public onlyOwner{
         price=costOfEachToken* 1 ether;
    }
    //===========================
	//实现代币和以太币的自动兑换
	//===========================
    function() public payable{
        require(now=deadline);
         _;
    }
    //============================
	//达到目标值输出事件,成功true
	//============================
	
    function checkGoalReached()public afterDeadline{
         if(fundAmount>=fundingGoal){
             emit CheckGoal(true);
         }   
    }
    //====================================================
	//到达预定时间没有达到目标筹集值,将筹集到的金额返回
	//====================================================
    function withdramal()public afterDeadline{
       
        if(fundAmount>=fundingGoal){
            if(beneficiary==msg.sender){
                 beneficiary.transfer(fundAmount);
            }
           
        }else{
            uint amount=balanceOf[msg.sender];
            if(amount>0){
                msg.sender.transfer(amount);
                balanceOf[msg.sender]=0;
            }
        }
    }
}

哈哈,皮皮,记录一下今天中国和韩国的争夺中夺冠了,第一枚金牌就是那么的洋气,真的佩服,鲜花,掌声送给社会人

你可能感兴趣的:(以太坊)