Solidity

應付功能交易失敗

  • May 8, 2022

請看以下程式碼:

// SPDX-License-Identifier: GPL-3.0
pragma solidity 0.8.1;

contract Crowdfund {
   uint fundLimit = 3 ether;
   bool contractOpen = true;

   function donate() external payable { 
       require(contractOpen, "Contract has stopped recieving funds");
       require(address(this).balance + msg.value <= fundLimit, "Can't send specified amount");
   }
}

如果我嘗試發送 2(或)3 個乙太幣,則交易失敗;

The transaction has been reverted to the initial state.
Reason provided by the contract: "Can't send specified amount".
Debug the transaction to get more information.

理想情況下,2(或)3 乙太幣的交易不應失敗,因為fundLimit設置為 3 乙太幣。最初,合約餘額為 0。

我無法知道這其中的原因。

表示智能合約價值的最安全方法是使用變數而不是address(this).balance. 這可以通過將乙太幣發送到您的合約來輕鬆操縱(即使您沒有任何備份或接收功能)。

uint public balance = 0;

而每當你存錢時,balance += msg.value.

話雖如此,您的要求失敗了,因為當您發送 2 個乙太幣時,您的帳戶餘額立即變為 2 個乙太幣。添加msg.valuetoaddress(this).balance使其成為 4 並且檢查失敗。您可以通過返回address(this).balance + msg.value. 我會做什麼:

// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.0;

contract Crowdfund {
   uint fundLimit = 3 ether;
   bool contractOpen = true;

  uint public balance = 0;

   function donate() external payable { 
       require(contractOpen, "Contract has stopped recieving funds");
       balance += msg.value;
       require(balance <= fundLimit, "Too much!!");
   }
}

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