Solidity

每次我投入 Solidity 時記錄一個事件是一個好習慣嗎?

  • October 17, 2017

在 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_callbefore 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");

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