В этом вопросе на сайте 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 занимает несколько месяцев/лет. Затем:
Вопрос
Как сеть Биткойн реагирует на эти конкурирующие транзакции одним и тем же хешем?
Как изменился бы результат, если бы транзакция была нестандартной и, следовательно, не повторялась бы между майнерами?
Вы также должны знать, что задача поиска коллизии SHA256 (один и тот же хэш для двух разных байтовых массивов) довольно сложна. Майнеры тратят терахэши в секунду, чтобы найти хэш меньше целевого. Точное совпадение будет очень трудно найти.
Кроме того, злоумышленник в этой задаче должен быть майнером с достаточной мощностью, чтобы решить и транслировать [специальный] блок для включения в основную цепочку.
Вкратце могу сказать, что эта задача требует очень большой вычислительной мощности — поэтому, если у кого-то достаточно мощности для этого, он может провести менее сложную атаку 51%, а не эту.
Даже без всего обсуждения деревьев Меркла наличие двух транзакций с одним и тем же хэшем может создать форк, который не будет разрешен без ручного вмешательства.
Поскольку транзакции также идентифицируются по их хэшу в протоколе, клиенты получат либо t
или t'
, где hash(t) = hash(t')
, это означает, что хотя узлы считают, что они приняли одну и ту же транзакцию, на самом деле они согласовали две разные транзакции, которые конфликтуют друг с другом. Это вызовет хаос в будущем, когда транзакция попытается получить результаты, созданные t
. Поскольку эти выходные данные создаются в, t
а не в t'
зависимости от того, какой из двух вы приняли, последующая транзакция будет либо действительной, либо недействительной, и поэтому проблема распространяется от одной транзакции ко многим.
Транзакция, действительная в одной части сети и недействительная в другой, вызовет разветвление блокчейна, которое может сохраняться, возможно, требуя ручного вмешательства.
Возвращаясь к описанному вами сценарию: у торговца выманят деньги. Он будет считать, что средства можно потратить, но каждая транзакция, которую он попытается использовать с этими выходами, будет помечена как недействительная, в соответствии с вашим сценарием, которую он получает, t
в то время как большая часть мощности майнинга получает t'
и, следовательно t'
, попадет в цепочку.
При этом считается, что SHA-256 устойчив к коллизиям, и вероятность обнаружения коллизии с конкретным хешем требует невероятного количества попыток. Даже найти столкновение между любыми двумя входными данными невероятно сложно, и это является предметом многих исследовательских задач. Так что вряд ли это произойдет в ближайшее время.
производитель вещей7
cdecker