Dandelion++ — это способ ретрансляции новых транзакций по одноранговой сети, при котором наблюдатели за сетью не могут легко вычислить, какой компьютер их отправил. В этом руководстве объясняется, какую проблему он решает, как работают его фазы stem («стебель») и fluff («распространение»), что статья 2018 года добавила к исходной схеме и как Blocknet использует его в каждом платеже.
Что такое Dandelion++?
Dandelion++ — это протокол ретрансляции транзакций, который скрывает, какая нода создала транзакцию. Новая транзакция сначала идёт по «стеблю» (stem), передаваясь от одной ноды к одной следующей на протяжении нескольких переходов. Затем она «распускается» (fluff) и расходится по всей сети, как будто начала путь с ноды, далёкой от настоящего отправителя.
Название отражает форму пути: тонкий стебель, а затем облако семян, разлетающихся во все стороны, как у одуванчика. Dandelion++ опубликовали в 2018 году Джулия Фанти, Шайлеш Боджа Венкатакришнан, Сурья Бакши, Брэдли Денби, Шрути Бхаргава, Эндрю Миллер и Прамод Вишванат в Proceedings of the ACM on Measurement and Analysis of Computing Systems (препринт на arXiv), а представлен он был на ACM SIGMETRICS 2018. Он улучшает предложение той же группы 2017 года — Dandelion.
Почему рассылка транзакции выдаёт, откуда она пришла?
Сообщение с транзакцией не содержит вашего IP-адреса. Его выдаёт то, как она распространяется. В типичной сети криптовалюты нода, создавшая транзакцию, отправляет её всем своим пирам, те — своим, и она расходится от источника кольцами, как круги по воде.
Исследователи показали, что эти круги можно измерить. В 2014 году Бирюков, Ховратович и Пустогаров, а независимо от них Коши, Коши и Макдэниел запускали «суперноду», которая подключалась почти ко всем доступным нодам Bitcoin и записывала, когда каждая транзакция приходила от каждого пира. Нода, первой доставившая транзакцию, часто и оказывалась её создателем. В статье о Dandelion++ это называется оценкой «первого шпиона»: предположить, что первая честная нода, доставившая транзакцию, и есть её источник. Это просто и хорошо работает против лавинной рассылки.
Случайные задержки перед тем, как каждая нода передаст транзакцию дальше, — так делает Bitcoin Core по схеме под названием diffusion — делают тайминги более шумными. Исследователи Dandelion пошли другим путём и изменили саму форму пути.
Как работают фазы stem и fluff?
В фазе stem каждая нода передаёт транзакцию ровно одному пиру. На каждом переходе нода подбрасывает взвешенную монету: обычно она продолжает stem, иногда переключается на fluff. В фазе fluff транзакция рассылается всем пирам как обычно, поэтому наблюдатели видят, что она распространяется от ноды, перешедшей в fluff.
Шаг за шагом:
- Ваша нода начинает stem. Она отправляет новую транзакцию только одному пиру.
- Каждый ретранслятор решает. Пир либо пересылает её ещё одному пиру (stem), либо рассылает всем (fluff).
- Fluff разносит её повсюду. От ноды, перешедшей в fluff, транзакция обычным образом заполняет сеть и доходит до майнеров.
Шпион, наблюдающий за многими нодами, теперь видит, что круги начинаются с ноды, перешедшей в fluff, а она может находиться за много переходов от вас. Длина stem случайна, поэтому шпион не может просто отсчитать назад фиксированное число переходов. В статье ожидаемая длина stem указана как 1/q, где q — вероятность того, что очередной ретранслятор переведёт транзакцию в fluff. При q = 0,1 stem в среднем длится около десяти переходов.
Что Dandelion++ изменил по сравнению с Dandelion?
Схема Dandelion 2017 года направляла stem по одной цепочке ретрансляторов и для неё были доказаны сильные гарантии при трёх предположениях: каждая нода следует правилам, каждая нода отправляет одну транзакцию и каждая нода использует Dandelion. Статья 2018 года показала, как шпионы, нарушающие эти предположения, могут узнать больше, и изменила схему так, чтобы гарантии сохранялись и против них. Работа идёт эпохами — каждая нода переходит в новую эпоху «примерно раз в 10 минут», — и внутри каждой эпохи используются четыре механизма:
| Механизм | Что он делает |
|---|---|
| Примерно 4-регулярный граф ретрансляции | Каждая нода выбирает до двух своих исходящих соединений в качестве ретрансляторов, образуя сеть переплетённых путей вместо одной цепочки. |
| Одно ребро для своих транзакций | Нода отправляет каждую созданную ею транзакцию по одному и тому же исходящему ребру, поэтому отправка нескольких транзакций не раскрывает больше информации. |
| Псевдослучайная ретрансляция | В каждой эпохе нода является либо ретранслятором, либо распространителем для всех транзакций, полученных в фазе stem, и сопоставляет каждому входящему ребру исходящее. |
| Страховочные таймеры | Нода, отправившая или ретранслировавшая транзакцию в фазе stem, ждёт случайное время, пока та перейдёт в fluff, и рассылает её сама, если этого не произошло. |
Для выбора q моделирование в статье показало, что значение q не выше 0,2 ограничивает выгоду, которую шпион может получить, манипулируя графом ретрансляции. Авторы запускали свою реализацию в действующей сети Bitcoin и выбрали q = 0,1 или q = 0,2, чтобы распространение укладывалось в их целевые 4,5 секунды.
Dandelion был предложен для Bitcoin как BIP 156. Monero добавил Dandelion++ в версии 0.16, выпущенной в мае 2020 года.
Как Blocknet использует Dandelion++?
Каждая нода Blocknet ретранслирует транзакции с помощью Dandelion++, и ничего включать не нужно. Когда вы отправляете BNT, ваша нода сначала проверяет транзакцию и добавляет её в свой мемпул, а затем передаёт маршрутизатору Dandelion++. Вот настройки в демоне:
| Настройка | Значение | Что это значит |
|---|---|---|
| Вероятность stem | 0,9 | Каждый ретранслятор продолжает stem в 90% случаев и переходит в fluff в 10% случаев (q = 0,1) — то же q, что проверялось в статье. |
| Эпоха | 10 минут | Маршруты stem перетасовываются каждые 10 минут. |
| Таймер эмбарго | 45 секунд | Если к этому моменту ваша транзакция не вернулась к вашей ноде в фазе fluff, нода сама рассылает её. |
Как проходит платёж Blocknet:
- Ваша нода выбирает одного пира для stem на всю эпоху. Она отправляет каждую созданную транзакцию этому же пиру до следующей 10-минутной эпохи, что соответствует правилу статьи для собственных транзакций ноды.
- Каждый ретранслятор делает новый выбор. Нода, получившая транзакцию в фазе stem, переводит её в fluff с вероятностью 10%. Иначе она пересылает её случайно выбранному пиру, кроме того, от которого она пришла. При q = 0,1 stem в среднем длится около десяти переходов.
- Сообщения stem выглядят одинаково от любой ноды. Нода использует одно и то же сообщение, чтобы начать stem и чтобы передать его дальше, поэтому получивший его пир не может понять, создали ли вы транзакцию или ретранслируете её.
- Транзакция всегда доходит. Если транзакцию не удаётся передать на следующем переходе stem, нода сразу переводит транзакцию в fluff, а 45-секундное эмбарго покрывает всё, что застряло.
- Ретрансляторы проверяют то, что передают. Нода убеждается, что содержимое stem — корректно сформированная транзакция, прежде чем ретранслировать её, и штрафует пира, который присылает мусор.
Как Dandelion++ сочетается с другими механизмами приватности Blocknet?
Dandelion++ работает на сетевом уровне: он защищает связь между транзакцией и компьютером, который её отправил. Приватность в блокчейне, которая делает Blocknet приватной монетой, защищает то, что говорит сама транзакция: кольцо CLSAG из 16 на каждом входе скрывает отправителя, одноразовые стелс-адреса скрывают получателя, а обязательства Педерсена с доказательствами диапазона Bulletproofs скрывают суммы. Эта защита обязательна, поэтому все транзакции выглядят одинаково ещё до того, как Dandelion++ начнёт их передавать.
Два уровня дополняют друг друга. Кольцевые подписи скрывают, какой выход заплатил, а Dandelion++ скрывает, какая нода разослала платёж. Статья Как Blocknet обеспечивает приватность платежей разбирает каждый уровень в блокчейне, а Что такое Blocknet? даёт общий обзор, включая оплату по имени с Blocknet ID.
Чтобы получить собственные BNT для отправки, их можно намайнить дома. Следуйте руководству по майнингу Blocknet, чтобы скачать seine, направить его на bntpool.com и получать выплаты на адрес своего кошелька или @name.
Часто задаваемые вопросы
Скрывает ли Dandelion++ мой IP-адрес?
Он скрывает от наблюдателей, рассредоточенных по сети, какая нода запустила транзакцию. Транзакция широко распространяется только после перехода в фазу fluff, через несколько переходов от вас. Ваш первый пир в фазе stem видит, что транзакция пришла от вашей ноды, но сообщения stem выглядят одинаково, создала ли нода транзакцию или просто передаёт её дальше, поэтому он не может этого различить.
Чем Dandelion отличается от Dandelion++?
Dandelion (2017) ввёл фазы stem и fluff по одной цепочке ретрансляторов. Dandelion++ (2018) сохраняет обе фазы и защищает их от шпионов, которые нарушают правила. Он использует граф, в котором каждая нода выбирает два ретранслятора, отправляет свои транзакции по одному фиксированному ребру, выбирает новые ретрансляторы каждую эпоху и добавляет страховочный таймер.
Какие криптовалюты используют Dandelion++?
Monero добавил Dandelion++ в версии 0.16, выпущенной в мае 2020 года, а Blocknet ретранслирует с его помощью каждую транзакцию. Dandelion впервые был предложен для Bitcoin как BIP 156 той же исследовательской группой. Его может внедрить любая монета с одноранговой сетью, потому что он меняет только то, как ноды передают друг другу новые транзакции.
Какие настройки Dandelion++ использует Blocknet?
Ноды Blocknet продолжают stem с вероятностью 0,9 на каждом переходе, поэтому на каждом ретрансляторе транзакция переходит в fluff с вероятностью 10%. Маршруты stem меняются каждые 10 минут. Если ваша собственная транзакция не вернулась к вашей ноде в фазе fluff в течение 45 секунд, нода сама рассылает её, так что она всегда попадает в сеть.