Является ли хорошей практикой регистрировать событие каждый раз, когда я бросаю в Solidity?

В Solidity (0.3.2) Я знаю, что невозможно исключить определенные исключения. (Все является ошибкой invalid JUMP.) Кажется полезным иметь способ регистрировать определенные ошибки. Имеет ли смысл создавать событие «Ошибка» для запуска перед любым исключением? Есть ли недостатки, о которых я не думаю?

event Error(string message);

...

if(msg.sender != owner) {
  Error("User not authorized");
  throw;
}

EDIT: Похоже, что событие не регистрируется вообще, если транзакция завершается с ошибкой. Может кто-нибудь подтвердить?

22 голоса | спросил Raine 20 Mayam16 2016, 01:52:27

2 ответа


27

С исключением, как и с 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 перед 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]......)

Тем не менее, могут быть случаи, когда требуется создать событие Error. Например, если ваш DApp хочет аналитику о том, сколько ошибок было обнаружено, сколько несанкционированных ошибок и т. Д. Событие ошибки может быть способом.

EDIT: Когда https://github.com/ethereum/solidity/issues/1686 , пример в вопросе будет выглядеть так:

require(msg.sender == owner, "User not authorized");
ответил eth 20 Mayam16 2016, 02:43:28
0

Я заметил, что обработка событий с помощью модификатора работает довольно просто без броска с нижним примером.

modifier Modifier_Name() {
        if (Some_Check == Bool) {
            Event(Event_Arg_Type);
            Function_Access_Bool = Bool;
        }
        _;
    }

function Function_Name(Function_Args) public
     Modifier_Name()
     returns bool (success) 
     {
      if (Function_Access_Bool == false) {
          return false;
      }
      else
      {
        ...Desired_Code...;
          return true;
      }
  }
ответил Realm Koin 6 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 06 Sep 2017 18:33:16 +0300 2017, 18:33:16

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132