Глава 3

Как работает Monero

В первых двух главах мы написали всё, что необходимо знать о том, ПОЧЕМУ следует пользоваться Monero (Глава 1), а также о том, КАК пользоваться Monero (Глава 2). К настоящему моменту вы узнали всё, чтобы начать самостоятельно пользоваться Monero!

В оставшейся части этой книги содержатся дополнительные подробности, предназначенные для тех, кто хочет глубже погрузиться в принципы работы Monero, скрытые «за фасадом». В Главах 3 и 4 описаны технологии, лежащие в основе Monero, такие как механизм обеспечения анонимности, блокчейн, а также процесс майнинга. Главы ориентированы на понимание концепций людьми, не желающими вникать в сложности продвинутой математики. Последующие главы содержат мельчайшие подробности, которые будут интересны разработчикам и гикам от криптографии.

3.1 Транзакция и реестр

Чтобы подготовить почву для понимания технологий анонимности Monero, мы рассмотрим, как Monero отправляются в реестр и принимаются им. В этой главе мы остановимся на функциях блокчейна, его роли в качестве защищённой от внешнего воздействия, совместно используемой базы данных, в которой хранится список транзакций Monero. Подробная информация, касающаяся безопасности блокчейна (майнинга, хешей и т. д.), является отдельной темой, которой посвящена Глава 4.

Когда вы впервые настраиваете кошелёк, он генерирует новую мнемоническую фразу, которую вы будете хранить в тайне и использовать для доступа к вашим Monero через блокчейн. Этот процесс инициализации выполняется на вашем устройстве и может происходить полностью в режиме оффлайн: во время создания кошелька ничего не передаётся, и ничего не записывается сетью.

«За кулисами» ваш кошелёк на основе мнемонической фразы вычисляет два набора ключей. Ваши приватные ключи являются особо охраняемой тайной, так как вы будете пользоваться ими для того, чтобы доказать вашу личность и получить доступ к вашим Monero. Ваши публичные ключи, о чём говорит их название, могут стать известны другим пользователям Monero. Публичные и приватные ключи генерируются вместе, наборами, и обладают определёнными математическими свойствами, которые создают особую связь между ключами.

Чтобы получить Monero, вы даёте свой адрес (создаваемый на основе ваших публичных ключей) отправителю. Когда кто-то (клиент, биржа или ваш друг) отправляет вам Monero, он транслирует свою транзакцию, которая преобразует несколько его Monero в новую запись в реестре, которая может быть открыта вами (и только вами) при помощи ваших приватных ключей.

На профессиональном техническом жаргоне выход транзакции сохраняется в блокчейне, где вы можете, когда вам угодно, получить доступ к нему и потратить, используя свои приватные ключи. Эта терминология может ввести в некоторое замешательство, так как в случае с криптовалютами слово «выход» имеет несколько иной, отличающийся от обычного, смысл.

Всякий раз, когда вы получаете Monero, вы получаете очередной выход; всякий раз, когда вы тратите Monero, вы используете один из ваших выходов и генерируете новый для кого-то другого. Фактически все Monero, которыми вы «владеете», являются просто выходами в блокчейне, которые раскрываются вашими приватными ключами. До тех пор, пока кто-нибудь не отправит вам Monero, в блокчейне не будет никаких выходов, связанных с вашими приватными ключами или доступных для них.

Когда ваш кошелёк сканирует сеть или синхронизируется, это означает, что он использует ваши приватные ключи, чтобы проверить все транзакции и выходы в блокчейне, чтобы идентифицировать соответствующие записи. Баланс вашего кошелька является общей суммой этих выходов, которые можно открыть и потратить при помощи ваших приватных ключей.

Когда вы отправляете Monero из вашего кошелька, вы используете некоторые из ваших выходов в качестве входов транзакции, которую вы транслируете в сеть. Концептуально блокчейн является просто записью этих транзакций, при проведении которых в качестве входов тратятся выходы отправителей, и в результате которых генерируются новые выходы для получателей.

