首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >像Kickstarter这样的众筹合同

像Kickstarter这样的众筹合同
EN

Ethereum用户
提问于 2018-09-18 16:22:48
回答 2查看 257关注 0票数 0

我正在学习一份用于群筹智能合同的教程,它的作用类似于Programtheblockchain链中的Kickstarter,但是当我试图将以太发送到合同中时,我总是会收到一个MetaMask错误,上面写着“在合同代码中抛出的异常”。它编译和部署都很好,但我不能让以太去做。这段代码是不是过时了,还是我做错了什么?

代码语言:javascript
复制
pragma solidity ^0.4.19;

contract Crowdfunding {
    address owner;
    uint256 deadline;
    uint256 goal;
    mapping(address => uint256) public pledgeOf;

    function Crowdfunding(uint256 numberOfDays, uint256 _goal) public {
        owner = msg.sender;
        deadline = now + (numberOfDays * 1 days);
        goal = _goal;
    }

    function pledge(uint256 amount) public payable {
        require(now < deadline);                // in the fundraising period
        require(msg.value == amount);

        pledgeOf[msg.sender] += amount;
    }

    function claimFunds() public {
        require(address(this).balance >= goal); // funding goal met
        require(now >= deadline);               // in the withdrawal period
        require(msg.sender == owner);

        msg.sender.transfer(address(this).balance);
    }

    function getRefund() public {
        require(address(this).balance < goal);  // funding goal not met
        require(now >= deadline);               // in the withdrawal period

        uint256 amount = pledgeOf[msg.sender];
        pledgeOf[msg.sender] = 0;
        msg.sender.transfer(amount);
    }
}

和我的部署代码

代码语言:javascript
复制
var Crowdfunding = artifacts.require("Crowdfunding");

module.exports = function(deployer){
    const numberOfDays = 1;
    const goal = web3.toWei(10, 'ether');   
deployer.deploy(Crowdfunding, numberOfDays, goal);
};
EN

回答 2

Ethereum用户

发布于 2018-09-18 17:33:51

您的合同没有后备的payable函数。您拥有的唯一payable函数是pledge函数,它不是回退函数。

因此,如果您只尝试将以太发送到契约而不显式调用pledge函数,则事务将失败,因为如果不显式调用pledge函数,合同将无法接受以太。

您可以在这里阅读更多有关回退函数的内容:https://www.bitdegree.org/learn/solidity-fallback-functions/

票数 2
EN

Ethereum用户

发布于 2018-09-18 17:35:38

这里有几件事情可能出了问题:

  1. 如果您只发送以太(不添加任何其他数据),它将无法工作,因为您没有一个回退函数(function ())。我建议在代码中添加一个备用函数。
  2. 您的amount可能不等同于msg.value。记住,msg.value在卫,所以如果你试图发送1以太,那么msg.value == 1000000000000000000魏。另外,您是否有理由使用行require(msg.value == amount);,而不是简单地在它下面的行中使用msg.value
票数 0
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/59002

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档