Подумав более тщательно обновленное предложение с softfork несет огромный риск, когда длина UTXO дайджеста не хватает.
Рассмотрим злоумышленник может заминировать следующее сообщение:
36bytes нонс | 2100000000000000 | pk_script атакующего | любая высота в прошлом
Пока результат соответствует любым существующему переваривать в наборе UTXO, злоумышленник будет генерировать 21M Bitcoin для себя, поскольку нет никакого другого пути для UTXO-облегченных узлов, чтобы обнаружить его. Это атака на день рождения и гораздо проще, чем добыча для конкретного дайджеста. Будет ли реальная UTXO имеет 1 Satoshi или 1M Bitcoin не имеет значения. Если есть еще какие-то устаревшие узлы, будет трудно вилкой.
Я думаю, что лучшим решением является сочетание мягкой вилки с системой соли. Мне нравится, как мягкая вилка дает гарантированную уникальность, а не о том, что столкновение маловероятно.
Каждый узел вычисляет два дайджестов.
CanonicalDigest = Hash256 (UTXO информация)
SaltedDigest = Hash256 (node_specific_salt | Canonical)
Внутренне узел использует LocalDigest = SaltedDigest [N-1: 0] | CanonicalDigest [7: 0] в качестве сборника. Правило консенсуса в том, что никакие два UTXOs не могут иметь один и тот же CanonicalDigest. Это гарантирует, что нет никаких столкновений для LocalDigest.
N может быть выбран в качестве политики узла. Значение 4 представляется разумным. Майнинг может выбрать большее значение. Изменение числа потребует повторного индекс базы данных.
Набор UTXO будет храниться в виде карты
CanonicalDigest в SaltedDigest
Это позволило бы CanonicalDigest столкновения будет обнаружено.
Майнинг должен быть осторожным, чтобы их node_specific_salt не просочилось. То есть риск только майнинг. Если бассейн не более чем на 50% (и использует только 1 полный узел), то остальные шахтеры будут отвергать блоки, шахтерские.
Даже если злоумышленник знал, соли для бассейнов, представляющих более 50% сети, генерируя транзакцию, которая принимается всеми было бы очень трудно. Если 4 бассейна было более чем на 50% мощности между ними, и они используют 4 байта SaltedDigests, затем две операции должны дать тот же результат для
CanonicalDigest [7: 0] | SaltedDigest1 [3: 0] | SaltedDigest2 [3: 0] | SaltedDigest3 [3: 0] | SaltedDigest [3: 0]
Это дает пространство поиска 24 байт, который лучше, чем защита ripemd160 и предполагает, что все 4 бассейна вытекло их node_specific_salt и используются только 4 байта SaltedDigests.
Я определенно думаю, что канонический сборник должен быть 8 байт в этом случае. С мягкой вилки правило, столкновения UTXO рассматриваются. 8 байт означает 2 ^ 64 UTXO пространство. Это дает 134,217,728 ТБ. Я думаю, что если UTXO пространство раздулся до такого размера, то сеть имеет большие проблемы. В настоящее время клиент не мог справиться с этим, так что это означало бы "жесткий" модификация клиента в любом случае (или много "мягкий" модификации клиента, которые совместимы друг с предыдущей версией).