Процесс, описанный выше, немного упрощён, чтобы донести до читателя самые существенные его составляющие (приватные / публичные ключи, транзакции, входы / выходы). В последующих разделах приводится нетехническое объяснение сути концепций ключей, лежащих в основе ряда механизмов обеспечения анонимности Monero.

3.2 Обзор технологии обеспечения анонимности

Общие принципы и терминология, представленные выше, используются большинством криптовалют. Monero предлагает своим пользователям улучшенные функциональные возможности и более высокий уровень анонимности, которые обеспечиваются уникальными криптографическими технологиями, скрывающими пользователей и их действия от публичного просмотра. На рисунке 3.1 показано, как эти взаимодополняющие механизмы работают вместе, защищая чувствительную информацию, содержащуюся в транзакциях:

  • протокол RingCT скрывает сумму транзакции;
  • кольцевые подписи защищают отправителя, скрывая, какой из выходов был потрачен;
  • скрытые адреса гарантируют, что адрес получателя не будет записан в блокчейн;
  • Kovri разрывает связь между вашей транзакцией и физическим местоположением, скрывая источник трансляции и сетевые признаки деятельности, связанной с Monero.

Рисунок 3.1

3.2.1 Кольцевые конфиденциальные транзакции

Протокол Ring CT является криптографической технологией, скрывающей сумму Monero, отправляемую при проведении любой транзакции. В случае с большинством криптовалют суммы транзакции прописываются прямым текстом, который может быть прочитан любым наблюдателем. RingCT позволяет соблюсти конфиденциальность чувствительной информации, позволяя отправителю доказать, что у него имеется достаточно Monero для проведения транзакции, не раскрывая значения суммы! Это возможно благодаря криптографическим обязательствам и доказательствам диапазона.

Когда вы отправляете Monero, вы приватно даёте «обязательства» по сумме, раскрывая ровно столько информации, сколько нужно сети для подтверждения легитимности транзакции. При этом вы не раскрываете самой суммы. Действительное обязательство гарантирует, что транзакция не является мошеннической, и при её проведении не создается или не тратится больше Monero, чем есть у вас на самом деле.

Доказательства диапазона являются другим важным механизмом RingCT и используются как метод, гарантирующий, что сумма, по которой были даны обязательства, больше нуля и меньше определённого числа. Они необходимы для того, чтобы отправитель не мог дать обязательства по отрицательной или нереально большой сумме Monero. Вместе обязательства и доказательства диапазона защищают денежную массу Monero от мошеннических манипуляций и попыток подделки.

До появления RingCT транзакции Monero разбивались на суммы с определённым номиналом (например, 12.5 XMR были бы отправлены как 10 XMR + 2 XMR + 0.5 XMR), и суммы транзакций были видимы внешним наблюдателям. Протокол RingCT был активирован в январе 2017 года, после чего очень быстро и широко стал использоваться. Спустя всего месяц после его активации приблизительно 98% новых транзакций уже добровольно использовали протокол RingCT!

В соответствии с политикой Monero, предполагающей обеспечение анонимности по умолчанию, протокол RingCT стал обязательным для всех транзакций Monero, начиная с сентября 2017. Чтобы выходы, сгенерированные до введения RingCT можно было потратить, они сначала должны быть преобразованы в выходы RingCT с «замаскированными» суммами.

3.2.2 Скрытые (одноразовые) адреса

При проведении всех транзакций Monero используются скрытые адреса, позволяющие защитить анонимность получателя. Чтобы адрес кошелька получателя не был сохранён в блокчейне, при каждой транзакции Monero используется уникальный одноразовый «расходный» адрес. Получатель может получить доступ к средствам, отправленным на скрытый адрес, не обнаруживая связи с публичными адресами кошелька или с другими транзакциями.

