Размер одноразового номера — всегда ли он будет достаточно большим?

Если я правильно понимаю, блок имеет только 4 байта (32 бита) для одноразового номера. Возможно ли, чтобы сложность стала достаточно высокой, чтобы не было одноразовых решений? Если да, то какие варианты есть у майнера?

Поскольку у Дэвида уже есть солидный ответ, я просто сделаю небольшой комментарий. Даже при сложности 1 существует вероятность 36,7% не найти ни одного действительного хэша во всем диапазоне одноразовых номеров (2 ^ 32). При сложности 1 миллион есть 99,999905%, что вы не найдете решения во всем диапазоне одноразовых номеров. К счастью, любое другое изменение заголовка блока дает вам еще 4 миллиарда попыток.

Ответы (2)

Сложность уже доходит до того, что для решения блока требуется более квадриллиона хэшей. 2^32 всего 4 миллиарда. Менее одного раза из миллиарда будет какой -либо одноразовый номер, делающий блок действительным.

Майнер просто должен попробовать все возможные одноразовые номера в другом блоке. Он может изменять базу монет, набор транзакций и/или метку времени блока. Любое изменение любой из этих вещей приводит к новому шансу существования действительного одноразового номера.

Часто лучшим выбором является увеличение временной метки, практика, называемая NTime Rolling .

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

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

По моим подсчетам, майнер со скоростью 270 Мхэш/сек пропустит 2^32 одноразовых номера примерно за 15 секунд! Эти методы, о которых вы говорите, выполняются биткойн-сервером или майнером?
Обычно эти изменения вносятся узлом Биткойн (например, сервером пула майнинга). Метка времени потенциально может быть изменена майнером, но я не думаю, что это сделано. Изменить extraNonce в транзакции генерации сложнее, но я думаю, что требуется только его ветвь Merkle, а не весь блок. Добавление новых транзакций определенно требует наличия узла.
@MeniRosenfeld Хотя обычно эти изменения выполнялись пулом, это крайне неэффективно. Параметр NTimeRolling позволяет майнеру локально увеличивать метку времени. Пулу необходимо вычислять новые заголовки только при изменении блока, периодически для новых транзакций или по истечении срока действия NTime.
Мне кажется, что одноразовый номер должен был быть разработан как минимум 64-битным, а не 32-битным. Удивлен отсутствием предвидения здесь. Возможно, заголовок блока можно изменить?

Наличие решения зависит от содержимого блока, а также от возможных значений одноразового номера.

Блок транзакции может быть изменен при необходимости, что, по сути, означает, что вы можете попробовать еще 32 бита одноразовых значений. Существует дополнительный компонент блока транзакций, называемый «coinbase», который можно изменить без изменения фактических транзакций внутри блока. Это было в прошлом для вставки коротких сообщений в цепочку блоков .

Значение Coinbase можно использовать для вставки небольшой строки, например, как описано здесь: bitcoin.stackexchange.com/a/26/516 .
но вам нужно будет пересчитать корень Меркла, если вы измените coinbase tx? Или он не меняет свой хэш?