Remix

無法從合約中提取/轉移資金(使用 Remix)

  • January 23, 2022

我想創建一個錢包可以存入和提取資金的合約,以測試重入攻擊。

但是,在 Remix VM(倫敦)中部署此合約時,即使我指示的金額小於存款資金,我也無法使用withdrawAll() 和withdraw() 函式進行取款。

錯誤是:

與 Victim.withdraw 交易錯誤:VM 錯誤:還原。revert 事務已恢復到初始狀態。注意:如果您發送值並且您發送的值應該小於您目前的餘額,則呼叫的函式應該是應付的。

這是程式碼,請告訴我我做錯了什麼?

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

contract Victim {
   mapping(address => uint256) public balances;

   function deposit(uint256 _amount) public {
       balances[msg.sender] += _amount;
   }
 
   function withdrawAll() public payable {
       uint256 amount = balances[msg.sender];         
       require(amount <= balances[msg.sender], "too much!");
       payable(msg.sender).transfer(amount);
       // uint256 new_balance = balances[msg.sender] - amount;
       balances[msg.sender] = 0;
 }

   function withdraw(uint256 amount) public payable {
       require(amount <= balances[msg.sender], "too much!");
       payable(msg.sender).transfer(amount);
       balances[msg.sender] -= amount;
   }
 

}

原因是您沒有向契約存入任何金額。deposit函式只接受一個 int 並更新余額。你向合約發送乙太幣,你需要支付它並從中扣除金額msg.value

function deposit() public payable {
   balances[msg.sender] += msg.value;
}

現在,如果您嘗試退出,它應該可以正常工作。

引用自:https://ethereum.stackexchange.com/questions/119710