Рисунок 3.2

Чтобы концептуально описать использование произвольных одноразовых кодов, призванных защитить информацию о личности получателя, представьте, что вы хотите дать несколько книг о лечении специфической болезни вашему другу по имени Андре. К сожалению, вам необходимо покинуть город, и вы не встретитесь с Андре в течение всей следующей недели. Возможно, вы могли бы попросить вашего приятеля соседа взять книги на время и передать их получателю.

Вашему соседу будет необходимо убедиться в том, что тот, кто спросит книги, действительно является тем самым получателем, для которого они предназначены. Так как ваш друг является частным лицом со специфической болезнью, будет не совсем правильно говорить вашему соседу, чтобы он проверил его личность, используя имя Андре. И как совершить передачу, сохранив анонимность Андре? А можно просто создать одноразовый произвольный код и сказать вашему соседу, чтобы он передал книги тому, кто назовёт этот код (например, отдать книги тому, кто знает фразу PolarComboTango357). Ваш сосед тогда сможет проследить за книгами и передать их Андре, ничего не узнав о получателе.

Подобно тому, как вы используете произвольный неинформативный код, чтобы ваш сосед не смог узнать ничего о получателе ваших книг, Monero использует систему одноразовых кодов, чтобы сеть не знала ничего о получателях Monero! Вместо чёткой записи адреса получателя в блокчейне (что равносильно «передайте эти книги Андре») средства всегда высылаются на одноразовый «скрытый адрес» (что уже равносильно «передайте эти книги тому, кто знает фразу PolarComboTango357). Криптографические технологии, обеспечивающие безопасность скрытых адресов исключительно в целях обеспечения анонимности получателя, рассматриваются в Главе 5. Тем не менее основные моменты подробно описаны ниже.

Как генерируются эти одноразовые адреса? Ваши публичные адреса кошелька Monero представляют собой строки из 95 символов, включающие в себя два публичных ключа (публичный ключ просмотра и публичный ключ траты), которые математически вычисляются на основе вашей мнемонической фразы. Когда кто-либо отправляет средства, он использует публичные ключи вашего адреса с некоторыми произвольными данными, чтобы сгенерировать уникальный одноразовый публичный ключ. Эти одноразовые публичные ключи, которые записываются в транзакции и сохраняются в блокчейне, называются скрытыми адресами, поскольку сеть или внешний наблюдатель не могут связать эти произвольные коды с кошельком, ставшим инициатором транзакции.

Рисунок 3.3

Следует отметить, что подадреса не являются тем же самым, что и скрытые адреса. Подадреса — это многократно используемые публичные адреса кошельков, сохраняемые в блокчейне. Множество транзакций, отправляемых на один подадрес, будет передано по различным и несвязываемым скрытым адресам.

Повышение уровня анонимности за счёт того, что адреса кошельков не сохраняются в блокчейне, является очевидным преимуществом реализации скрытых адресов. Ещё большее значение имеет тот факт, что использование этих уникальных одноразовых ключей не позволяет связать множество платежей, поступающих на один и тот же адрес!

Предположим, вы занимаетесь какой-либо творческой работой на общественных началах и публикуете адрес для пожертвований в криптовалюте. Если вы пользуетесь монетой с прозрачным блокчейном (например, Bitcoin), то каждая входящая на этот адрес транзакция будет записываться в связываемой форме, благодаря чему за вами можно будет следить. Любой сможет, воспользовавшись блокчейн-эксплорером, увидеть, сколько пожертвований в Bitcoin было вами получено, конкретные суммы этих пожертвований, а также перевели вы средства или нет. Каждая входящая транзакция Bitcoin индексируется в реестре в соответствии с адресом, который был вами опубликован.

