Игра с ошибкой «отклонения от одного» (перенацеливание сложности на основе 2015 года, а не 2016 года)?

В этом сообщении на форуме от Гэвина Андресена он пишет:

Во-вторых: я написал инфраструктуру «блоков препятствования»: https://github.com/gavinandresen/bitcoin-git/tree/discourageblocks (приветствуются обзоры кода)

... что должно дать нам возможность подтолкнуть майнеров делать правильные вещи. Препятствование блокам, которые, кажется, разыгрывают ошибку «один за другим», должно быть достаточным стимулом для предотвращения образования 50+% картелей, не требуя изменения разделения блокчейна.

Я считаю, что ошибка «отклонение на один» относится к перенацеливанию сложности на основе времени, затраченного на предыдущие блоки 2015 года, а не блоки 2016 года — пожалуйста, поправьте меня, если я ошибаюсь.

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

Ответы (1)

Атака позволяет группе майнеров с более чем 50% вычислительной мощности сети произвольно изменять сложность.

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

Блоки считаются действительными, если их время больше медианы последних 11 блоков и меньше текущего времени + 2 часа, поэтому злоумышленник может создать новую версию старого блока со временем далеко в будущем. Если это первый блок в периоде перенацеливания, то после этого периода сложность увеличится в четыре раза. Если это последний блок, то сложность будет разделена на четыре. (Регулировка сложности ограничена *4 или /4.)

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

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

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

Нерекомендуемый блок считается действительным (он добавляет подтверждения к транзакциям, блоки после него также будут действительными и т. д.), но ваш узел отказывается ретранслировать его или строить на нем будущие блоки. Если большая часть сети не одобряет блокировку, то ее почти наверняка заменят. Даже меньшинство, препятствующее блокированию, снизит шансы блока. Тем не менее, майнеру очень невыгодно препятствовать блокированию, когда большая часть сети этого не делает.

(Спасибо gmaxwell за объяснение мне этой атаки.)