Contract-Development
關於solidity中require關鍵字的問題
問題1)假設我有這個程式碼
require(userVotes[msg.sender] == 0); presidents[_id-1].voteCount++; userVotes[msg.sender] = _id;
所以如果我呼叫這個函式,但它沒有通過要求,真正發生的是在元遮罩中它說:合約拋出異常。然後它仍然讓我點擊送出按鈕。我很好奇它還會從我的帳戶中抽走gas嗎?
問題 2) 如果上一個問題的答案是肯定的,那麼多少錢?
require(userVotes[msg.sender] == 0);
執行此命令所需的氣體?即使 require 中有異常,我仍然很好奇,它仍然包含在塊中並且狀態為失敗。究竟是什麼東西?什麼也沒有變。問題 3)我試著寫一些
require(userVotes[msg.sender] == 0,"error go away");
我想在前端捕捉到這個的東西。我所做的是在發送交易後,我使用了事件.on('error', function(error){ console.log(error); }
但這不是我像“錯誤消失”一樣堅定地寫下的那些話。
非常感謝
我現在給你的所有資訊都可以在solidity文件中找到(https://solidity.readthedocs.io/en/v0.4.24/control-structures.html?highlight=require#error-handling-assert-require -revert-and-exceptions )
require(…) 函式呼叫 revert(),它會停止執行並恢復 EVM 的狀態,因此您的合約呼叫實際上沒有改變任何東西。revert() 確實將剩餘的氣體發送給使用者。這意味著在您的 require(…) 呼叫已用完之前使用的任何 gas 都無法返還。
- 答案是肯定的
- 執行 require(…) 呼叫之前的 gas 量會失去。你的交易被包含在一個區塊中,但它除了增加隨機數和減少發送賬戶的餘額之外沒有任何影響。基本上,從現在開始,它只會永遠佔用磁碟空間,並且會花費你乙太幣而不會產生任何其他影響。
- 據我所知,尚無法從您的前端獲取錯誤消息。對此主題的討論:使用 revert 返回錯誤程式碼