Если вместо этого вы опубликуете адрес Monero, ваши пожертвования не станут объектом всеобщего внимания. Каждый жертвователь будет генерировать уникальный одноразовый скрытый адрес, который будет вноситься в реестр. Публичный адрес для пожертвований, который был размещён вами рядом с проектом, никогда не будет напрямую указан в транзакции, а скрытые адреса не дают никакой информации о получателе. Так как каждый жертвователь при создании скрытого адреса транзакции смешивает собственную произвольную информацию, один жертвователь не сможет распознать скрытый адрес другого. Все транзакции Monero должны использовать скрытые адреса, чтобы обеспечить анонимность всей сети. При формировании транзакции ваш кошелёк автоматически создаёт скрытые адреса, используя ваш публичный адрес.

3.2.3 Кольцевые подписи

Кольцевые подписи являются характерной особенностью Monero, предназначенной для защиты отправителя транзакции путём обфускации источника отправляемых Monero. Перед тем как перейти непосредственно к кольцевым подписям, нам бы хотелось рассказать о концепции цифровых подписей в целом.

Цифровые подписи являются общим криптографическим способом подтверждения аутентичности источника данных или сообщения. Подписи могут быть проверены методом определения соответствия публичного ключа личности подписанта, а также верификации полноты и неизменности сообщения. Если подписанные данные будут изменены хотя бы на один символ (намеренно или случайно в результате ошибки в передаче), подпись будет считаться недействительной.

Различные варианты реализации цифровых подписей являются ключевым компонентом всех криптовалют. Чтобы потратить один из ваших выходов, вам необходимо составить для передачи в сеть сообщение, описывающее транзакцию, подписать его вашим соответствующим приватным ключом, а затем транслировать результат в сеть. Перед тем как провести транзакцию, сеть проверит действительность подписи, чтобы убедиться, было или нет изменено и / или подделано сообщение третьей стороной, у которой нет правильного приватного ключа.

В случае с прозрачными криптовалютами (например, Bitcoin) каждое сообщение, описывающее транзакцию, ясно демонстрирует, какие выходы были потрачены. Это довольно удобно с точки зрения бухгалтерии, так как сеть просто поддерживает запись непотраченных выходов транзакций (UTXOs), которые считаются действительными входами новых транзакций. Если кто-то попытается потратить один и тот же выход Bitcoin дважды, вторая мошенническая транзакция будет просто отклонена, так как сети известно, что владелец уже тратил этот выход (когда была подписана и транслирована в сеть первая транзакция). К сожалению, такое прямое доказательство владения крайне пагубно с точки зрения анонимности, так как в этом случае вполне определённо указывается источник средств, а также момент, когда был потрачен определённый выход.

Monero использует другую схему, известную как кольцевые подписи. Этот метод группового подписания позволяет одному члену поставить цифровую подпись под сообщением от лица всей группы, смешавшись с публичными ключами остальных членов группы, в результате чего неясно, кто именно действительно подписал сообщение. Можно криптографически проверить, что среди участников кольца есть истинный подписант, но невозможно определить, кто конкретно создал подпись.

В случае с Monero кольцевые подписи используются для того, чтобы смешать ключи множества выходов в блокчейне. Это позволяет скрыть, какой из выходов был действительно потрачен. Предположим, Мария хочет потратить один из своих выходов Monero. Её кошелёк «полупроизвольно» выберет несколько из последних выходов, имеющихся в блокчейне (но не принадлежащих Марии), и смешает их с её публичными ключами в кольцевой подписи, используя такие выходы в качестве ложных. Сеть может проверить и убедиться в том, что один из выходов действительно тратится, тем не менее ложные выходы и истинный выход криптографически неотличимы друг от друга.

Кольцевые подписи защищают отправителя любой транзакции, так как получатель и сеть Monero не могут с уверенностью указать, который из членов группы является истинным источником средств. Кольцевые подписи имеют огромное значение, поскольку внешний наблюдатель не может точно доказать, что выход был потрачен! Тот факт, что выход присутствует в кольцевой подписи, абсолютно ничего не доказывает, так как нельзя определить, действительно он тратится или нет, или же он просто используется в качестве ложного члена кольца.

