Contract-Development

關於solidity中require關鍵字的問題

  • August 26, 2018

問題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 都無法返還。

  1. 答案是肯定的
  2. 執行 require(…) 呼叫之前的 gas 量會失去。你的交易被包含在一個區塊中,但它除了增加隨機數和減少發送賬戶的餘額之外沒有任何影響。基本上,從現在開始,它只會永遠佔用磁碟空間,並且會花費你乙太幣而不會產生任何其他影響。
  3. 據我所知,尚無法從您的前端獲取錯誤消息。對此主題的討論:使用 revert 返回錯誤程式碼

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