Зачем нужны биты заголовка блока? (Действительная сложность уже подразумевается историей цепочки)

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

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

Таким образом, есть другие вопросы/ответы SE, которые подразумевают, что это было исторически. Но какова была цель битов заголовка с самого начала? Было ли это упущением?
Да спасибо. Меня все еще смущает. SPV по-прежнему необходимо проверять цепочку заголовков из генезиса, даже если не все заголовки сохранены, чтобы можно было вычислить сложность из истории цепочки заголовков. Биты не требуются.
Хорошо. (Вообще, было бы неплохо, если бы вы могли включить ссылки на соответствующие вопросы, которые вы уже видели, чтобы избежать избыточных предложений :-). Я согласен с тем, что я также не вижу причин, почему это особенно необходимо. Вполне возможно, что это было просто для удобства/лени со стороны Сатоши, так как это было проще, чем хранить данные на узле где-то еще, или же он просто не продумал это до конца. К сожалению, мы не можем спросить его.
Спасибо. Я имел в виду, что ваша ссылка была для меня новой, не то чтобы я ее уже просматривал, она была полезной! Я не был уверен в этом.

Ответы (2)

Они действительно не нужны. Причина, по которой они включены, может быть известна только Сатоши, и, насколько мне известно, он не указал, почему он решил включить nBits в заголовок блока (или многие другие вещи, которые просто произвольны). Это одна из многих вещей, которые Сатоши решил сделать, и никто не знает, почему. Сегодня он остается в заголовке блока, потому что для его удаления потребовался бы хард-форк, и на самом деле от его удаления не было бы большой пользы.

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

Непосредственная фиксация nbits позволяет вам определить, сколько работы было использовано для создания заголовка без сохранения состояния, прежде чем искать (или получать) информацию о предыдущих заголовках.

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

Эвристика для предотвращения DoS-атак, которая использовала это, существовала в Bitcoin Core до введения синхронизации по заголовкам. Прямо сейчас я не думаю, что он используется для чего-либо в Core.
Конечно, это позволяет нам проверить, соответствует ли PoW сложности заголовков без контекста. Но в этот момент злоумышленник может потребовать любое значение, и мы обнаружим его только при контекстной проверке. Я не думаю, что это предотвратит какую-либо значимую атаку.
CheckProofOfWork также проверяет, что количество битов не ниже минимального. Вместо этого он мог бы проверить «очевидную работу», что было бы почти так же хорошо, но вы могли бы, например, залить «счастливыми акциями» из гипоэтического 1 блока в секунду diff = 0,1 альткойна. Таким образом, это отличается, даже если не в важном смысле.
Хорошо, но это можно сделать и без явных nBits.
Спасибо за ваши ответы! Очень полезно для моего исторического понимания nbits.