Solidity
將乙太直接從元遮罩發送到備份函式
我想從metamask (不使用 web3)向智能合約發送一定數量的乙太幣,並希望它根據該數量執行一些特定的任務。例如,如果我發送0.9乙太幣,我希望它在回退函式中將名為planid的變數設置為1101。以下程式碼來自我的契約:
function() external payable { if (msg.sender == bank_owner) { emit AdminDeposit(msg.value, bank_owner); //invest(msg.value, msg.sender, plan_id, _referrer); } else { address _referrer = bytesToAddress(msg.data); _init(msg.sender, msg.value, _referrer); } } function _init(address payable _investor, uint256 _investValue, address _referrer) private { bool doInvest = true; if (_investValue == PLAN_PRICE[0]) { planid = 1101; } else if (_investValue == PLAN_PRICE[1]) { planid = 1102; } else if (_investValue == PLAN_PRICE[2]) { planid = 1103; } else if (_investValue == PLAN_PRICE[3]) { planid = 1104; } else{ doInvest = false; emit TestEvent(planid); } if (doInvest == true){ invest(_investValue, _investor, planid, _referrer); }else { revert("Incorrect value sent!"); } }
在上面的程式碼中,如果有人(除了已經在建構子中定義的銀行所有者)將0.9乙太幣從元遮罩發送到合約(直接), _init ()函式將被呼叫。我希望第二個 if 語句的else部分不會執行。但是,它執行並且事務失敗。
當我用其他東西替換*revert()時,一切正常。*我想知道你是否能幫我處理這個案子。謝謝。
交易失敗,因為您在 Metamask 中分配的氣體限制低於要求。當我們比較時,
_init()
消耗的氣體超過revert()
。因此,您需要在照片中顯示的部分盡可能多地設置 transcartion 的氣體限制:祝你好運。