Почему бросок Solidity потребляет весь газ?

Когда вы throw исключение, весь газ потребляется . В чем обоснование этого дизайнерского решения?

20 голосов | спросил Peter Hall 25 MarpmFri, 25 Mar 2016 19:02:45 +03002016-03-25T19:02:45+03:0007 2016, 19:02:45

4 ответа


20

Весь газ потребляется, потому что EVM имеет только одно исключение: вне газа.

Чтобы увидеть это яснее, взгляните на разницу между «чистым» исключением и ошибкой из-за плохого /ошибочного /недопустимого EVM-кода. Из газа первый. Теперь есть ошибки, такие как стеки, недопустимый JUMP и недопустимый код операции: их можно назвать «исключениями», но они скорее напоминают ошибки, чем исключение EVM, поскольку разработчик контракта не написал действительный EVM-код в соответствии с правилами от EVM. Например, недопустимый код операции подобен написанию «класса» вместо «функции» в Javascript: у родного Javascript нет «класса», в отличие от языка, такого как Java. С потоком стека, как разработчик говорит EVM добавить 2 номера, но разработчик не предоставляет 2-й номер.

Обратите внимание также, как «исключение» в EVM отличается от других языков. Например, в EVM нет деления на нулевое исключение (хотя Solidity 0.4+ генерирует для этого исключение). Предполагая действительный EVM-код, исключений нет, кроме Out of Gas.

Поскольку существует только исключение «Исходя из Газа», эти другие ошибки были сделаны, чтобы вести себя как «Из газа». Это относительно согласуется с некоторыми принципами проектирования Ethereum обобщения и минимизации сложности , Другими словами, при реализации поведения нижестоящего стека, недопустимого JUMP и недействительного кода операции проще и проще для протокола повторно использовать реализацию и поведение Out of Gas.

Другие ответы объяснили, как Solidity компилирует throw на недопустимый JUMP. (Вместо этого Serpent использует недопустимый код операции и называет его invalid вместо throw.)

EDIT: релиз Byzantium включает EIP 140 , новый код операции с именем REVERT в EVM, который:

  

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

throw устарел в пользу revert(), require(), assert()

ответил eth 1 AMpFri, 01 Apr 2016 10:38:33 +030038Friday 2016, 10:38:33
10

Команда Solidity throw скомпилируется с помощью команды invalid JUMP (т. е. перехода к недопустимому местоположению).

В разделе 9.4.2 «Желтой книги» объясняется, как работает исключительный останов , в главе 8 объясняется, что в этом случае возврат газа не возвращается.

В главе 8 говорится:

  

Как и при создании контракта, если выполнение останавливается в   исключительная мода (т. е. из-за истощенной подачи газа, стека   underflow, неверный пункт перехода или неверная инструкция), то нет   газ возвращается абоненту, и государство возвращается к точке   непосредственно перед переносом баланса (т. е. σ).

И вернемся к главе 7:

  

Если такое исключение не возникает, то оставшийся газ   возвращенному отправителю, и теперь измененное состояние разрешено   сохраняются.

Что касается того, почему так было решено, у меня нет информации о.

ответил axic 28 MarpmMon, 28 Mar 2016 19:30:24 +03002016-03-28T19:30:24+03:0007 2016, 19:30:24
10

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

ответил Robert McCone 30 MaramWed, 30 Mar 2016 08:03:37 +03002016-03-30T08:03:37+03:0008 2016, 08:03:37
7

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

ответил Paweł Bylica 25 MarpmFri, 25 Mar 2016 19:36:46 +03002016-03-25T19:36:46+03:0007 2016, 19:36:46

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

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

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