Solidity
每次我投入 Solidity 時記錄一個事件是一個好習慣嗎?
在 Solidity (0.3.2) 中,我知道沒有辦法拋出特定的異常。(一切都是
invalid JUMP
錯誤。)有一種方法來記錄特定錯誤似乎是有益的。在任何異常之前創建要觸發的錯誤事件是否有意義?有什麼我沒有想到的缺點嗎?event Error(string message); ... if(msg.sender != owner) { Error("User not authorized"); throw; }
編輯:如果事務失敗,似乎根本不會記錄該事件。有人可以確認嗎?
除了
throw
向礦工支付的款項外,交易的所有影響(包括事件)都將被還原,與 一樣。因此,在throw
.可能的替代方案
如果不需要通過異常進行完全還原,則可能會使用錯誤程式碼。
例子:
contract C { function foo() returns(int) { if(msg.sender != owner) { Error("User not authorized") return -1111; // some error code } // sender is authorized so do stuff } }
合約無法訪問事件,因此錯誤消息更多用於前端。如果消息僅用於前端,請考慮使用
eth_call
before an模式eth_sendTransaction
(此處解釋了 call vs sendTx)。
eth_call
之前的eth_sendTransaction
模式看起來像這樣的前端 Javascript 程式碼:// `contract` is an instance, from web3.eth.contract(...).at(...) if (contract.foo.call({from: eth.accounts[0]...) === -1111) { // example only of how error could be dealt with alert("User not authorized"); return; } // user should now be authorized (though it is possible another transaction may have changed `owner` in contract `C` after above eth_call and before this upcoming eth_sendTransaction) contract.foo.sendTransaction({from: eth.accounts[0]......)
也就是說,可能存在需要創建錯誤事件的情況。例如,如果您的 DApp 想要分析遇到了多少錯誤,有多少是未經授權的錯誤等,則可以使用錯誤事件。
編輯:當https://github.com/ethereum/solidity/issues/1686實施時,問題中的範例如下所示:
require(msg.sender == owner, "User not authorized");