Почему пустым аккаунтам разрешено находиться в блокчейне?

Трудно понять, каковы преимущества разрешения пустых учетных записей в блокчейне. Это была известная тонкость (см. «Примечание: есть разница между нулевым балансом и несуществующим»), и она использовалась в атаке «раздувания состояния» .

  1. Каковы были технические проблемы, почему протокол не предотвратил их в первую очередь?

  2. Каковы «недостатки» в протоколе, упомянутые в обосновании EIP158 государственной очистки и этом вопросе ?

Ответы (1)

Каковы были технические проблемы, почему протокол не предотвратил их в первую очередь?

Особых технических сложностей не было. Это был просто недосмотр, « ошибка, изъян в протоколе ».

Это была известная тонкость (см. «примечание: есть разница между нулевым балансом и несуществующим»)

Всегда понималось, что счета с нулевым балансом могут существовать как узел в дереве состояний , тогда как несуществующие счета не имеют узла в дереве состояний. Создание новой учетной записи (с нулевым балансом или без) также создаст новый узел в дереве состояний. Удорожание создания новой учетной записи было причиной отмеченной дополнительной стоимости газа :

CALL has a multi-part gas cost:
* 40 base
* 9000 additional if the value is nonzero
* 25000 additional if the destination account does not yet exist (note: there is a difference between zero-balance and nonexistent!)

Но оплошность заключалась в том, что кроме CALLсоздания новых аккаунтов был еще один способ, а именно SUICIDEобход 25000 газа наценки. Это было использовано транзакциями DoS «бомба смертника». Например, первый создал много новых учетных записей с нулевым балансом, от адреса 0x00..05 до адреса 0x00..2170 . Это около 8560 аккаунтов всего за 800000 газа, или около 95 газа на аккаунт (намного дешевле, чем 25000 газа на аккаунт, которые стоили бы при использовании CALL).

Каковы «недостатки» в протоколе, упомянутые в обосновании EIP158 государственной очистки и этом вопросе?

Основным недостатком была возможность дешевого создания новых учетных записей с помощью SUICIDE, что использовалось DoS-атакой для раздувания состояния. Если бы в протоколе было указано только, что узлы дерева состояний не создаются для учетных записей с нулевым балансом, то SUICIDEатака все равно могла быть использована путем перевода 1 wei на новые учетные записи. Чтобы полностью предотвратить атаку, протокол также должен был бы указывать дополнительную стоимость газа при создании новых учетных записей независимо от того, как они создаются (будь то с помощью CALLили с помощью SUICIDE). Это упущение, которое было исправлено в EIP150: долгосрочные изменения стоимости газа :

If SUICIDE hits a newly created account, it triggers an additional gas cost of 25000 (similar to CALLs)

Поскольку пользователям и майнерам необходимо хранить все дерево состояний для вычисления корневого состояния и проверки блоков, каждая новая учетная запись увеличивает требуемое им дисковое пространство. Атака DoS увеличила общее количество учетных записей примерно до 20 миллионов или 30 миллионов узлов дерева состояний (структура дерева состояний не является однозначной между учетными записями и узлами дерева), что потребовало около 10 гигабайт дискового пространства. в зависимости от конкретной реализации клиента. После завершения очистки состояния общее количество учетных записей сократилось до 772 530, или 3,3 миллиона узлов дерева состояний, для которых требуется около 1 гигабайта дискового пространства.

Отличный ответ, и я не уверен в этой части: «Если бы в протоколе было указано только, что узлы дерева состояний не создаются для учетных записей с нулевым балансом, то атака SUICIDE все еще могла быть использована путем перевода 1 wei на новые учетные записи. ." SUICIDE не может просто перевести 1 вей без перевода всего баланса, поэтому не могли бы вы уточнить, как будет переведена 1 вей? (Если CALL используется перед SUICIDE, этот CALL будет иметь надбавку в 25000 газа.) РЕДАКТИРОВАТЬ: похоже на SUICIDE, затем CALL на 1 wei, чтобы атака получила заряд 9000 газа, но избежать надбавки на 25000 газа?
Я тоже не уверен, но я думаю, что SUICIDE, а затем CALL с 1 wei сработали бы, с возмещением SUICIDE в размере 24000, покрывающим 9000 сборов за «перевод стоимости». В любом случае, моя точка зрения заключалась в том, что проблема заключалась не в пустых учетных записях как таковых, а в возможности дешево раздуть состояние (будь то путем создания пустых учетных записей или, скажем, создания учетных записей с 1 вэй).
Кстати, дважды проверил это, и вы правы. SUICIDE, а затем CALL стоил бы 9000 газа за новую учетную запись. возврат 24000 ограничен одним разом на удаленный адрес (и происходит в конце выполнения tx), поэтому возврат не может быть использован при повторном вводе.