我目前正在上一门扎实的课程,我们每周都会遇到一些我们应该努力解决的挑战。这一次的主题是SafeMath,挑战看上去如下:
contract HopAndMaltOracle{
// Contract oracle
address public oracle;
modifier onlyOracle(){
require(msg.sender == oracle);
_;
}
uint public maltMarketCap;
uint public hopMarketCap;
// Callback function
event MaltMarketCapChanged();
event HopMarketCapChanged();
constructor(uint _maltCap, uint _hopCap) public payable {
oracle = msg.sender;
maltMarketCap = _maltCap;
hopMarketCap = _hopCap;
emit MaltMarketCapChanged();
emit HopMarketCapChanged();
}
function updateMaltMarketCap(uint _cap) public onlyOracle {
maltMarketCap = _cap;
emit MaltMarketCapChanged();
}
function updateHopMarketCap(uint _cap) public onlyOracle {
hopMarketCap = _cap;
emit HopMarketCapChanged();
}
function IDidIt() public{
require(address(this).balance % 2 == 1);
msg.sender.transfer(address(this).balance);
}
}目标是将契约的余额减少到0(通过某种方式调用IDidIt())。现在,在我看来,似乎没有一个方法可以被调用,因为所有这些方法要么使用onlyOracle修饰符,要么是构造函数(除了IDidIt() )。
我的想法是把以太送去合同,以便把余额增加到能满足的东西上。
require(address(this).balance % 2 == 1);但我无法找到这样做的方法,因为回退功能不能接受我的付款(试着:
eth.sendTransaction({from:myAddress,to:contractAddress,value:1});合同的起始余额为2以太。我并不是在要求一个解决方案,但是朝着正确的方向前进肯定会有帮助:)
发布于 2018-05-07 13:31:44
事实证明,有一些方法可以迫使以太遵守合同,而不必直接通过后备或其他功能发送合同,这些方法如下:
第二个选项被证明是这个练习的正确选项。我用一种应付方法创建了一份合同,将1魏存入其中,然后称为自杀(ChallengeContractAddress),从而将1魏的余额转移到挑战合同中,并允许我调用IDidIt()。
感谢大家的帮助!
发布于 2018-05-07 10:04:25
构造函数是可支付的。oracle存储部署人员的地址。
发布于 2018-05-07 11:18:50
首先,为什么您的构造函数是payable?你甚至都不储存msg.value。
其次,如果要发送以太值,则应该将回退函数作为应付函数。
https://ethereum.stackexchange.com/questions/47787
复制相似问题