Трудно понять, каковы преимущества разрешения пустых учетных записей в блокчейне. Это была известная тонкость (см. «Примечание: есть разница между нулевым балансом и несуществующим»), и она использовалась в атаке «раздувания состояния» .
Каковы были технические проблемы, почему протокол не предотвратил их в первую очередь?
Каковы «недостатки» в протоколе, упомянутые в обосновании EIP158 государственной очистки и этом вопросе ?
Каковы были технические проблемы, почему протокол не предотвратил их в первую очередь?
Особых технических сложностей не было. Это был просто недосмотр, « ошибка, изъян в протоколе ».
Это была известная тонкость (см. «примечание: есть разница между нулевым балансом и несуществующим»)
Всегда понималось, что счета с нулевым балансом могут существовать как узел в дереве состояний , тогда как несуществующие счета не имеют узла в дереве состояний. Создание новой учетной записи (с нулевым балансом или без) также создаст новый узел в дереве состояний. Удорожание создания новой учетной записи было причиной отмеченной дополнительной стоимости газа :
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 гигабайта дискового пространства.
эт
cдетрио
cдетрио