Триптих Максималиста: Трактат об альткоинах. Криптография Биткоина
Автор Эндрю Поэлстра. Оригинал
Это продолжение частей "Что такое криптосистемы?" и "Что такое криптовалюты?".
5. Крипография Биткоина, часть 1: транзакции и подписи
На концептуальном уровне биткоин-транзакции работают следующим образом: чтобы потратить биткоин, вы подписываете цифровой подписью сообщение, которое содержит (а) сумму, которую нужно потратить, и (б) открытый (публичный) ключ получателя. Затем, когда получатель захочет потратить деньги, он должен будет предоставить ссылку на транзакцию, по которой он их получил, и подписать новое сообщение приватным ключом получателя этой транзакции.
Как обсуждалось выше, фактическая реализация более сложна - для поддержки разделения балансов, контроля подписываемых данных и т. д. И поскольку финансовые контракты часто более сложны, чем «деньги стороны X теперь принадлежат стороне Y», алгоритм подписи Биткоина включает простой скриптовый язык (Bitcoin Script, прим. ред.).
[объяснить про транзакции и подписи, CHECKSIG и т. д.] — Поэльстра не закончил эту часть эссе, прим. ред. Мы приведём пример из Mastering Bitcoin.
Рассмотрим один из типов трат в Биткоине Pay-to-Public-Key, т.е. трату на публичный ключ.
Pay-to-public-key— это более простая форма платежа, чем pay-to-public-key-hash. В этом видесценариев, в теле запирающего сценария хранится публичный ключ, а не более короткий хешпубличного ключа, как в случае с P2PKH (Pay-to-public-key-hash), рассмотренном ранее. Pay-to-public-key-hash был введен Сатоши в целях сделать Bitcoin-адреса короче, для упрощенияиспользования. Pay-to-public-key в настоящее время наиболее часто встречается в coinbase-транзакциях, создаваемых старым майнинговым ПО.
Запираюший сценарий pay-to-public-key выглядит следующим образом:
<Public Key A> OP_CHECKSIG
Соответствующий отпирающий скрипт для этого типа выхода — это простая подпись:
<Signature from Private Key A>
Комбинированный сценарий, который проверяется программным обеспечением проверки транзакций:
<Signature from Private Key A> <Public Key A> OP_CHECKSIG
Этот сценарий представляет собой простой вызов оператора CHECKSIG, который проверяетсоответствие подписи ключу и возвращает TRUE на стеке
[исследовать опасные / плохие идеи] — Поэльстра также не закончил и эту часть эссе, прим. ред.
Неполнота по Тьюрингу. Язык Биткоин-транзакций содержит много операторов, но сознательно ограничивается водном важном вопросе — в нем нет циклов или сложных возможностей управления потоком выполнения. Это гарантирует, что язык не Полный по Тьюрингу, что означает ограничение сложности скриптов и предсказуемое время выполнения. Script не является языком общего назначения. Его ограничения гарантируют, что язык не может быть использован для создания бесконечного цикла или другой формы "логической бомбы", которая могла бы оказаться в транзакции, вызвав, таким образом атаку на отказ в обслуживании Биткоин-сети. Помните,каждая транзакция подтверждается каждым полным узлом в сети Биткоин. Ограничение языка предотвращает использование механизма проверки транзакций в качестве уязвимости (Mastering Bitcoin, издание на русском)
- Наблюдение извне (мы добавим здесь параграф из Mastering Bitcoin, который относится к анонимности Биткоина, в котором открытый блокчейн, копию которого может иметь каждый, создаёт условия для "подсматривания" чужих транзакций — особенно если адрес пользователя известен наблюдателю, прим. ред.)
Bitcoin часто ошибочно характеризуется, как "анонимная" валюта. На самом деле,относительно легко связать пользователей с Биткоин-адресами и, используя аналитику больших данных, связать адреса друг с другом и получить полную картину чьих-то потребительских привычек. Несколько альт-коинов направлены на решение этой проблемы непосредственно, сосредоточив внимание на сильной анонимности. Первая такая попытка,скорее всего Zerocoin, протокол мета-монеты для сохранения анонимности поверх Bitcoin,впервые опубликованный в 2013. Zerocoin будет реализован в виде полностью отдельного альт-коина под названием Zerocash, находящегося в процессе разработки на момент написания книги. Альтернативный подход к анонимности, был обозначен для CryptoNote в статье, опубликованной в октябре 2013 г. CryptoNote находится в основе некоторых других форков, обсуждающихся далее. В дополнение к Zerocash и CryptoNotes, есть несколько другихнезависимых анонимных монет, таких как Darkcoin, которые используют стелс-адреса или транзакции повторного смешивания для анонимности (Обратите внимание на то, что в 2021 Darkcoin уже является малоизвестной монетой — настолько поменялся "рынок". При этом организация, поддерживающая Zerocash, планирует переход на Proof-of-Stake, прим. ред.)
6. Криптография Биткоина, часть 2: распределенный консенсус
Распределенный консенсус, как этот термин используется в Биткоине, представляет собой консенсус (то есть глобальное соглашение) между не доверяющими друг другу не идентифицированными сторонами, которые не обязательно присутствовали во время старта системы. При этом разрешено и даже необходимо синхронное общение; то есть существует некоторый максимальный интервал D, по истечении которого все валидные транслируемые данные достигают всех сторон [2]*. Мы не предполагаем (и в ненадежной и физически разрозненной сети не можем предполагать), что узлы согласовывают точное время или даже порядок следования сообщений в сети.
* Чтобы получить конвергентную (сходящуюся к консенсусу) сеть, нам требуется только, чтобы блоки распространялись по всей сети в среднем до того, как появится следующий блок. Из соображений эффективности мы хотим, чтобы в действительности распространение происходило намного быстрее, чем создаются блоки, и именно это происходит на практике.
Для корректной работы криптовалюты достаточно достичь распределенного консенсуса в отношении временного порядка транзакций (и ничего другого). Это подразумевает консенсус в отношении «первой транзакции, которая перемещает эти конкретные средства», и это гарантирует новому владельцу средств, что сеть распознает их в этом качестве.
Причина, по которой необходим этот консенсус, называется проблемой двойной траты. В любой схеме децентрализованной цифровой валюты существует вероятность того, что отправитель может послать одни и те же деньги двум разным людям, и обе траты будут казаться валидными. Таким образом, получатели должны быть уверены в отсутствии конфликтов или в том, что при наличии конфликтов сеть распознает их версию как правильную. Распределенный консенсус выстраивания транзакций по порядку достигает этой цели: в случае конфликта все соглашаются, что транзакция, которая пришла первой, валидна, а все остальные - нет.
(Другие проблемы с цифровой валютой, например, аутентификация и предотвращение подделок, сравнительно просты и могут быть решены с помощью традиционной криптографии, как обсуждается в других разделах этого документа.)
Экономические предположения. Наши предположения о топологии сети Биткоина делают ее хорошо подходящей для достижения распределенного консенсуса. Например, она легко избегает классического вывода о невозможности FLP [[1]] как при помощи недетерминированной, так и посредством синхронной связи.
FLP означает, что после сбоя "классическая" сеть Биткоина без Proof-of-Work не могла бы восстановиться до работоспособного состояния без внешней помощи.
Однако, поскольку участники сети Биткоина анонимны и не имеют зарегистрированной личности, распределенный консенсус на самом деле является сложной проблемой (см. раздел "Обсуждение" в [2]). Биткоин - первое очевидное решение этой проблемы, и достигается оно только за счет ослабления его требований с криптографической гарантии до чисто экономической. В частности, он вводит альтернативные издержки извне системы (затраты на время и энергию вычислений) и обеспечивает вознаграждение внутри системы, но только в том случае, если сохраняется консенсус в отношении непрерывной истории транзакций.
Эта зависимость от экономических предположений имеет два серьезных последствия:
- Стало куда труднее сделать тщательный анализ. Стандартные криптографические доказательства предполагают, что злоумышленник делает все в рамках своих (четко определенных) возможностей, чтобы взломать криптосистему. Биткоин, напротив, требует анализа стимулов злоумышленника, смешивая четко определенную математику с неясной экономикой, и вводит зависимости от фактического распределения богатства и энергии в мире. До сих пор неясно, как обеспечить этому анализу прочную основу, и даже неясно, работает ли этот механизм распределенного консенсуса. Но Биткоин работает более или менее децентрализованно уже более пяти лет, и это вселяет в нас надежду.
- Стандартные криптографические доказательства пытаются дать честным сторонам экспоненциальное преимущество перед нечестными. Вот почему мы можем производить цифровые подписи, которые могут быть честно созданы с помощью ключей с RFID, в то время как их подделка потребует большей вычислительной мощности, чем существует во вселенной. Однако при распределенном консенсусе Биткоина честная сторона имеет только линейное преимущество перед злоумышленником: вести себя честно (писать историю) столь же легко, как и нечестно (переписывать историю). Вот почему Биткоин уязвим для так называемой атаки 51%: как только нечестная сторона становится большинством, у нее появляется преимущество перед честными сторонами.
Механизмы. Способ, которым Биткоин достигает распределенного консенсуса, - это доказательство работы на основе хэша, Proof-of-Work [11]. Биткоин предоставляет каждому кандидату на запись в историю транзакций способ доказать: (а) то, что он понес затраты, и (б) сколько именно. Это доказательство работы. Кроме того, доказанная работа включает в себя работу всех участников, которые работали над историей * [тут стоит процитировать, какие материалы лотереи А. Миллера являются общедоступными]. Консенсусная история - это история с наибольшей суммарной работой (по крайней мере, в той степени, в какой эта информация распространилась по сети - наше слабое требование синхронности означает, что консенсус по самой последней части истории остается неопределенным). Поскольку консенсусная история - единственная, которая содержит потраченные вознаграждения за проделанную работу, это означает, что (а) у доказывающих есть стимул работать над той же историей, что и у других доказывающих, и (б) отдельные доказывающие не могут контролировать историю, потому что им нужен вклад других участников сети.
* В частности, работа, проделанная даже теми майнерами, которые не находят блоки, учитывается в суммарной работе точно так же, как молекулы газа в ящике влияют на температуру окружающей среды, даже если они не сталкиваются с термометром во время измерения. Это не аналогия. Принципы те же. [процитировать еще не написанную статью о криптографической термодинамике]
6.1. Режимы отказа
Системы распределенного консенсуса имеют новые и катастрофические режимы отказа, которых нет в обычных системах. Причина того, что отказ от консенсуса является катастрофическим, заключается в том, что в криптовалюте консенсусом определяется само время. Если консенсус теряется, в лучшем случае время останавливается, и валюта становится непригодной для использования. В худшем случае возникают разногласия по поводу истории, и становится возможным мошенничество.
Не менее серьезным, чем полное нарушение консенсуса, является его частичное нарушение: если сеть разделяется на две или более «фракции», которые расходятся во мнениях по поводу истории, то двойная трата становится проще, поскольку конфликтующие транзакции помещаются в различные цепочки.
Менее серьезным, чем нарушение консенсуса, оказывается риск плохих стимулов, которые могут привести к централизации консенсуса, отвратить не майнеров от аудита транзакций, от включения транзакций в блоки или от быстрой публикации блоков. Конечно, этот список не исчерпывающий.
Даже простых изменений, внесенных в Биткоин с помощью обычных альткоинов, было достаточно, чтобы вызвать подобные проблемы. Вот некоторые примеры:
- Консенсус, зависящий от архитектуры. В раннем альткоине Solidcoin 2.0 изменения сложности рассчитывались с использованием операций с плавающей запятой. Это привело к тому, что пользователи разных систем не пришли к согласию относительно корректного расчета сложности, что привело к серьезному нарушению консенсуса. (Первоначальный solidcoin имел очень быстрые изменения сложности, что также привело к нарушению консенсуса - эта проблема, за которой последовала воинственная и карикатурная реакция ее изобретателя [13], послужила первоначальным источником вдохновения для данной статьи)
- Плохое управление обновлениями. Важно понимать, что каждый фрагмент кода, который влияет на достоверность блоков - это фрагмент кода, который должен быть идентичным для всех находящихся в консенсусе узлов. Изменение этого кода требует тщательно спланированного перехода, включая публичные заявления большинства заинтересованных сторон о том, что они переключатся в нужное время.
В качестве крайнего примера неудачи приведу события в январе 2014 года, когда мемный альткоин Dogecoin внес небольшие, казалось бы, изменения в промежуточную версию своего эталонного клиента. Это изменение повлияло на максимальный размер выхода транзакции Dogecoin, разрешенный в блоке. Поскольку не все узлы обновились, как только появлялась транзакция, действующая по новым правилам, но не по старым, блокчейн напрочь разветвлялся. В истинном духе веселого идиотизма Dogecoin пользователи немедленно поскакали на Reddit и принялись бездумно раздавать друг другу чаевые, зная, что нет единого мнения о том, кто кому платит [14].
Поскольку у Dogecoin небольшое сообщество, в основном обитающее на Reddit, и поскольку их пользователи не хранят большую ценность в валюте, этот беспорядок был устранен разработчиками, принявшими решение об «истинной истории» (то есть путем централизации консенсуса, по крайней мере, в этом случае) и публикации на Reddit о том, что всем пользователям необходимо обновиться.
Кроме того, следует отметить, что многие криптовалюты имеют механизм, позволяющий разработчикам эталонного клиента отправлять экстренные сообщения в сеть. Для Dogecoin это было невозможно, так как экстренные сообщения должны быть подписаны цифровой подписью разработчиков, но когда для dogecoin копировали исходный код Litecoin, то забыли установить новый ключ для подписи!
- Высокая частота блоков. Обычное изменение при создании альткоинов - увеличение частоты блоков, поскольку цель и значение подтверждений транзакций понимается создателями неправильно. Это увеличивает частоту второстепенных форков блокчейна (которые приводят к устаревшим блокам и потраченной впустую майнинговой мощности), а также увеличивает затраты на обеспечение пропускной способности и проверки транзакций узлами, не вовлеченными в майнинг. Оба фактора имеют тенденцию увеличивать централизацию.
Если частота блоков очень высока, новые блоки будут создаваться быстрее, чем они могут быть переданы и проверены. Это разрушает консенсус, поскольку в прошлом узлы по сути всегда видели конкурирующие блокчейны. (Помните, что время достижения консенсуса измеряется общей сложностью блокчейна, грубо говоря, высотой блока.) Следовательно, первая цепочка, которую они видят, всегда будет длиннее, чем другие, и у каждого узла будет свое представление о наилучшей цепочке.
Это случилось с feathercoin, у которого были 60-секундные блоки. Им не удалось достичь распределенного консенсуса, поэтому сеть была изменена так, чтобы требовать подписи разработчиков на всех блоках. (Они приобрели код для подписи блоков у Peercoin, чьи проблемы с консенсусом подробно описаны в Разделе 6.4. [TODO: вставить цитату]). В итоге их валюта имеет централизованный консенсус; Поскольку целью proof-of-work является достижение распределенного консенсуса, майнинг feathercoin совершенно лишен смысла.
- Изменение размера блока. Большие блоки обычно хороши для майнеров, у которых есть мощные системы и которые заинтересованы в комиссиях за транзакции. Фактически, майнерам с хорошими системами могут потребоваться большие блоки, потому что их проверка требует больших затрат, что выдавливает майнеров со слабыми системами, для которых затраты на верификацию относительно велики.
Однако большие блоки плохо подходят для узлов, не занимающихся майнингом, потому что они требуют большей пропускной способности, больших усилий по проверке и большего объема хранилища. Таким образом, определение размера блока - это компромисс между высокой пропускной способностью сети и высокой децентрализацией.
Многие предлагали искать этот баланс, адаптивно меняя размер блока. Проблема в том, что все консенсусные данные в конечном итоге определяются майнерами. Поэтому они будут увеличивать размер блока, поскольку у них есть стимул делать это, и сеть станет централизованной.
Тема размера блока — предмет только начинавшейся "Войны за размер блоков" в Биткоине, в тот момент, когда Поэльстра писал эссе. Подробнее о теме размера блоков можно прочитать в книге Джонатана Бира (ред.)
[10] *** здесь авторское примечание, которое перенесено в текст
[11] Доказательство работы было изобретено Адамом Бэком как часть Hashcash, предшественника Биткоина. См. Адам Бэк, Hashcash - A Denial of Service Counter-Measure, технический отчет, август 2002 г.
[12] *** здесь авторское примечание, которое перенесено в текст
[13] Например, доказательство работы в solidcoin 2.0 включало хеширование личной обличительной речи, написанной его изобретателем о другом пользователе доски объявлений.
[14] Желающие могут ознакомиться с соответствующим тредом на реддите.
Поддержите переводчиков!
Проект финансируется со средств аукциона газеты "Bitcoin Day" подаренной каналу @saul_freeberty. Поощрить переводчика вы можете с помощью LNURL-кода