Remix
無法從合約中提取/轉移資金(使用 Remix)
我想創建一個錢包可以存入和提取資金的合約,以測試重入攻擊。
但是,在 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; }
現在,如果您嘗試退出,它應該可以正常工作。