Есть ли преимущество отката транзакций с «броском» по возврату кода ошибки?

Большая часть кода, который я читал в дикой природе, следует за шаблоном предусловия if (condition) throw;

Но этот подход является громоздким для чтения клиентами. Например, с помощью web3js вам нужно будет проверить, означает ли полное потребление газа, что происходит выброс или у вас кончился газ. С Geth, по крайней мере, вы можете проверить callstack для invalid jump через debug.traceTransaction()

Кажется гораздо более подходящим следовать этому подходу:

if (condition) 
{
 ExceptionEvent();
 return ERRCODE;
}

Таким образом, вы можете получить исключение.

Так как использование кода throw настолько распространено в кодах, которые я изучил, каковы возможные недостатки моего предложения, кроме того, что вы должны обрабатывать ошибка во всех частях callstack правильно?

4 голоса | спросил Roland Kofler 19 MonEurope/Moscow2016-12-19T16:59:14+03:00Europe/Moscow12bEurope/MoscowMon, 19 Dec 2016 16:59:14 +0300 2016, 16:59:14

2 ответа


6
  

Например, с web3js вам нужно будет, если полное потребление газа означает, что произойдет бросок или у вас кончился газ.

Отсутствует необходимость в генерации, вы можете получить расчетную стоимость газа с помощью:

  

let contract_instance = web3.eth.contract(abi).at(address);   web3.eth.estimateGas(   {   from: web3.eth.defaultAccount,   to: contract.address,   data: contract_instance[method].getData.apply(null, args)   });


  

Кроме того, вы должны правильно обрабатывать ошибку во всех частях стоп-кадра

Это недостаток. Особенно после того, как вы попадаете в межконтрактные зависимости, возвращающие каждое изменяющееся состояние действие практически невозможно. И в условиях, когда конечное состояние контракта всегда должно быть известно, бросание исключения - лучшая практика в этой ситуации.

ответил cryptihkal 19 MonEurope/Moscow2016-12-19T18:09:57+03:00Europe/Moscow12bEurope/MoscowMon, 19 Dec 2016 18:09:57 +0300 2016, 18:09:57
3

Бросок исключения облегчает рассуждение о полученном состоянии при ошибке. Слишком легко случайно не вернуть все изменения, сделанные при ошибке, если вы вернете значение.

Будущие версии EVM позволят построить бросок, который позволяет вам считывать значение, даже если состояние отменено, и не сбрасывает газ для подвыборов.

ответил Nikolai 20 TueEurope/Moscow2016-12-20T16:36:45+03:00Europe/Moscow12bEurope/MoscowTue, 20 Dec 2016 16:36:45 +0300 2016, 16:36:45

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

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

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