Можно ли создать атаку двойной траты, заменив Tx в дереве Меркла?

В этом вопросе на сайте crypto.SE описывается, как в сети Биткойн можно избежать атак с использованием прообраза.

Для второй атаки прообраза:

hash(x) = hash(y)подразумеваетhash(hash(x)) = hash(hash(y))

Так что это не защитит от прямой атаки прообраза. Биткойн строит дерево Меркла следующим образом a b c:hash(hash(hash(a)+hash(b))+hash(hash(c)+hash(c)))

Вы снова можете видеть, что если кто-то найдет c'тот же хэш SHA-256, что и c, он может заменить его, и окончательный результат все равно будет таким же.

Хотя верно то, что это может повысить устойчивость к атакам первого прообраза, не существует очевидных случаев, когда это имело бы значение — у злоумышленника обычно был бы открытый текст, сгенерировавший хэш. (И атаки с использованием прообразов на адреса кажутся надуманными, учитывая, что там есть операция ECDSA.)

Предположим, две автономные транзакции генерируются с одним и тем же c'хэшем. Предположим, что создание каждого Tx занимает несколько месяцев/лет. Затем:

  1. Злоумышленник создает Tx для продавца
  2. Злоумышленник создает второй Tx с теми же входными данными, что и #1. Затем секретный ключ регенерируется до тех пор, пока хэш Tx не сравняется с хэшем c'.

Вопрос

  1. Как сеть Биткойн реагирует на эти конкурирующие транзакции одним и тем же хешем?

  2. Как изменился бы результат, если бы транзакция была нестандартной и, следовательно, не повторялась бы между майнерами?

Ответы (2)

Вы также должны знать, что задача поиска коллизии SHA256 (один и тот же хэш для двух разных байтовых массивов) довольно сложна. Майнеры тратят терахэши в секунду, чтобы найти хэш меньше целевого. Точное совпадение будет очень трудно найти.

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

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

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

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

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

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

При этом считается, что SHA-256 устойчив к коллизиям, и вероятность обнаружения коллизии с конкретным хешем требует невероятного количества попыток. Даже найти столкновение между любыми двумя входными данными невероятно сложно, и это является предметом многих исследовательских задач. Так что вряд ли это произойдет в ближайшее время.

Использует ли Биткойн SHA1 где-нибудь? Я думал, что каждый хеш был основан на SHA2.
Вы конечно правы, это SHA-256 или RIPEMD160 для адресов. Я исправлю это в своем ответе.