Недавно я обнаружил слабость пути Proof работы в настоящее время реализуется в Bitcoin. В этом посте я покажу, как шахтер может заминировать действительный блок, не зная, на вершине которой предыдущий блок, он / она рудники, и даже не зная хэш предыдущего блока. Тогда я объясняю следствие этой слабости на реальном мире возможности 51% атаки и эгоистичной добычи / блок Discarding атаки. Простые модификации протокола предложены и обсуждены в конце поста.
Mining, не зная хэш предыдущего блока
Мы все знакомы с доказательством концепции работы (POW), и все мы знаем, что некий хэш блок-заголовка любого действительного блока Bitcoin должен быть ниже, чем соответствующие цели, но конкретная техническая реализация ПР меньше обсуждается , Все подробности можно найти в вики или это недавнее интересное бумага.
Для простоты допустим, что блок-заголовок является конкатенацией хэша предыдущего блока, корень дерева Merkle текущего блока, и коротким одноразовый 32bit, в этом порядке. Следует отметить, что первые два поля 256 бит каждый. В действительности заголовок блока содержит также метку времени и другие данные, которые мы будем игнорировать, чтобы сделать слабость понятнее. Хэш-функция SHA-256 применяется дважды в заголовке блока (это означает, во-первых SHA-256 рассчитывается за заголовок, а затем SHA-256 рассчитывается по итогам предыдущего расчета), и результат должен быть ниже, чем целевая ,
Поскольку ток сложность выше, чем 60 бит, а короткий Nonce содержит только 32 бита, один раз каждые 2 ^ 32 двойных SHA-256 расчеты Меркл-дерево должно быть изменено, чтобы обновить блок-заголовок (на самом деле, монета -base сделка дерева содержит некоторое экстра-временное значение в качестве специального поля). Кроме того, бассейн шахтеры используются для изменения монеты базовой сделки в Merkle дерева не только для блока заголовка освежает, но и для того, чтобы отметить блок так, что владелец бассейна может вознаградить их за свои акции.
Допустим, что организатор пула посылает весь пул членов (разные) списки корней Merkle дерев. Каждый пул шахтер затем попробовать все 2 ^ 32 возможных комбинаций в течение короткого временного значения, прежде чем принимать другой корень и начать все сначала. Шахтеру не нужно знать фактическую Merkel дерева, так как организатор пула уже отмечен для него / нее. Теперь здесь является ключевым моментом: SHA-256 хэш-функция Меркл-Damgard, что сжимает итеративно 512 бит блоки входных данных. Таким образом, первый этап вычисления SHA-256 над блоком-заголовком сжимает первые 512 бит, которые являются конкатенацией хэша предыдущего блока с корнем дерева Merkle. После этого шага эти 512 бит являются ненужными, поэтому организатор бассейн может просто отправить бассейн шахтерам список сжатых конкатенации хэша предыдущего блока с некоторым Merkle корнем дерева.
Так как функция сжатия SHA-256 является односторонний и корни Меркла-дерево эффективны случайными числа, пул шахтеры не могут обнаружить хэш предыдущего блока. Другими словами, они добывают действительные блоки, не зная, на вершине которой предыдущие блоки они Mine.
Последствия
Недавно Эял и Sirer опубликовал документ с описанием "эгоистичны добыча" атака. К сожалению, я был независимо друг от друга работают на одной и той же атаки, но они первые опубликовали свои результаты (и отказались разделить кредит со мной ...). Во всяком случае, я опубликовал свои результаты тоже, и так как Block Attack Discarding является более общим и всеобъемлющим я советую вам прочитать моя работа слишком.
Я утверждал, что блок Discarding Attack / Эгоистичный Mining не применяется в пулы, и только изменил свое мнение о том, что в связи с возможностью добычи, не зная хэш предыдущего блока. Предполагая, что бассейн шахтер должны знать хэш предыдущего блока, можно показать, что на практике эгоистичной добычи атака не может работать должным образом, если атакующий пул: атака основана на два противоречащих требованиях. Первый из них является способностью бассейна шахтеров держать в тайне блоков они нашли, но до сих пор не освобождены (пул шахтеры добудет на вершине этого секретных блоков, а честная сетевой мин на старых блоках). Во-вторых, принятие новых шахтеров в бассейне (которые хотят присоединиться к пулу, чтобы они не будут страдать от снижения прибыли из-за атаки).
Потому что любой желающий может присоединиться к пулу, в том числе других организаторов бассейнов или сайтов, как blockchain.info (обратите внимание, что шахтеры анонимно), а потому, что бассейн шахтеры, как ожидается, помоему на верхней части секретного блока (всякий раз, когда есть такой блок), при условии, что добыча может быть сделана только тогда, когда предыдущий блок хэш известен, хэш любого withholded блока, как ожидается, будет опубликован некоторые из бассейна неверности шахтеров. Когда этот хэш опубликован, не бассейн шахтеры также могут добывать на нем, что делает атаку невозможной (Асаф Зив, друг моего, отметил, что в такой ситуации организатор бассейна может выбрать, чтобы не показать полный блок, хэш были опубликованы. Однако при этом пул теряет один блок и честны сеть теряет только один блок тоже, так что это невыгодно, если бассейн не имеет более половины от общей вычислительной мощности).
Во всяком случае, у бассейна можно использовать технику, представленную здесь, так что неверен бассейн шахтеры не смогут публиковать секретный блок (или его хэш). Единственное, что они могут сделать, это опубликовать сжатые конкатенации хэш секретного блока с корнем дерева Merkle, чья монета база сделка вознаграждение организатору бассейн 25 Bitcoins. Очевидно, что это не может повредить бассейн.
Что касается 51% атаки, группа организаторов пула, общая хэш-мощность превышает хэш-мощность остальной части сети может использовать технику описания анонимно выполнить 51% атаки, не будучи связаны с атакой даже не со стороны бассейна шахтеры! Организатор бассейн может использовать новый адрес в (первоначально секретных) монете базовых операций, так что всякий раз, когда действительный блок добывается из бассейна шахтеров, только этот шахтер должен знать, что пул участвует в атаке. Потому что я не знаю ни одного честного преимущество этого метода, мое замечание по поводу 51% атаки, вероятно, незначительно: честные бассейны, или бассейны, которые делают вид, честно говоря, просто не будут использовать эту технику, и, таким образом, ни один честный бассейн шахтера обман участвовать в любой атаке.
модификация протокола
Протокол Bitcoin можно немного изменить так, что добыча не зная хэш предыдущего блока (и может быть корнем дерева Merkle тоже) не будет включен. Есть много способов, возможно, сделать это, из которых самый простой, вероятно, изменить порядок полей блочного заголовка, так что данный случай станет первым. Другие возможности включают в себя: конкатенации блока-заголовок к себе и вычислению одного SHA-256 над удвоенным блоком-заголовком; XORing хэш предыдущего блока по итогам первого SHA-256 перед выполнением итерации второго SHA-256 итераций; требуя, чтобы исход второго SHA-256 итерации будет несколько больше, чем хэш 2 ^ -128 раз больше предыдущего блока и меньше, чем 2 ^ -128 раз хэша предыдущего блока плюс текущей целью; и т.п.
Наряду со слабостью добычи, не зная хэш предыдущего блока, есть еще одна слабость, которая является возможностью нетривиальных добычи оптимизации, то есть наличие более совершенных алгоритмов интеллектуального анализа, чем просто расчет обычной функции SHA-256. Одна такая оптимизация описывается Вот. Когда у меня есть время, я намерен искать оптимизации добычи нескольких блоков на вершине одного и того же блока, например, добывали два блока на вершине одного и того же блока, так что он будет принимать только в 1,5 раза больше вычислений, чем добыча одного блока ( это может иметь плохие последствия на протяжении многих GHOST предложение).
Я думаю, что текущий протокол должен быть изменен в ближайшее время, так что он не будет иметь слабость в силу специфики использования SHA-256.
Лир.