Contract-Invocation

處理交易時出現 VM 異常:當我將 ETH 發送到我的合約地址時恢復

  • February 11, 2022

最近我遇到了一個很奇怪的問題,當我通過 truffle 和 MetaMask 將 ERC20 ICO 合約部署到 Repsten 網路時。然後我將一些 ETH 發送到我的 ERC20 合約地址,我預計當合約截止日期到或收到的 ETH 數量超過資金目標,我可以提取合約中的 ETH。

實際上,當契約收到的 ETH 數量是整數時,它的效果和我預期的一樣好。

但是當合約收到的 ETHs 金額包含浮點數,例如 0.1,0.2,1.1 時,就會發生“VM Exception while processing transaction: revert”,如標題所述。以前有人遇到過這個問題嗎?詳細資訊如下,PLS幫我解決這個問題。

提前致謝。

  1. 首先,我將 ERC20 合約部署到 Ropsten 網路。備份功能如下。

在此處輸入圖像描述 2. 我向我的合約地址發送了 0.5 ETH,合約收到了 0.5 ETH。隨著截止日期的到來,我將 0 ETH 發送到我的合約地址以觸發合約的回退功能將 ETH 餘額轉移給受益人。但它失敗了。在 ropsten.etherscan.io 中會提示 ’transaction revert’ 。合約連結: https ://ropsten.etherscan.io/address/0x611d807ea4c3fa9bfb5c7765642fc8be534c9f3e

在此處輸入圖像描述 在此處輸入圖像描述

  1. 我部署了另一個具有相同程式碼的合約,我將 1 ETH 發送到合約地址,隨著截止日期的到來,我將 0 ETH 發送到我的合約地址以觸發合約的回退。受益人可以成功收到 ETH。

合約連結:https ://ropsten.etherscan.io/address/0x9990282fc9734ef8e6b0073a3537938a189f7afd

我沒有深入閱讀您的程式碼,但您不應該在備份函式中定義太多操作。出於安全原因,備用功能具有2300 gas的固定津貼。因此它不會執行您放入其中的程式碼。您需要定義一個應呼叫的應付函式以將乙太幣發送到合約

例如

   function deposit() payable{
assert(!haveTransferEth);
   if(haveTransferEth){
       revert();
   }
...

在查看我的合約程式碼後,我發現導致此錯誤是由於交換 ETH 和 token 的準確性。

例如。當發送者的 ETH 數量小於 1 時,合約將給發送者 1 個代幣,合約期限終止後,合約需要將代幣餘額發送給受益人。實際上

tokenBalance = tokenTotalSupply - 1 

但我認為這種情況

tokenBalance = tokenTotalSupply - 0

所以沒有足夠的tokenBalance轉移給受益人。

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