千家信息网

以太坊众筹智能合约怎么实现

发表于:2025-02-02 作者:千家信息网编辑
千家信息网最后更新 2025年02月02日,本篇内容主要讲解"以太坊众筹智能合约怎么实现",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"以太坊众筹智能合约怎么实现"吧!实现一个好的idea常常需要付出
千家信息网最后更新 2025年02月02日以太坊众筹智能合约怎么实现

本篇内容主要讲解"以太坊众筹智能合约怎么实现",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"以太坊众筹智能合约怎么实现"吧!

实现一个好的idea常常需要付出巨大的努力,并且需要大量的资金。我们可以寻求用户捐赠,或者寻求投资机构投资,但这往往很难。对于捐赠,国内的风气不太好,资金去向往往不了了之,捐赠者对于当前的捐赠形式早已失去了信心。而风险投资,对于没有人脉的创业者来说,非常困难。 区块链提供了一种众筹的新形式--众筹智能合约。募资人通过众筹合约设定好众筹目标,以及完成时间,设定不同众筹结果所对应的操作(例如目标失败退回全款、目标成功时受益人获得加密代币或ETH)。由于区块链不可篡改的特性,众筹合约会是一个非常吻合的应用场景。

代币和分布自治组织

这个例子中我们将通过解决两个重要的问题进行更好的众筹:

  • 如何管理资金,保证流动性;

  • 筹集资金后如何花钱。

区块链出现之前的众筹项目一般缺少流动性,投资人一旦错过众筹截止时间将无法参与众筹;一旦参与众筹,投资人也不能中途退出。智能合约通过发行代币的形式来记录投资额,并提供了类似股票市场的流动性。投资人可以选择交易或者继续持有。项目成功后投资者可以使用代币交换实物或者产品服务。项目失败的话投资者可以按照原先的约定退出,并且继续持有代币以表纪念。

同样,当前众筹项目也存在资金去向不明的问题。在这个项目中,我们使用DAO(分布式自治组织)记录每一笔资金去向。

合约代码

先放上代码,然后再一步步解读。

pragma solidity ^0.4.16;interface token {    function transfer(address receiver, uint amount);}contract Crowdsale {    address public beneficiary;    uint public fundingGoal;     uint public amountRaised;     uint public deadline;     uint public price;    token public tokenReward;    mapping(address => uint256) public balanceOf;    bool fundingGoalReached = false;     bool crowdsaleClosed = false;     event GoalReached(address recipient, uint totalAmountRaised);     event FundTransfer(address backer, uint amount, bool isContribution);     /**     * Constrctor function     *     * Setup the owner     */    function Crowdsale(        address ifSuccessfulSendTo,         uint fundingGoalInEthers,                uint durationInMinutes,                uint etherCostOfEachToken,        address addressOfTokenUsedAsReward        ) {        beneficiary = ifSuccessfulSendTo;        fundingGoal = fundingGoalInEthers * 1 ether;        deadline = now + durationInMinutes * 1 minutes;        price = etherCostOfEachToken * 1 ether;        tokenReward = token(addressOfTokenUsedAsReward);    }    /**     * Fallback function     *     * The function without name is the default function that is called whenever anyone sends funds to a contract     */    function () payable {        require(!crowdsaleClosed);         uint amount = msg.value;        balanceOf[msg.sender] += amount;        amountRaised += amount;        tokenReward.transfer(msg.sender, amount / price);        FundTransfer(msg.sender, amount, true);    }    modifier afterDeadline() {        if (now >= deadline) _;     }    /**     * Check if goal was reached     *     * Checks if the goal or time limit has been reached and ends the campaign     */    function checkGoalReached() afterDeadline {        if (amountRaised >= fundingGoal){            fundingGoalReached = true;            GoalReached(beneficiary, amountRaised);        }        crowdsaleClosed = true;    }    /**     * Withdraw the funds     *     * Checks to see if goal or time limit has been reached, and if so, and the funding goal was reached,     * sends the entire amount to the beneficiary. If goal was not reached, each contributor can withdraw     * the amount they contributed.     */    function safeWithdrawal() afterDeadline {        if (!fundingGoalReached) {             uint amount = balanceOf[msg.sender];            balanceOf[msg.sender] = 0;            if (amount > 0) {                if (msg.sender.send(amount)) {                    FundTransfer(msg.sender, amount, false);                } else {                    balanceOf[msg.sender] = amount;                }            }        }         if (fundingGoalReached && beneficiary == msg.sender) {             if (beneficiary.send(amountRaised)) {                FundTransfer(beneficiary, amountRaised, false);            } else {                 //If we fail to send the funds to beneficiary, unlock funders balance                fundingGoalReached = false;            }        }    }}

构造函数中

fundingGoal = fundingGoalInEthers * 1 ether;deadline = now + durationInMinutes * 1 minutes;

ether和minutes是以太坊预留的关键字,1 ether == 1000 finney , 2 days == 48 hours。日期类型的关键字有seconds,minutes,hours, days,weeks,years,以太币单位预留的关键字有wei,finney,szabo,ether。1 finney == 1000 szabo,1 szabo == 10^12 wei。now也是以太坊预留的关键字,代表当前时间。

接下来我们实例化了一个合约:

tokenReward = token(addressOfTokenUsedAsReward);token的定义在代码开头:interface token {     function transfer(address receiver, uint amount){  }}

这里我们并未实现token合约,只是告诉编译器我们的token是一个合约,具有一个transfer()函数,并且在给定的地址上有这个合约。

接下来我们看看合约如何接收资金,相关代码如下:

function () {        require(!crowdsaleClosed);    uint amount = msg.value;    // ...

这个函数很特别,它没有名字,在solidity中我们称之为回退函数(Fallback function),回退函数没有参数,也没有返回值。如果合约接收ether,则必须明确定义回退函数,否则会触发异常,并返回ether。接收ether的函数必须带有关键字payable,否则会报错。

require语句先判断众筹是否结束,如果众筹已经结束,钱将退回给主叫方,避免主叫方出现不必要的损失。

部署通过之后可以用自己的测试账户向合约地址转账,这样就可以参与众筹了。

众筹成功后,如果继续往合约地址转账,钱将会退回你的账户。

到此,相信大家对"以太坊众筹智能合约怎么实现"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

合约 投资 函数 资金 以太 智能 关键 关键字 项目 代币 成功 代码 区块 去向 地址 形式 投资人 时间 流动性 目标 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 不可串行化 数据库什么意思 株洲软件开发培训收费多少 下列哪项不是数据库包含的文件 战地5刷飞机等级服务器进不了 国家网络安全电信日是哪一天 编程软件开发app下载 免费加油卡软件开发 本科有计算机网络技术这个专业吗 光域服务器崩了吗 知网数据库叫什么 黄石数据库修复 福建服务器机柜定做云空间 学校网络安全教育宣传信息 计算机网络安全的书 数据库rsync 网络安全中sws是什么协议 65岁以上人群疾病数据库 饥荒联机版搜不到别人开的服务器 青少年网络安全教育新闻 机器学习服务器安装教程 java 数据库 锁 王_是什么意思数据库中 医院网络安全技术应用 深圳和成都软件开发待遇 网络技术工程师的称呼 微软公司软件开发方面的证件 微信小程序的后台服务器代码 数据库管理工程师需要学习什么 网络安全风险态势图解 连按不到服务器
0