Исходя из невозможности определения того, какой из выходов тратится реально, вы можете спросить, что мешает беспринципному пользователю попытаться использовать один и тот же выход дважды? В случае с прозрачными блокчейнами (например, Bitcoin), работающими по принципу «один выход — одна трата», это довольно тривиальная задача: любой криптографический подписанный и переданный однажды выход помечается как потраченный и уже не может использоваться снова. Однако выходы Monero появляются в кольцевых подписях Monero до и после того, как они были потрачены, поэтому повторную трату выхода необходимо предотвратить какими-то иными средствами.

Для этого используются образы ключей, которые генерируются и записываются при проведении каждой транзакции, и выводятся на основе того выхода, который действительно тратится. Сеть не может точно установить, который из членов кольца связан с образом ключа; тем не менее другим участникам необходимо просто проверить, использовался ли образ ключа до этого или нет. Если злоумышленник попытается потратить один и тот же выход дважды, то он в обоих случаях сгенерирует один и тот же образ ключа, и сеть немедленно отклонит вторую фальшивую транзакцию. Благодаря образам ключей сеть может предотвратить повторное использование выходов, даже не зная, какие из них потрачены!

Рисунок 3.4

Сеть Monero изначально не предполагала обязательного использования кольцевых подписей и, к сожалению, допускала проведение транзакций с нулевым смешиванием без ложных выходов, что негативно сказывалось на анонимности. Эти «ранние» транзакции имели ту же структуру и те же самые недостатки, что и прозрачные блокчейны, так как ясно указывали на отправителя и получателя, а также на момент траты выхода. Начиная с 2016 года, в сети появилось правило, чтобы в кольцевой подписи было как минимум два участника, что по умолчанию обеспечивало анонимность отправителя. В конце 2017 минимальный размер кольца вырос до пяти возможных участников, а в начале 2018 года минимальный размер кольца уже предполагал наличие семи потенциальных подписантов.

Следует отметить, что в период между 2016 и 2017 годом политика определения размера кольца формулировалась, исходя из минимального количества миксинов, и пользователям по желанию разрешалось создавать кольца большего размера. Теоретически можно подумать, что чем больше ложных выходов будет использовано при проведении транзакции, тем выше будет уровень анонимности. Однако возникает один довольно практический вопрос: если большинство транзакций будет использовать минимальный размер кольца, то кольца большего размера будут выделяться как необычные, что будет контрпродуктивно с точки зрения анонимности.

Эта проблема была решена в конце 2018 года при обновлении сети. Вместо указания минимального размера кольца сетевая политика стала диктовать обязательный фиксированный размер кольца. На момент написания этой книги все транзакции должны использовать кольцевые подписи, включающие в себя ровно девять членов. Это количество может увеличиться в будущем, поскольку статистические модели угроз и методы оптимального обеспечения анонимности продолжают развиваться.

3.2.4 Kovri и анализ трафика

Ещё одна отличительная особенность Monero, Kovri, призвана защитить отправителя транзакции путём сокрытия его IP-адреса и физического местоположения. Любому устройству, подсоединённому к сети интернет, назначается IP-адрес, который служит идентификатором и помогает маршрутизировать трафик, указывая на правильного пользователя. Тем не менее этот IP-адрес можно легко связать с физическим местоположением пользователя и его личностью.

Возможность привязки деятельности, предполагающей использование Monero, и транзакций к определённым IP-адресам имеет несколько значительных негативных последствий. Некоторые криптографические меры, описанные в предыдущем разделе и направленные на защиту пользователей Monero, могут быть частично скомпрометированы, если IP-адреса из журнала соединения с узлом будут проанализированы с целью идентификации пользователей Monero.

