Solidity
應付功能交易失敗
請看以下程式碼:
// 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.value
toaddress(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!!"); } }