Я понимаю роль, которую играет одноразовый номер в заголовке блока для вычисления хэша для действительного доказательства работы.
Но вот что я спрашиваю: учитываем ли мы одноразовый номер при prevBlockHash
вычислении предыдущего блока, потому что он уже есть в заголовке блока (для вычисления доказательства работы), и было бы глупо писать calcPrevBlockHash
функцию, которая вычисляет заголовок предыдущего блока, игнорируя одноразовый номер?
Или есть особое свойство безопасности или гарантия, которую мы получаем при включении одноразового номера в prevBlockHash
вычисление последующего блока?
Например, вы можете возразить, что мы хешируем метку времени, потому что хотим зафиксировать время создания блока. Смотрите ответ здесь: Почему компонент метки времени в заголовке блока? Я думаю, вы можете утверждать то же самое для поля nonce.
Но я утверждаю, что мы могли бы по-прежнему иметь одноразовый номер в заголовке блока, а не хешировать его при prevBlockHash
вычислении последующего блока, и все бы работало. Вы все равно (а) сможете проверить этот блок и (б) не сможете возиться с транзакциями в блоке, потому что это изменит hashMerkeRoot
поле и, таким образом, сделает блок недействительным.
После комментариев, я думаю, ваш вопрос сводится к следующему:
Для
prevBlockHash
поля заголовка блока при вычислении хэша заголовка предыдущего блока можем ли мы исключить его значение nonce?
Я не могу думать о каких-либо практических проблемах или проблемах безопасности, которые могут возникнуть в результате этого. Хеш всего, кроме одноразового номера, по-прежнему сертифицирует все важные данные из блока, включая содержащиеся в нем транзакции, и свои собственные prevBlockHash
, которые включают по ссылке все предыдущие блоки.
Однако смысла в этом не было бы. Нам уже нужно вычислить хэш предыдущего заголовка, включая одноразовый номер, чтобы убедиться, что это доказательство работы соответствующей сложности. Сделав это, мы могли бы также использовать это значение в качестве «идентификатора блока» для всех целей, включая prevBlockHash
. Вычисление другого хеш-значения, за исключением одноразового номера, потребует больше кода, больше времени разработчика и больше времени вычислений; добавит возможность ошибок в самом коде хеширования; и может привести к большой путанице, когда люди попытаются отследить, какая часть кода использует какой хэш. Все это в обмен на какую-либо выгоду, насколько я могу судить.
Да, ты прав. Без одноразового номера мы все еще могли бы генерировать действительные блоки. Однако, чтобы получить другой хэш, нам нужно изменить ввод для хеша. Входными данными для хеша является заголовок блока.
Если бы не было nonce, нам пришлось бы менять что-то еще в заголовке блока для каждой попытки. Это оставит только метку времени или корень Merkle. Другие элементы заголовка фиксированы.
Временная метка неудобна, потому что мы хотели бы, чтобы она показывала фактическое время. Итак, нам придется изменить корень Merkle.
Корень Меркла рассчитывается путем хеширования всех транзакций в дереве Меркла, где они перечислены. Если мы изменим, например, Coinbase или порядок транзакций в дереве, мы также можем попробовать другую комбинацию. Но для этого нам пришлось бы пересчитать корень Меркла.
Вместо этого мы помещаем одноразовый номер непосредственно в заголовок, что позволяет нам использовать один и тот же блок-кандидат для нескольких различных попыток хеширования.
Следовательно, одноразовый номер используется для внесения случайности в заголовок блока . Вот почему это
а) должно быть изменено, и
б) должно быть в заголовке блока. ;)
prevBlockHash
(в следующем блоке).prevBlockHash
хеш, тогда как вы ссылаетесь на вычисление хэша для доказательства работы. Все, о чем я спрашиваю, сломается ли что-нибудь (или потеряете ли вы важное свойство безопасности), если вы напишете calcPrevHash
функцию, которая игнорирует поле nonce. Я еще раз переписал вопрос, чтобы прояснить это.
Джестин
Костас
Нейт Элдридж
Костас
Нейт Элдридж
Костас
prevBlockHash
.Костас
prevBlockHash
хэш? Или это что-то вроде: «Ну, это часть заголовка, потому что он нужен нам для вычисления доказательства выполнения работыprevBlockHash
. какие-либо дополнительные гарантии, делая это), но было бы излишним кодироватьcalcPrevBlockHash
функцию, которая игнорируетnonce
поле, поэтому мы просто включаем его в нашиprevBlockHash
вычисления».Нейт Элдридж
Костас
hashBlockHeader()
это то, что вы используете для расчета доказательства работы иprevBlockHash
расчета сейчас. (Примечание: выдуманные имена функций.) Все, о чем я спрашиваю: если бы вы вычислялиprevBlockHash
, используяcalcPrevBlockHash()
функцию, которая игнорирует поле nonce, не сломало бы это что-нибудь? Вы бы потеряли какие-либо свойства безопасности, которые были бы в настоящее время?Костас