Следует рассмотреть негативные последствия, которые могут возникнуть, если деятельность в сети Monero будет сопоставлена с физическим местоположением и личностью пользователя. Так как при трансляции транзакций в сеть Monero раскрывается IP-адрес, любой узел, принявший транзакцию, сможет определить физическое местоположение отправителя. Несмотря на то, что другие механизмы обеспечения анонимности Monero затрудняют привязку транзакций исключительно на основе данных, взятых из блокчейна, узел, который наблюдает множество транзакций, исходящих от одного IP-адреса, может прийти к заключению, что они связаны.

Помимо проблем с анонимностью, демонстрация IP-адресов потенциально может привести к цензурированию. Недобросовестный узел может отказаться передавать транзакции от определенных лиц или групп. И что ещё хуже, географическая информация, раскрываемая с IP-адресом, может привести к тому, что злоумышленники нанесут отнюдь не дружественный визит владельцу криптовалюты. Связь между IP-адресами и деятельностью в сети Monero представляет опасность не только для пользователей, транслирующих транзакции. Сетевой трафик, проходящий через узлы, сейчас может просматриваться поставщиками интернет-услуг, а также другими наблюдателями, что создаёт риск для владельцев узлов, если их правительство или интернет-провайдер негативно относятся к криптовалютам.

Криптовалютные майнеры также могут стать жертвой нечестной игры, если их IP-адреса будут связаны с их сетевой активностью. Недоброжелатели могут атаковать такие майнеры, повергая цензу их блоки, допустим, исходя из идеологических разногласий, или же, чтобы просто ограничить неправительственный или некорпоративный майнинг.

Очевидно, что все стороны в экосистеме Monero только выиграют, если их деятельность в сети будет оторвана от их IP-адресов (а следовательно, и от их физического местоположения / личности). Этот тип анонимности обеспечивается Kovri, технологией маршрутизации, разработанной специально для того, чтобы скрывать источники передачи данных. Она основана на открытых спецификациях децентрализованного «Невидимого Интернета» (I2P), использующего шифрование и сложные технологии маршрутизации для создания приватной сети, распределённой по интернету.

Сообщество Monero занимается разработкой этого лёгкого и ориентированного на обеспечение безопасности программного обеспечения с открытым кодом и общими API таким образом, чтобы его можно было использовать и в других сферах. Так как Kovri является «одноранговой» технологией, все криптовалюты и сервисы, использующие сеть Kovri, только выиграют от её распространения! Скоро Kovri будет включена в одну из версий Monero, а в конечном счёте использование этой технологи станет обязательным для всех транзакций в рамках политики Monero, предполагающей обеспечение анонимности по умолчанию.

Если у вас возникли какие-либо вопросы, или же вам хотелось бы улучшить или принять участие в реализации Kovri, вы можете связаться с ведущим разработчиком (anonimal) через IRC каналы Kovri: #kovri, #kovri-dev или же через его аккаунт в Twitter.

3.3 Заключительные комментарии

Monero использует несколько уникальных технологий обеспечения анонимности, чтобы защитить различные элементы сети и все стороны, участвующие во всех транзакциях. RingCT скрывает сумму, отправляемую при проведении каждой транзакции. Кольцевые подписи защищают отправителя, скрывая источник средств, в то время как скрытые адреса гарантируют, что адрес получателя не будет записан в блокчейн. Kovri является новой технологией маршрутизации, которая позволяет разорвать связь между вашей деятельностью в сети Monero и вашим физическим местоположением / личностью. Вместе все эти функциональные возможности гарантируют анонимность пользователей Monero, а также, что их средства не будут отслежены. Путём криптографического устранения всех связей, используемых при анализе транзакций в блокчейне, Monero достигает взаимозаменяемости, являющейся непременной характеристикой практических криптовалют. Теперь, когда вы прочитали эту главу, вы понимаете, как Monero защищает людей, описанных в примерах, которые приводились нами в Главе 1.