我正在学习一份用于群筹智能合同的教程,它的作用类似于Programtheblockchain链中的Kickstarter,但是当我试图将以太发送到合同中时,我总是会收到一个MetaMask错误,上面写着“在合同代码中抛出的异常”。它编译和部署都很好,但我不能让以太去做。这段代码是不是过时了,还是我做错了什么?
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);
}
}和我的部署代码
var Crowdfunding = artifacts.require("Crowdfunding");
module.exports = function(deployer){
const numberOfDays = 1;
const goal = web3.toWei(10, 'ether');
deployer.deploy(Crowdfunding, numberOfDays, goal);
};发布于 2018-09-18 17:33:51
您的合同没有后备的payable函数。您拥有的唯一payable函数是pledge函数,它不是回退函数。
因此,如果您只尝试将以太发送到契约而不显式调用pledge函数,则事务将失败,因为如果不显式调用pledge函数,合同将无法接受以太。
您可以在这里阅读更多有关回退函数的内容:https://www.bitdegree.org/learn/solidity-fallback-functions/
发布于 2018-09-18 17:35:38
这里有几件事情可能出了问题:
function ())。我建议在代码中添加一个备用函数。amount可能不等同于msg.value。记住,msg.value在卫,所以如果你试图发送1以太,那么msg.value == 1000000000000000000魏。另外,您是否有理由使用行require(msg.value == amount);,而不是简单地在它下面的行中使用msg.value?https://ethereum.stackexchange.com/questions/59002
复制相似问题