Но я по-прежнему обеспокоен (виртуальном) поле «длина» со смещением 56 в последнем блоке. Если мы используем существующий СБИС, я уверен, что они будут продолжать хэш на основе образ последнего блока, который заканчивается с длиной текущего заголовка Bitcoin, а не длиной пересмотренного заголовка. Результат будет то, что Bitcoin хеширования с помощью СБИСА, в то время как все еще возможно, будет в соответствии с вариантом от стандартного SHA256, а также различных программных средств, которые используют стандартные SHA256 в качестве строительного блока потребуются изменения для учета разницы.
Согласовано. Может быть, кто-то с детальным знанием точных материалов, представленных на ASIC может пролить некоторый свет, но я думаю, что вряд ли какой-либо ASIC принимает в качестве входных данных длину blockheader и вместо этого работает на фиксированное предположении 640 бит. Если длина заголовка = / = 640 бит и протокол ожидает, что хэш будет SHA-2 работает согласно, то было бы разорвать все существующие аппаратные средства. С другой стороны, если протокол использует вывод существующего ASICs, когда заголовок не является = / = 640 бит, то хэш больше не следует спецификации SHA-2. Bitcoin будет использовать хэш-функцию, основанную на SHA-2, но он больше не будет SHA-2.
Протокол было бы ожидать, конечный блок заголовка, чтобы быть 16 байт данных с последующим 40 байт нулей, за которыми следует статические 8 байт (всегда 0x0000000000000280). Конечно, другие виды использования функции SHA-2 (сделки, pubkeyhash, дайджест сообщения для подписи и т.д.) будет использовать существующий "по спецификации" версия, которая делает это довольно некрасиво хак на мой взгляд. Спасибо за указание на это Cryddit как я обдумывал это некоторое время, и я забыл о длине, добавленные к проложенному последнему блоку.
Расширенный внутренний заголовокСуществует альтернативный способ расширить заголовок, который остается совместимым с SHA-2 спецификацией и фиксированной длиной 640 бит, налагаемых существующими аппаратными средствами. Это было бы в виде расширенного заголовка, который содержит большинство элементов заголовка) и хэш, который добавляется к "главный" заголовок. Это немного cludgy, но было бы сделать длину заголовка такой же, как то, что, как ожидается, горнодобывающие СБИС. Заголовок блока по-прежнему 640 бит, так что поле виртуального длина до сих пор правильно, даже если шахтеры используют фиксированный 640 битовую длину.
Расширенный заголовок (может быть произвольной длиной не ограничен текущим размером blockheader или форматом)
Блок Смещение Размер (байт) поле
0 0 32 hashPrevBlock (SHA-256)
0 32 32 hashMerkleRoot (SHA-256)
1 0 8 Время (8 байт против 4 байта)
1 8 8 Бит (мишени в компактном формате)
1 16 8 Blockheight (стоит учесть, если он улучшает сопротивление DOS)
1 16 4 Экстра Nonce (полезно для майнинг распределять работу без пересчета merkletree)
1 20 34 * Не определено в этой точке (может быть обнулены отступы, используется в качестве блокнота, или байты используются в более позднем проекте)
* Расширенный заголовок может быть определен любым размером. SHA-2 спецификации разбивает сообщения на блоки по 64 байт. Блок Продольный имеет пространство для 55 байт только как спецификация требует сообщения, которое будет добавляться с 1, а затем достаточными нулями, добавленных, чтобы сделать длину прилагаемого сообщения 56 байт. Длина фактического сообщения добавляется как 8 байт целого числа без знака. Так окончательный блок <= 55 байт данных + 1 байт маркера (0x01) + 0 или более обнуленных байтов заполнения + 8 байт длины сообщения
extended_header_hash = SHA-256 (extended_header)
Блок заголовка (должно быть ровно 80 байт и соответствовать корректоры ожидаемых существующими аппаратными средствами)
Блок Смещение Байт Поле
0 0 4 Version
0 4 32 Extended_header_hash
0 36 24 НЕИСПОЛЬЗУЕМЫЕ (24 обнуляется байт для заполнения) *
1 0 4 НАЛИЧИИ **
1 4 4 Верхних 32 бит nonce64 ***
1 8 4 НАЛИЧИИ **
-12 4 младших 32 бит nonce64 ***
* Вариант будет использовать это для какой-то конкретной цели. Одним из вариантов может быть необязательно поддержку подписания blockheader.
** Я хотел бы использовать 4 или 8 байтов отмеченные доступны в блоке 1, чтобы провести частичный хеш предшествующего блока. Это позволит шахтер программное обеспечение, чтобы проверить их, по крайней мере на лучшей цепи (пул не может быть обойден, чтобы произвести цепь атаки). Эти 8 байт очень ценны, так что должны быть некоторые дебаты о том, как наилучшим образом использовать их.
*** nonce64 должны быть разделены, чтобы сохранить совместимость с существующим оборудованием, которое ожидает модифицируемые элементы, чтобы быть по смещению 4 (время) и смещение 12 (nonce32). Цель использования большего одноразового номера в том, что он исключает необходимость изменить другие элементы заголовка блока в качестве клуджа для поддержки больше вычислительной мощности. Чтобы полностью увеличивает на 64 битное временное значение в 1 секунду потребуется один шахтер, чтобы иметь > 18447 PH / с вычислительной мощностью. 64 бита, вероятно, больше, чем это необходимо. Даже 48 бит дополнительный одноразовый потребует >281 TH / с, чтобы увеличить в 1 секунду. Верхний 32 бит нонса может быть уменьшен до 16 бит, если эти 16 бит, сохраненных были необходимы для другой цели.
На редактирования: добавлена версия для основного заголовка, как это необходимо, чтобы существующие клиенты знают блок представляет собой новую несовместимую версию, что они не поддерживают (а не просто несовместимый мусор). Существующие клиенты не смогут подтвердить новый блок версии, но они могли бы по крайней мере, уведомить пользователей ("Несовместимые новая версия блока обнаружения. Обновление клиента может потребоваться").