Solidity

錯誤:返回錯誤:處理事務時出現VM異常:使用methods.MyMethods.Send時恢復

  • July 8, 2020

我正在編寫一個簡單的投注應用程序,如果他們正確猜到了虛擬老虎機生成的隨機數,它將返回玩家存入的雙倍乙太幣。

它是這樣工作的:

  1. 玩家在使用者界面中輸入他們的乙太坊地址、猜測和願意存入的金額。
  2. 如果使用者猜測的數字與隨機生成的數字相同,那麼他們將收到他們記入老虎機的 2 倍。如果他們的猜測不正確,他們只會失去存款。

就像現實世界中的任何老虎機一樣,為了玩遊戲,您必須首先在機器上存入一些錢。同樣,我正在編寫我的虛擬機以這種方式工作的腳本,除了為了保持低交易費用,乙太必須與數據有效負載一起發送到合約:

這是我的可靠程式碼:

  contract Slot_Machine is Mortal{

 // A struct type that defines state variables of a player.
 //Every player has a wallet, amount they are willing to
 //deposit and a guess.

 struct Player{
     address payable wallet;
     uint deposit;
     uint guess;
 }

 address payable slotMachine;

 mapping (address => Player) public player;

 //The random number returned from the generator.
 uint randomNumber;

 constructor() public{
   randomNumber = 5;
 }

 fallback () external payable{}

 receive () external payable{
   require(msg.sender.balance >= msg.value,
         "Insufficient balance to complete transaction.");
 }

 function main(uint pdeposit, uint pguess) public{

   player[msg.sender] = Player(msg.sender, pdeposit, pguess);

   if(player[msg.sender].guess != randomNumber){
     emit Message("Unlucky this time! try again when you are feeling lucky!");

   } else {
         player[msg.sender].wallet.transfer(player[msg.sender].deposit*2 ether);
         emit Message("You Win!");
   }

 }
}

main函式是當玩家點擊“Play”對象時呼叫的方法。

我的問題是,當我通過節點使用 web3 呼叫此函式時,契約中沒有乙太幣。

這是我的 web3 腳本:

contract.methods.main(amount, guess).send({from: Hannah, value: amountWei, gas: 3000000}, (error, result) => {console.log(error)})

在撥打這個電話時,我遇到了這個錯誤:

Error: Returned error: VM Exception while processing transaction: revert

但是,在 send 函式中呼叫此方法時不帶 value 選項:

contract.methods.main(amount, guess).send({from: Hannah,gas: 3000000}, (error, result) => {console.log(error)})

返回一個 Tx 編號。

那麼前者是在呼叫方法的同時將乙太幣發送到合約的錯誤方式嗎?

由於您正在傳遞value > 0

contract.methods.main(amount, guess).send({value: amountWei, ...}, ...)

您需要將函式聲明mainpayable.

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