Перевод Механизм работы анонимных монет. Часть I

Тема в разделе "Статьи", создана пользователем Mr. Pickles, 11 дек 2018.

  1. Mr. Pickles

    Команда форума Модератор Редактор

    Регистрация:
    11 сен 2017
    Сообщения:
    328
    Симпатии:
    122
    1.jpeg
    Квентин Массис (Quentin Massys), Сборщики налогов, Калифорния 1500

    Это первая часть серии статей, которые позволят поглубже взглянуть на устройство протоколов обеспечения анонимности CoinJoin (Bitcoin), Monero, ZCash и MimbleWimble. Цель состоит в том, чтобы более подробно объяснить принципы обеспечения конфиденциальности данных денежных транзакций, сохранённых в публичном регистре, а также, как такие данные могут быть верифицированы заинтересованной стороной. Как можно заметить, это два противоречащих друг другу требования. В этой части исследуется CoinJoin — протокол обеспечения анонимности, который используется только простыми, самыми тривиальными транзакциями Bitcoin.

    Краткое изложение
    • Транзакции Bitcoin дают право на трату UTXO.
    • Деанонимизация нескольких адресов Bitcoin может привести к серьёзному снижению уровня анонимности , так как это позволит отследить большинство транзакций.
    • Может быть деанонимизировано по крайней мере 15% блокчейна Bitcoin.
    • При проведении транзакций Bitcoin в рамках одной такой транзакции могут быть потрачены UTXO, принадлежащие различным адресам.
    • CoinJoin группирует выходящие UTXO различных сторон в одну транзакцию, что не позволяет распознать получателей.
    • Основным недостатком CoinJoin является тот факт, что другой стороне приходится принимать участие в смешанной транзакции (даже несмотря на то, что стороны могут оставаться совершенно анонимными).
    Назад к истокам: UTXO

    Для начала давайте более подробно рассмотрим внутренние принципы работы основанных на использовании UTXO транзакций Bitcoin (а если быть более точными, то их версию, предшествующую SegWit). В любом случае основанный на использовании UTXO учёт будет взят нами в качестве базовой модели в том виде, в котором он используется всеми монетами, которые будут нами рассмотрены в свою очередь.

    Вместо того чтобы поддерживать список счетов и соответствующих балансов (как в случае с Ethereum), регистр Bitcoin содержит информацию, по какому адресу находится каждый UTXO (расшифровывается как unspent transaction output — непотраченный выход транзакции). Когда Элис пересылает 1 BTC Бобу, она создаёт транзакцию с несколькими UTXO, которые у неё имеются, например, utxo_1, utxo_2, в качестве входов и двумя новыми UTXO, utxo_Bob и utxo_Alice, в качестве выходов. Значение utxo_Bob составляет 1 BTC, а utxo_Alice является «сдачей».

    Когда майнинговый узел получает транзакцию Элис, он производит исчерпывающую проверку достоверности того, что:
    1. utxo_1 и utxo_2 никогда не использовались при проведении других транзакций в качестве входов (то есть они действительно являются непотраченными выходами транзакции), и

    2. Общее значение входов транзакций равно общему значению выходов транзакции.
    Сложнее гарантировать, чтобы только Боб имел право на трату utxo_Bob в будущем. Это достигается при помощи умного механизма скриптов разблокировки, которые закрепляются за каждым UTXO после его создания. Скрипт представляет собой маленькую программу, написанную на специальном языке, не являющимся языком Тьюринга, с небольшим количеством инструкций. Чтобы включить UTXO в качестве одного из входов в новую транзакцию, необходимо включить и некоторые данные, чтобы скрипт разблокировки UTXO выдавал значение True (Примечание: так делалось до появления SegWit. Современные транзакции Bitcoin используют несколько иную схему. Несмотря на это, старые транзакции, которые проводились без использования SegWit, по-прежнему являются действительными).

    Например, скрипт разблокировки (закреплённый Элис) для utxo_Bob может выглядеть следующим образом:
    HTML:
    <Bob's public key> OP_CHECKSIG
    Следует отметить, что он содержит только публичную информацию, поэтому Элис может назначить этот скрипт utxo_Bob, так как ей известен адрес кошелька Боба (который, грубо говоря, является хешем модуля его публичного ключа). В свою очередь, Боб может убедиться в том, что она действительно собирается получить право на трату utxo_Bob после того, как транзакция будет включена в блок, и блок будет принят. Пропустим технические подробности, которые можно найти, например, здесь и здесь, и перейдём к моменту, когда скрипт, указанный выше, просто указывает на то, что для траты utxo_Bob в качестве входа необходимы некоторые дополнительные данные sig, чтобы
    HTML:
    return secp256k1.verify(sig, <Bob’s public key>, sha256(sha256(tx)))
    был оценен как верный, то есть True. В данном случае данные sig может произвести только тот, кому известен приватный ключ Боба. Этот факт гарантирован только виртуально, так как sha256(sha256(tx)) является довольно произвольным, а ECDSA достаточно безопасным. Например, хакер может попытаться найти sig, комбинируя транзакции, ранее подписанные Бобом. Такая наивная попытка будет обречена на провал, так как все хеши формы sha256(sha256(tx)) отличаются друг от друга. С другой стороны, для Боба выработка sig при помощи его приватного ключа и любой последовательности байтов, в частности sha256(sha256(tx)), является рутинной задачей. Поэтому, не вступая в какую-либо прямую связь с Элис (даже не заходя в онлайн), Боб может безопасно принять Bitcoin на свой публично заявленный адрес и быть уверенным в том, что никто, кроме него самого, не сможет потратить эти средства.

    Bitcoin безопасен, но не анонимен

    Давайте сначала опишем потенциальные угрозы анонимности, которые свойственны блокчейну (в порядке понижения уровня их серьёзности):
    1. Возможность сопоставления адреса A с реальным физическим/юридическим лицом, контролирующим приватный ключ.

    2. Наличие свидетельства того, что обладатель A передал некоторую сумму на адрес B (возможно, посредством некоторых промежуточных транзакций).

    3. Наличие свидетельства того, что обладатель адреса A имеет некоторую сумму X в криптовалюте (Возможно, на нескольких счетах).
    Сатоши Накамото (Satoshi Nakamoto) утверждает, что так как любой может анонимно создать адрес Bitcoin анонимно, то 1) не является серьёзной угрозой для конфиденциальности. Это могло бы быть также в те времена, когда Bitcoin добывался по большей части путём майнинга. Сегодня благодаря повсеместному использованию требований KYC/AML, правил, которым следует большинство криптовалютных бирж, многие адреса Bitcoin можно связать с реальными лицами. И, что ещё хуже, просто проанализировав публично доступные профили Bitcointalk и Twitter, можно извлечь довольно большой объём информации об адресе пользователя, применяющего технологии майнинга. В сочетании с 2) можно отследить поразительно большое количество транзакций. Это плохие новости для тех, кто считал, что DarkNet означает неспособность правоохранительных органов отследить участников транзакций (прости, Dread Pirate Roberts). Bitfury заявляют, что им удалось деанонимизировать не менее 16% всех адресов Bitcoin.

    Следует отметить, что несмотря на то, что 1) требует, по крайней мере, извлечения данных, информация относительно 2), 3), 4) абсолютно открыта (в случае с обычными транзакциями Bitcoin) и находится в открытом доступе (и часто позиционируется как не требующий разрешения DLT).

    CoinJoin

    По крайней мере, в случае с транзакциями Bitcoin 1) сильно зависит от 2). Действительно, при простом перемещении средств со счёта A на счёт B (или на множество счетов, что рекомендуется), обеспечивается достаточный уровень безопасности, если будет сложно доказать, что такой перевод средств вообще имел место. Но если все транзакции Bitcoin хранятся в открытую в силу технического решения, как вообще можно скрыть передачу денежных средств?

    Ещё в 2013 году Грегом Максвеллом (Greg Maxwell) была предложена основополагающая идея (CoinJoin). Вообще, существует всего несколько коммерческих решений в области анонимности Bitcoin. Их исчерпывающий и актуальный обзор можно найти здесь. Большинство таких решений в некоторой форме реализуют идею CoinJoin. В основном причина заключается в том, что необходимость в каких-либо изменениях на уровне протокола Bitcoin отсутствует.

    Сама идея заключается в следующем. Мы помним, что транзакция Bitcoin представляет собой список UTXO: входов (которые тратятся) и выходов. Отправитель добавляет скрипт разблокировки к каждому UXTO и блок каждому UXTO в выходе. Транзакция считается действительной в том случае, если:

    [ПРАВИЛО 1]: все выходы были успешно разблокированы;

    [ПРАВИЛО 2]: общая сумма входов равна общей сумме выходов.

    Следует отметить, что эти два правила не подразумевают, что все входы должны исходить от одного и того же адреса, а также, что выходы должны быть каким-либо образом связаны. Поэтому вполне приемлемо в рамках одной транзакции тратить различные UTXO, полученные с разных ничем не связанных адресов. Теперь предположим, что Элис хочет отправить 1 BTC Бобу, и в то же самое время Кэрол хочет отправить 1 BTC Дейву. Как Элис, так и Кэрол хотели бы скрыть следы. Для этого, вместо того чтобы создавать отслеживаемые транзакции
    HTML:
    tx1: A->B; tx2: C->D
    они могут сформировать одну транзакцию:
    HTML:
    tx: {
      inputs: [
        {1BTC; <Alice' Sig>},
        {1BTC; <Carol's Sig>},
      ],
      outputs: [
        {1BTC; <Bob's PK>},
        {1BTC; <Dave's PK>}
      ]
    }
    Теперь мы не можем сказать, с кем совершает сделку Элис: с Бобом или с Дейвом. То же самое касается и Кэрол. Показанный выше псевдокод далёк от того, который был бы приемлем для транзакции Bitcoin, но он является хорошим примером принципа работы CoinJoin.

    2.png
    Оригинальное объяснение от Грега Максвелла можно найти здесь.

    Недостатки CoinJoin

    Основным недостатком CoinJoin является необходимость в наличии стороны, которая пожелает принять участие в «смешанной» транзакции. При отсутствии достаточного количества адресов-участников кластерный анализ может раскрыть (или по крайней мере значительно сузить) круг получателей.

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

    Обе проблемы решаются Monero, ZCash и MimbleWimble, правда, разными способами. Оставим подробности для следующих частей этой серии статей, но сделаем небольшой анонс:
    • Monero и ZCash (использующие различные методы) пользуются тем не интуитивным фактом, что, грубо говоря, вполне возможно проверять соответствие [ПРАВИЛУ 1] и [ПРАВИЛУ 2], не зная ни публичного ключа, ни передаваемой суммы. Monero в значительной степени использует стероидный вариант CoinJoin (со скрытыми значениями UTXO и ложными участниками транзакции). ZCash применяет технологию zk-proofs, позволяющую генерировать более широкий анонимный набор.
    • MimbleWimble — совсем иной зверь, даже несмотря на то, что лежащие в основе этой технологии криптографические примитивы похожи на примитивы Monero. MimbleWimble не подразумевает наличия даже приватных ключей и адресов в обычном понимании этих терминов. Вместо этого выдаётся право на трату конкретного UTXO, что делается довольно запутанным, но удивительно эффективным (с точки зрения хранения и обработки) способом
    Источник: Mechanics of privacy coins: Part I

    Перевод:
    Mr. Pickles (@v1docq47)
    Редактирование:
    Agent LvM (@LvMi4)
    Коррекция:
    Kukima (@Kukima)
     
    #1 Mr. Pickles, 11 дек 2018
    Последнее редактирование: 11 дек 2018
    TheFuzzStone нравится это.
  • О нас

    Наш сайт является одним из уникальных мест, где русскоязычное сообщество Monero может свободно общаться на темы, связанные с этой криптовалютой. Мы стараемся публиковать полезные мануалы и статьи (как собственные, так и переводы с английского) о криптовалюте Monero. Если вы хорошо владеете английским (или можете писать собственные статьи/мануалы) и хотите помочь в переводах и общем развитии Monero для русскоязычной аудитории - свяжитесь с одним из администраторов.