Solidity
錯誤:返回錯誤:處理事務時出現VM異常:使用methods.MyMethods.Send時恢復
我正在編寫一個簡單的投注應用程序,如果他們正確猜到了虛擬老虎機生成的隨機數,它將返回玩家存入的雙倍乙太幣。
它是這樣工作的:
- 玩家在使用者界面中輸入他們的乙太坊地址、猜測和願意存入的金額。
- 如果使用者猜測的數字與隨機生成的數字相同,那麼他們將收到他們記入老虎機的 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, ...}, ...)
您需要將函式聲明
main
為payable
.