В первых двух главах мы написали всё, что необходимо знать о том, ПОЧЕМУ следует пользоваться Monero (Глава 1), а также о том, КАК пользоваться Monero (Глава 2). К настоящему моменту вы узнали всё, чтобы начать самостоятельно пользоваться Monero!
В оставшейся части этой книги содержатся дополнительные подробности, предназначенные для тех, кто хочет глубже погрузиться в принципы работы Monero, скрытые «за фасадом». В Главах 3 и 4 описаны технологии, лежащие в основе Monero, такие как механизм обеспечения приватности, блокчейн, а также процесс майнинга. Главы ориентированы на понимание концепций людьми, не желающими вникать в сложности продвинутой математики. Последующие главы содержат мельчайшие подробности, которые будут интересны разработчикам и гикам от мира криптографии.
Чтобы подготовить почву для понимания технологий приватности Monero, мы рассмотрим, как Monero отправляются в реестр и принимаются им. В этой главе мы остановимся на функциях блокчейна, его роли в качестве защищённой от внешнего воздействия, совместно используемой базы данных, в которой хранится список транзакций Monero. Подробная информация, касающаяся безопасности блокчейна (майнинга, хешей и т. д.), является отдельной темой, которой посвящена Глава 4.
Когда вы впервые создаёте кошелёк, он генерирует новую мнемоническую фразу, которую вы будете хранить в тайне и использовать для доступа к вашим Monero через блокчейн. Этот процесс инициализации выполняется на вашем устройстве и может происходить полностью в офлайн-режиме: во время создания кошелька ничего не передаётся, и ничего не записывается сетью.
«За кулисами» ваш кошелёк на основе мнемонической фразы вычисляет два набора ключей. Ваши приватные ключи должны храниться в секрете, так как вы используете их для того, чтобы подтвердить свою личность и получить доступ к вашим Monero. Ваши публичные ключи (о чём и говорит их название) известны другим пользователям Monero. Публичные и приватные ключи генерируются вместе, наборами, и обладают определёнными математическими свойствами, которые создают особую связь между ключами.
Чтобы получить Monero, вы предоставляете свой адрес (создаваемый на основе ваших публичных ключей) отправителю. Когда кто-то (клиент, биржа или ваш друг) отправляет вам Monero, он транслирует свою транзакцию, которая преобразует несколько его Monero в новую запись реестра, которая может быть прочитана вами (и только вами) при помощи ваших приватных ключей.
Если объяснить это на техническом жаргоне, выход транзакции сохраняется в блокчейне, чтобы вы впоследствии могли получить доступ к нему и, как вариант, потратить, используя свои приватные ключи. Эта терминология может ввести в некоторое замешательство, так как в случае с криптовалютами слово «выход» имеет несколько иной, отличающийся от обычного, смысл.
Всякий раз, когда вы получаете Monero, вы получаете очередной выход; всякий раз, когда вы тратите Monero, вы используете один из ваших выходов и генерируете новый для кого-то другого. Фактически все Monero, которыми вы «владеете», являются просто выходами в блокчейне, которые раскрываются вашими приватными ключами. До тех пор, пока кто-нибудь не отправит вам Monero, в блокчейне не будет никаких выходов, связанных с вашими приватными ключами или доступных для них.
Когда ваш кошелёк сканирует сеть или синхронизируется, это означает, что он использует ваши приватные ключи, чтобы проверить все транзакции и выходы в блокчейне, чтобы идентифицировать соответствующие записи. Баланс вашего кошелька является общей суммой этих выходов, которые можно открыть и потратить при помощи ваших приватных ключей.
Когда вы отправляете Monero из вашего кошелька, вы используете некоторые из ваших выходов в качестве входов транзакции, которую вы транслируете в сеть. Концептуально блокчейн является просто записью этих транзакций, при проведении которых в качестве входов тратятся выходы отправителей, и в результате которых генерируются новые выходы для получателей.
Процесс, описанный выше, немного упрощён, чтобы донести до читателя самые существенные его составляющие (приватные/публичные ключи, транзакции, входы/выходы). В последующих разделах приводится нетехническое объяснение сути концепций ключей, лежащих в основе ряда механизмов обеспечения приватности Monero.
Общие принципы и терминология, представленные выше, используются большинством криптовалют. Monero предлагает своим пользователям улучшенные функциональные возможности и более высокий уровень приватности, которые обеспечиваются уникальными криптографическими технологиями, скрывающими пользователей и их действия от публичного просмотра. На рисунке 3.1 показано, как эти взаимодополняющие механизмы работают вместе, защищая чувствительную информацию, содержащуюся в транзакциях:
Протокол RingCT является криптографической технологией, скрывающей сумму 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 с «замаскированными» суммами.
При проведении всех транзакций Monero используются скрытые адреса, позволяющие защитить приватность получателя. Чтобы адрес кошелька получателя не был сохранён в блокчейне, при каждой транзакции Monero используется уникальный одноразовый «расходный» адрес. Получатель может получить доступ к средствам, отправленным на скрытый адрес, не обнаруживая связи с публичными адресами кошелька или с другими транзакциями.
Чтобы концептуально описать использование произвольных одноразовых кодов, призванных защитить информацию о личности получателя, представьте, что вы хотите дать несколько книг о лечении специфической болезни вашему другу по имени Андре. К сожалению, вам необходимо покинуть город, и вы не встретитесь с Андре в течение всей следующей недели. Возможно, вы могли бы попросить вашего дружелюбного соседа взять книги на время и передать их получателю.
Вашему соседу будет необходимо убедиться в том, что тот, кто спросит книги, действительно является тем самым получателем, для которого они предназначены. Так как ваш друг является частным лицом со специфической болезнью, будет не совсем правильно говорить вашему соседу, чтобы он проверил его личность, используя имя Андре. И как совершить передачу, сохранив приватность Андре? Можно придумать одноразовый случайный код и сказать вашему соседу, чтобы он отдал книги тому, кто назовёт ему этот код (например тому, кто знает фразу PolarComboTango357). Ваш сосед сможет присмотреть за книгами и отдать их Андре, ничего не узнав о самом получателе, кроме заранее придуманного кода.
Подобно тому, как вы используете произвольный неинформативный код, чтобы ваш сосед не смог узнать ничего о получателе ваших книг, Monero использует систему одноразовых кодов, чтобы сеть не знала ничего о получателях Monero! Вместо чёткой записи адреса получателя в блокчейне (что равносильно «передайте эти книги Андре») средства всегда высылаются на одноразовый «скрытый адрес» (что уже равносильно «передайте эти книги тому, кто знает фразу PolarComboTango357). Криптографические технологии, обеспечивающие безопасность скрытых адресов исключительно в целях обеспечения приватности получателя, рассматриваются в Главе 5. Тем не менее основные моменты подробно описаны ниже.
Как генерируются эти одноразовые адреса? Ваши публичные адреса кошелька Monero представляют собой строки из 95 символов, включающие в себя два публичных ключа (публичный ключ просмотра и публичный ключ траты), которые математически вычисляются на основе вашей мнемонической фразы. Когда кто-либо отправляет средства, он использует публичные ключи вашего адреса с некоторыми произвольными данными, чтобы сгенерировать уникальный одноразовый публичный ключ. Эти одноразовые публичные ключи, которые записываются в транзакции и сохраняются в блокчейне, называются скрытыми адресами, поскольку сеть или внешний наблюдатель не могут связать эти произвольные коды с кошельком, ставшим инициатором транзакции.
Следует отметить, что подадреса не являются тем же самым, что и скрытые адреса. Подадреса — это многократно используемые публичные адреса кошельков, которые не сохраняются в блокчейне. Множество транзакций, отправленных на один подадрес, будут указывать на различные и несвязываемые скрытые адреса.
Повышение уровня приватности за счёт того, что адреса кошельков не сохраняются в блокчейне, является очевидным преимуществом реализации скрытых адресов. Ещё большее значение имеет тот факт, что использование этих уникальных одноразовых ключей не позволяет связать множество платежей, поступающих на один и тот же адрес!
Предположим, вы занимаетесь какой-либо творческой работой на общественных началах и публикуете адрес для пожертвований в криптовалюте. Если вы пользуетесь монетой с прозрачным блокчейном (например, Bitcoin), то каждая входящая на этот адрес транзакция будет записываться в связываемой форме, благодаря чему за вами можно будет следить. Любой сможет, воспользовавшись блокчейн-эксплорером, увидеть, сколько пожертвований в Bitcoin было вами получено, конкретные суммы этих пожертвований, а также перевели вы средства или нет. Каждая входящая транзакция Bitcoin индексируется в реестре в соответствии с адресом, который был вами опубликован.
Если вместо этого вы опубликуете адрес Monero, ваши пожертвования не станут объектом всеобщего внимания. Каждый спонсор будет генерировать уникальный одноразовый скрытый адрес, который будет вноситься в реестр. Публичный адрес для пожертвований, который был размещён вами рядом с проектом, никогда не будет напрямую указан в транзакции, а скрытые адреса не дают никакой информации о получателе. Так как каждый спонсор при создании скрытого адреса транзакции смешивает собственную произвольную информацию, то один спонсор не сможет распознать скрытый адрес другого. Все транзакции Monero должны использовать скрытые адреса, чтобы обеспечить приватность всей сети. При формировании транзакции ваш кошелёк автоматически создаёт скрытые адреса, используя ваш публичный адрес.
Кольцевые подписи являются характерной особенностью Monero, предназначенной для защиты отправителя транзакции путём обфускации источника отправляемых Monero. Перед тем как перейти непосредственно к кольцевым подписям, нам бы хотелось рассказать о концепции цифровых подписей в целом.
Цифровые подписи являются общим криптографическим способом подтверждения аутентичности источника данных или сообщения. Подписи могут быть проверены методом определения соответствия публичного ключа и личности подписанта, а также помогут убедиться в том, что подписанное сообщение является целостным и неизменным. Если подписанные данные будут изменены хотя бы на один символ (намеренно или случайно в результате ошибки в передаче), подпись будет считаться недействительной.
Различные варианты реализации цифровых подписей являются ключевым компонентом всех криптовалют. Чтобы потратить один из ваших выходов, вам необходимо составить для передачи в сеть сообщение, описывающее транзакцию, подписать его вашим соответствующим приватным ключом, а затем транслировать результат в сеть. Перед тем как выполнить транзакцию, сеть проверяет действительность подписи, чтобы убедиться, что сообщение не было изменено и/или подделано третьей стороной, не обладающей соответствующим приватным ключом.
В случае с прозрачными криптовалютами (например, Bitcoin) каждое сообщение, описывающее транзакцию, ясно демонстрирует, какие выходы были потрачены. Это довольно удобно с точки зрения бухгалтерии, так как сеть просто поддерживает запись непотраченных выходов транзакций (UTXOs), которые считаются действительными входами новых транзакций. Если кто-то попытается потратить один и тот же выход Bitcoin дважды, вторая мошенническая транзакция будет просто отклонена, так как сети известно, что владелец уже тратил этот выход (когда была подписана и транслирована в сеть первая транзакция). К сожалению, такое прямое доказательство владения крайне пагубно с точки зрения приватности, так как в этом случае вполне определённо указывается источник средств, а также момент, когда был потрачен определённый выход.
Monero использует другую схему, известную как кольцевые подписи. Этот метод группового подписания позволяет одному члену поставить цифровую подпись под сообщением от лица всей группы, смешавшись с публичными ключами остальных членов группы, в результате чего неясно, кто действительно подписал сообщение. Можно криптографически проверить, что среди участников кольца есть истинный подписант, но невозможно определить, кто конкретно создал подпись.
В случае с Monero кольцевые подписи используются для того, чтобы смешать ключи множества выходов в блокчейне. Это позволяет скрыть, какой из выходов был действительно потрачен. Предположим, Мария хочет потратить один из своих выходов Monero. Её кошелёк «полупроизвольно» выберет несколько из последних выходов, имеющихся в блокчейне (но не принадлежащих Марии), и смешает их с её публичными ключами в кольцевой подписи, используя такие выходы в качестве ложных приманок. Сеть может проверить и убедиться в том, что один из выходов действительно тратится, тем не менее ложные выходы и истинный выход криптографически неотличимы друг от друга.
Кольцевые подписи защищают отправителя любой транзакции, так как получатель и сеть Monero не могут с уверенностью указать, который из членов группы является истинным источником средств. Кольцевые подписи имеют огромное значение, поскольку внешний наблюдатель не может точно доказать, что выход был потрачен! Тот факт, что выход присутствует в кольцевой подписи, абсолютно ничего не доказывает, так как нельзя определить, действительно он тратится или нет, или же он просто используется в качестве ложного члена кольца.
Исходя из невозможности определения того, какой из выходов тратится реально, вы можете спросить, что мешает беспринципному пользователю попытаться использовать один и тот же выход дважды? В случае с прозрачными блокчейнами (например, Bitcoin), работающими по принципу «один выход — одна трата», это довольно тривиальная задача: любой криптографический подписанный и переданный однажды выход помечается как потраченный и уже не может использоваться снова. Однако выходы Monero появляются в кольцевых подписях Monero до и после того, как они были потрачены, поэтому повторную трату выхода необходимо предотвратить какими-то иными средствами.
Это достигается за счет использования образов ключей, которые генерируются и записываются при проведении каждой транзакции, и выводятся на основе того выхода, который действительно тратится. Сеть не может точно установить, который из членов кольца связан с образом ключа; тем не менее другим участникам необходимо просто проверить, использовался ли образ ключа до этого или нет. Если злоумышленник попытается потратить один и тот же выход дважды, то он в обоих случаях сгенерирует один и тот же образ ключа, и сеть немедленно отклонит вторую фальшивую транзакцию. Благодаря образам ключей сеть может предотвратить повторное использование выходов, даже не зная, какие из них потрачены!
Сеть Monero изначально не предполагала обязательного использования кольцевых подписей и, к сожалению, допускала проведение транзакций с нулевым смешиванием без ложных выходов, что негативно сказывалось на приватности. Эти «ранние» транзакции имели ту же структуру и те же самые недостатки, что и прозрачные блокчейны, так как ясно указывали на отправителя и получателя, а также на момент траты выхода. Начиная с 2016 года, в сети появилось правило, чтобы в кольцевой подписи было как минимум два участника, что по умолчанию обеспечивало приватность отправителя. В конце 2017 минимальный размер кольца вырос до пяти возможных участников, а в начале 2018 года минимальный размер кольца уже предполагал наличие семи потенциальных подписантов.
Следует отметить, что в период между 2016 и 2017 годом политика определения размера кольца формулировалась, исходя из минимального количества миксинов, и пользователям по желанию разрешалось создавать кольца большего размера. Теоретически можно подумать, что чем больше ложных выходов будет использовано при проведении транзакции, тем выше будет уровень приватности. Однако возникает один довольно практический вопрос: если большинство транзакций будет использовать минимальный размер кольца, то кольца большего размера будут выделяться как необычные, что будет контрпродуктивно с точки зрения приватности.
Эта проблема была решена в конце 2018 года при обновлении сети. Вместо указания минимального размера кольца сетевая политика стала диктовать обязательный фиксированный размер кольца. На момент написания этой книги все транзакции должны использовать кольцевые подписи, включающие в себя ровно одиннадцать членов. Это количество может увеличиться в будущем, поскольку статистические модели угроз и методы оптимального обеспечения приватности продолжают развиваться.
Любому устройству, подсоединённому к сети интернет, назначается IP-адрес, который служит идентификатором, позволяющим направить трафик нужному пользователю. Тем не менее, этот IP-адрес можно легко связать с физическим местонахождением и личностью пользователя.
Возможность установления связи действий и транзакций Monero с IP-адресами имеет несколько серьёзных последствий. Некоторые из криптографических способов, используемых для защиты пользователей Monero и описанных в предыдущем разделе, могут быть частично нейтрализованы, если IP-адреса, содержащиеся в журнале соединений с узлом, можно будет проанализировать с целью идентификации пользователей.
Также следует учитывать те негативные сценарии, которые могут возникнуть в результате установления связи действий в сети Monero с физическим местоположением и личностью пользователя.
Так как при передаче данных в сеть Monero раскрывается IP-адрес, узел, принимающий транзакцию, может определить физическое местоположение отправителя. Несмотря на то, что другие средства обеспечения приватности, которыми обладает Monero, затрудняют привязку транзакций при помощи данных, взятых только из блокчейна, узел (или узлы), отслеживающий и наблюдающий множество транзакций, исходящих от одного IP-адреса, может предположить, что они могут быть взаимосвязаны.
Помимо проблем, связанных с приватностью, открытые IP-адреса также дают возможность цензурирования. Недобросовестный узел может отклонить ретрансляцию транзакций отдельных пользователей или групп. Что ещё хуже, в результате раскрытия географической информации, обеспечиваемой IP-адресами, злоумышленники могут нанести отнюдь не дружественный визит владельцу криптовалюты.
Связь между действиями в сети Monero и IP-адресами представляет собой угрозу не только для пользователей, осуществляющих транзакции. В настоящее время сетевой трафик, проходящий через узлы, виден провайдерам интернет-услуг и другим сторонам, занимающимся наблюдением, что подвергает риску владельцев узлов, связанному с возможным негативным отношением их правительства или провайдера интернет-услуг к криптовалютам.
Майнеры также могут пострадать в результате нечестной конкуренции, если их IP-адреса будут связаны с их деятельностью в сети. Кто-то может злонамеренно начать цензурировать блоки определённых майнеров, возможно, в силу каких-либо идеологических разногласий или же просто, чтобы ограничить возможность неправительственного или некорпоративного майнинга.
Очевидно, что все стороны в рамках экосистемы Monero только выигрывают в том случае, если их сетевую активность нельзя будет связать с IP-адресами (а следовательно, с их физическим местоположением/личностью). На данный момент существует несколько способов реализации такого типа приватности, если вы оказались в ситуации, когда вам необходимо скрыть, что вы пользуетесь Monero при отслеживаемом соединении.
Одним из вариантов являются «виртуальные частные сети» (VPN), которые направляют ваш трафик через зашифрованные соединения, которые не могут просматриваться вашим правительством или провайдером интернет-услуг. Между вами и VPN-серверами устанавливается безопасный туннель, и ваш трафик смешивается с данными других пользователей, которые передаются с других IP-адресов. Следует отметить, что сервис, предоставляющий вам услуги VPN, может вести журнал, поэтому следует провести предварительную проверку на благонадёжность и выбрать заслуживающую доверия компанию.
Также вы можете воспользоваться «луковым маршрутизатором» Tor, направляющим ваш трафик по приватной сети релейных узлов. Изначально Tor был разработан Научно-исследовательской лабораторией ВМС США и использовался журналистами, спецслужбами и теми, кто хотел избежать слежки или цензурирования. Tor является свободной децентрализованной открытой приватной сетью, ни один из участников которой не может определить источник каких-либо определённых передаваемых данных. В сеть Tor можно выйти через специальный браузер, а пользователи с особыми требованиями к конфиденциальности могут использовать дистрибутив Linux, такой как Whonix, который направляет весь трафик через Tor.
Сообществом Monero также была поддержана разработка Kovri, анонимного маршрутизатора на базе спецификаций децентрализованного «проекта невидимого интернета» I2P. Kovri призван посредством шифрования и сложных технологий маршрутизации создать приватную сеть в интернете, также доступную для любого другого применения.
До того, как Kovri или любая подобная функция будет интегрирована в Monero, пользователям, которых волнует возможность анализа их интернет-трафика, рекомендуется использовать Tor или надёжного провайдера VPN, которые позволят скрывать их соединения и IP-адреса.
Monero использует несколько уникальных технологий обеспечения приватности, чтобы защитить различные элементы сети и все стороны, участвующие во всех транзакциях. RingCT скрывает сумму, отправляемую при проведении каждой транзакции. Кольцевые подписи защищают отправителя, скрывая источник средств, в то время как скрытые адреса гарантируют, что адрес получателя не будет записан в блокчейн. Kovri является новой технологией маршрутизации, которая позволяет разорвать связь между вашей деятельностью в сети Monero и вашим физическим местоположением/личностью.
Вместе все эти функциональные возможности гарантируют анонимность пользователей Monero, а также, что их средства не будут отслежены. Путём криптографического устранения всех связей, используемых при анализе транзакций в блокчейне, Monero достигает взаимозаменяемости, являющейся непременной характеристикой практичных валют. Теперь, когда вы прочитали эту главу, вы понимаете, как Monero защищает людей, описанных в примерах, которые приводились нами в Главе 1.