Россия, Москва, МГОУ, 2007 |
Практика использования Биткоин в разных областях
Безопасные многопартийные лотереи в биткойне
Рассмотрим, как можно организовать многопользовательскую лотерею с помощью биткоина. Начнем с организации лотереи в оффлайн-мире. Как можно создать лотерею между двумя людьми без каких-либо доверительных отношений?
Если Алиса и Боб хотят заработать пять долларов, они должны оба согласиться на ставку. Боб подкинет монету, при этом каждый должен быть уверен в том, что она будет в воздухе, тогда у них будет очень четкое представление о том, кто выиграл, и что ни один из них не смог повлиять на результат. Они оба должны верить, что проигравший заплатит ставку. При этом эта сделка не имеет какой-то юридической силы, так как является простой договоренностью между двумя людьми.
При создании лотереи в онлайн-мире необходимо решить обе обозначенные проблемы.
Таким образом, проблема создания случайности, о которой обе стороны могут договориться, должна быть справедлива, и если один игрок проиграет, то он фактически будет вынужден за это заплатить.
Пользователи в Интернете не могут видеть одну и ту же физическую монету, поэтому они делают ставки на фальш-монетки. Алиса могла бы сделать ставку в 5 долларов и объявить, что она подкидывает монету, включив видеокамеру. Но у Боба могут возникнуть сомнения. Алиса могла записать видеоролик с желаемым результатом заранее и транслировать его в сеть как онлайн-видео.
Решение состоит в том, чтобы использовать обязательства хэша данных Х. Ранее было рассмотрено, как можно создать обязательство, не раскрывая самих данных X.
Допустим, в онлайн-лотерее участвует три стороны - Алиса, Боб и Кэрол. Для начала все они выберут случайное число, часто называемое nonce в криптографии, и сохранят его. При этом каждый должен верить в то, что конечный результат является случайным. В этом протоколе будет два раунда коммуникации.
В первом раунде все три стороны публикуют хэш случайного числа nonce, которое они выбрали. Хэш ничего не говорит о случайном числе, если оно выбрано из достаточно большого пространства. Каждый из них выбирает 128-битную случайную строку, публикует ее хэш и при этом не выдает какую-либо полезную информацию об этом числе.
Второй раунд наступает строго после завершения первого – каждый участник показывает свое число. Для того чтобы определить, кто выигрывает лотерею, есть довольно простая программа. Она берет все три случайных числа (Х данные) и смешивает их в битах. Затем берет хэш данных, делит его на mod 3, и выдает случайным образом один из трех результатов. Затем можно назначить каждый результат одному из участников, и это определит, кто станет победителем: Алиса, Боб или Кэрол. При этом каждый участник сам может проверить справедливость лотереи. Поэтому важным свойством хэш-функции является то, что она гарантирует случайность. Никто не смог бы выбрать свое случайное число таким образом, чтобы оно стало более вероятным, и чтобы конечный результат являлся победой. Особенно учитывая то, что участники не знают случайных чисел других участников. Не вдаваясь в длинное формальное определение случайности, псевдослучайности и хеш-функций, можно с уверенностью сказать, что в настоящее время хеш-функции работают корректно. Нет лучшей стратегии, чем просто выбор случайного числа, что дает одну треть шансов на победу.
Итак, что произойдет, если кто-то не сможет раскрыть свои обязательства? Рассмотрим второй раунд протокола и предположим, что Алиса и Боб публикуют свои обязательства, а Кэрол анализирует их, и говорит: "Если я опубликую свое обязательство, я проиграю. Я вижу случайные числа, которые выбрали Алиса и Боб, я понимаю, какое случайное число я выбрала, и могу запустить этот сценарий сказав, что я не выиграю."
Итак, если Кэрол захочет обмануть остальных, она просто не опубликует свое число. И теперь финальный сценарий невозможно запустить, потому что нет одного входа. Получается, что протокол не работает, если кто-либо из участников злонамерен.
Таким образом, нужна схема публикации обязательства в течение определенного времени.
Предположим, Алиса пытается войти в обязательную хэш-кампанию с Бобом. Для этого Алиса собирается выложить облигацию, которая будет выплачена в двух случаях.
Если Алиса и Боб оба подпишутся, или если Алиса подпишет и покажет свои данные. Тогда можно проверить в сценарии погашения sig, который включает значение Х и имеет определенный хэш.
Таким образом, биткоин с помощью своих встроенных сценариев предоставляет механизм для того, чтобы требовать оплату. В одном случае транзакция будет подписана Алисой и Бобом – и все деньги уйдут Бобу. Боб не сможет потребовать выплаты облигации до некоторого времени t, которое задается с помощью параметра n_lock_time, о котором было рассказано в предыдущих лекциях. Это является страховкой от того, что Алиса откажется участвовать в лотерее. Если она в определенный момент времени ничего не сделает, все деньги уйдут Бобу. В качестве альтернативы Алиса может опубликовать транзакцию до момента t, вернув деньги себе, но если она это сделает, то ей нужно не только подписать ее, но и раскрыть Х данные.
Существует два способа претендовать на эту оригинальную транзакцию, и один из них является действительным результатом протокола. Таким образом, Боб получает облигацию или некоторые деньги, которые она вложила, или же Алиса получит эти деньги от Боба.
Итак, для того, чтобы участники не могли выйти из лотереи, вместо простых хэшированных обязательств используются приуроченные обязательства. Если вернуться к ситуации с третьим участником Кэрол, после того, как она видит случайные числа двух других игроков и понимает свой проигрыш, у нее не будет стимула не публиковать свои данные – она всё равно потеряет деньги, поставленные в облигации. Это будет работать, если облигация выше стоимости, поставленной на карте в лотерее.
Недостатком этой схемы является то, что она довольно сложна. Выполнение срочных хэш-обязательств требует нескольких транзакций. И когда есть N игроков в лотерее, это фактически вычисление логарифма в квадрате. Также нужно вкладывать деньги в облигации и ключевое свойство в том, что отложенная сумма должна быть больше, чем ставка в лотерее. Поэтому это не самый эффективный способ создать лотерею и тем не менее он достаточно работоспособен для небольшого числа участников.
Биткойн как источник случайности
Для создания лотереи с большим количеством участников необходим публичный протокол случайности, который гарантирует случайность выбора у каждого из участников. В настоящее время уже есть практика применения подобных протоколов. Один из примеров – лотерея НБА, которая происходит каждую весну. 30 команд NBA собираются вместе и случайным образом выбирают, опираясь на результаты предыдущего сезона, кто станет победителем среди игроков-любителей в стране и вступит в лигу.
В 1985 году возникло небольшое недоразумение. Лотерею выиграла команда "Нью-Йорк Никс", прогнозируемо выбравшая игрока Патрика Юинга, который был наиболее перспективен. Сразу после этого пошли слухи о том, что лотерея была фальсифицирована так, чтобы "Нью-Йорк Никс" смогла выбрать лучшего игрока. В Интернете можно найти всевозможные теории заговора о том, как NBA сфальсифицировал этот процесс, например, знаменитую теорию Bent Corner, которая говорит, что они вытащили конверт с изогнутым углом из чаши конвертов с разными именами команд. И даже сегодня, когда они открывают эту лотерею каждый год, существует целая куча теорий заговора в Интернете, которые каждый раз утверждают, что процесс прошел несправедливо. Еще один пример – призывная лотерея 1969 года в США, целью которой было определить, какие молодые люди присоединятся к Вооруженным силам, а затем отправятся воевать во Вьетнам. Члены конгресса сбрасывали капсулы с именами участников в пластиковый барабан и далее по очереди протягивали руку и вытаскивали. Участникам присваивался номер, определявший вероятность их присоединения к Вооруженным силам США.
Это был первый случай создания лотереи в национальном масштабе. Важно было поддерживать справедливость и случайность этой лотереи. Но специалисты по статистике проанализировали результаты в течение следующей недели после проведения лотереи и заметили интересный момент, который маловероятно произошел в следствие случайности: большинство дней в конце года получали очень низкие предварительные числа. Причина, по которой это произошло, заключается в том, что, когда специалисты вернулись и посмотрели на ленту, некоторые капсулы, которые были наверху, как правило, так и оставались в том же положении, т.е. смешивания не произошло. Создавалась только видимость смешения капсул. Оба примера показывают, насколько важно создать публичную случайность, которой могут поверить люди. Рассмотрим применение криптографического маяка. Этот маяк похож на реальный маяк, регулярно мигающий. Криптографический маяк будет генерировать новые случайные данные с постоянной скоростью. Цель его заключается в том, что он будет "излучать" единую случайность, которую никто не сможет предсказать заранее, поэтому все согласятся с тем, что маяк выводит случайные данные.
Существует целая куча приложений, помимо простых лотерей. Различные приложения систем аудита и голосования, обеспечивающие доказательство нулевого знания, протоколы "сокращения и выбора" в источниках по безопасности, содержат множество примеров того, что можно сделать гораздо проще и эффективнее, если бы был идеальный криптографический маяк, который удовлетворял бы всем этим необходимым свойствам.
Но, к сожалению, идеальное решение пока не найдено. Поэтому публичный показ колеса, бросание монеты, кубиков и т.п. остаются популярными и понятными способами показать формирование случайности. Но они плохо работают при удаленных сценариях, потому что всем участникам кажется, что процесс сфальсифицирован. Очень трудно установить доверие удаленно в любом физическом процессе. NBA пытается решить эту проблему на протяжении многих лет, пытаясь убедить фанатов в том, что они проводят честную лотерею. Они создали и конверты, и подпрыгивающие шары пинг-понга, но люди всегда придумывают сценарии, в соответствии с которыми их могут обмануть.
Национальный институт стандартов и технологий, НИСТ, в течение последних нескольких лет проводит эксперимент, целью которого является запуск собственного маяка. Для генерации случайных чисел используется сложная настройка с участием двух запутанных фотонов, что дает гарантии случайности, порожденной квантовомеханическим явлением. И если верить принципу неопределенности Гейзенберга и другим основным принципам физики, тогда это должно быть случайным, и никто не сможет это фальсифицировать. НИСТ в Интернете публикует каждые 60 секунд множество случайных данных и подписывает их. Любой может использовать эти данные, если доверяет НИСТ и его эксперименту.
Для того чтобы решить проблему доверия, можно было бы использовать некоторые природные явления, за которыми все могут наблюдать и которые сложно подделать. Например, солнечные пятна, солнечная активность, скорость ветра или температура на определенное число и т.п. Проблема такого подхода в том, что он довольно медленный – температура и солнечная активность меняются не так часто. Вторая проблема – может возникнуть необходимость в доверенной стороне. Допустим, в качестве источника случайного сигнала будут сведения о температуре завтра в Москве. При этом у одного термометр покажет 25 градусов, а у другого – 26. И разница между этими двумя значениями будет означать победу в лотерее для одного из участников.
Чтобы обойти эту проблему, вероятно, нужно использовать термометр конкретного человека для измерения температуры. Или взять сведения у федеральной службы "Росгидромет". В любом случае снова появляется некая доверенная сторона.
Аналогичная идея заключается в том, чтобы собрать финансовые данные, в частности, цены на фондовом рынке, и выявить источник случайности из них.
Эти сведения являются общедоступными. И есть довольно хороший аргумент, основанный на совокупности сложных финансовых моделей, в соответствии с которым очень сложно предсказать колебания цен на акции на низком уровне. Если кто-то мог бы предсказывать конечную цену конкретной акции на фондовой бирже в определенный момент времени в будущем, он моментально стал бы богат. Можно в определенной степени манипулировать ценой акции, пытаясь привести ее к конкретному значению, но это очень дорого и довольно медленно. В этой схеме опять присутствует доверенная сторона в виде самой фондовой биржи, у которой есть некоторый контроль над всем этим процессом. Помимо этого компания, которая эмитирует акции, может попытаться изменить цену хотя бы на копейку.
Суть заключается в том, что у всех рассмотренных подходов есть своя доверенная сторона, которая в какой-то мере управляет процессом. И если перейти на идеологию Биткоин, то необходимо вспомнить, что Биткоин децентрализован, и в системе фактически нет доверенных участников. Так можно ли получить источник случайности из блочной сети Биткоина?
Майнерам приходится находить случайное число для каждого блока. Почему нельзя использовать случайные данные, которые майнеры находят в процессе добычи при создании маяка случайности?
Итак, есть довольно сильный аргумент, что нельзя с большой вероятностью предсказать выпадение случайного числа.
Поэтому, если бы была возможность предсказать, каким будет следующее случайное число, с вероятностью, превышающей 1 / d, где d – трудность поиска блока, тогда появится более быстрый способ добычи блока, чем просто случай. И помните, что d довольно высокое значение сейчас. Каждый блок, должен иметь 66 бит случайности, которые невозможно предсказать. По крайней мере, если биткойн безопасен, ни один из майнеров или кто-либо еще не сможет предсказать, какими будут эти случайные биты.
Итак, довольно просто превратить цепочку блоков с минимальными изменениями в маяк случайности.
Для этого нужно взять каждый блок в цепочке, и запустить значение blockheader через функцию экстрактора. И функция экстрактора, не вдаваясь во все детали, похожа на хэш-функцию и предназначена для вытеснения всех случайных данных в одну равномерную случайную строку. И это создаст хороший маяк случайности, и каждый раз, когда блок публикуется в биткойне, будет появляться новый выход из маяка.
Насколько дорого стоило бы манипулировать этим? Любой майнер имеет возможность, если он найдет блок, не публиковать его в сеть, при этом не позволяя ему быть следующим блоком в последовательности. Майнер может сделать это, если блок будет сгенерирован с маяковым выходом, который его не устраивает. Также возможна ситуация, когда кто-то пытается заставить маяк вывести определенный выход. Тогда он может подкупать майнеров, которые находят "нежелательные" блоки и предлагать им вознаграждение, большее, чем вознаграждение за блок в обмен на то, что эти блоки не будут опубликованы. Допустим, необходимо застать какой-то маяковый выход с вероятностью p. Для этого нужно отбросить несколько блоков, пока не будет найден нужный блок. И ожидаемое количество блоков, которые придется отбросить, - 1 / p-1, а с одним флагом монет p является всего лишь половиной.
Отбрасывать блок довольно дорого, так как при этом теряется награда за блок в 25 биткоинов или около 15 000 долларов США.
В среднем нужно будет отказаться от одного блока и потерять всего 25 биткойнов. И если есть лотерея N-party, где это справедливо между всеми N-сторонами, это будет 25 раз n-1 биткойнов. Таким образом, процесс будет безопасным, пока выигрыш лотереи будет меньше, чем стоимость манипулирования. Если два человека хотят сделать ставку на равные шансы, и они хотят использовать Биткойн в качестве источника случайности, это будет безопасно, если их ставки будут менее 25 биткоинов.
Это первое предложение по реализации действительно децентрализованного маяка. И по сравнению с некоторыми другими процессами, это на самом деле довольно быстрый процесс. Он не будет выводить результаты так же часто, как маяк НИСТ, который упоминался ранее. Случайное число будет формироваться каждые 10 минут. Большим плюсом является то, что можно точно рассчитать стоимость манипуляции случайным выходом через количество блоков, которые нужно отбросить.
Недостаток использования Биткойна в качестве маяка по сравнению с некоторыми альтернативами заключается в том, что время появления нового блока немного неточно. Предположим, что нужно просчитать стоимость маяка завтра в полдень. Для этого нужно будет просто угадать, основываясь на распределении, и рассчитать в среднем, какой блок-индекс будет опубликован завтра в полдень. Но это даст немного разногласий. И также придется откладывать время на подтверждение блока (примерно 6 секунд), прежде чем будет принято решение, что это действительно последний выход маяка.
При этом стоимость манипулирования маяком будет слишком низкой для некоторых случаев. Например, в случае с лотереей NBA, когда на кону миллионы долларов, одна из команд может начать подкупать майнеров, чтобы манипулировать процессом. Поэтому вопрос увеличения безопасности в случае большой выгоды является открытым. В настоящее время нет никакой случайности в сценарии биткоинов. И поэтому заманчивой кажется идея расширить язык сценариев, чтобы создать специальный код операции для вызова маяка. И если в рассмотренных примерах маяк использовался как общедоступный источник случайности, то в случае встраивания случайности в сценарии, любой майнер смог бы иметь свой источник случайности. Это позволило бы заменить весь сложный протокол лотереи с облигациями и несколькими раундами одним сценарием, который бы выводил случайный выход.