Выбор приманок
Откуда берутся 15 чужих выходов в кольце — и почему это сложнее, чем кажется
Кошелёк выбирает 15 приманок (decoys) из всех выходов блокчейна так, чтобы их возраст был распределён как возраст настоящих трат: много свежих, мало старых. Для этого используется гамма-распределение по логарифму возраста. Если распределение приманок отличается от поведения людей, настоящий вход выделяется статистически.
Почему не просто «случайные выходы»
Представьте, что приманки выбираются равномерно из всего блокчейна. Тогда типичная приманка — выход возрастом в несколько лет. А люди обычно тратят деньги, полученные недавно: дни, недели. В кольце из 16 элементов один свежий выход и 15 старых — догадайтесь, какой настоящий.
Именно это происходило в ранних версиях Monero: исследование 2017 года (Miller, Möser и др., «An Empirical Analysis of Traceability in the Monero Blockchain») показало, что эвристика «самый новый вход — настоящий» угадывала в большинстве случаев для колец того времени.
Гамма-распределение
С 2018 года кошелёк выбирает возраст приманки так:
Затем возраст переводится в номер блока (с учётом 2-минутного интервала), из этого блока выбирается случайный выход. Плюс несколько правил:
- выходы моложе 10 блоков не используются (их и тратить нельзя — это правило блокировки);
- выбор учитывает, сколько выходов в каждом блоке (иначе выходы из «пустых» блоков выбирались бы слишком часто);
- повторы и уже выбранные выходы отбрасываются.
Что может пойти не так
Ошибки реализации
В 2021 году нашли ошибку в выборе приманок в wallet2: для некоторых выходов вероятность выбора свежих приманок была занижена, из-за чего транзакции, тратящие очень свежие выходы, выделялись. Ошибку исправили, но транзакции, созданные до исправления, навсегда остались в блокчейне с этой особенностью. Сторонние кошельки с собственной реализацией выбора приманок тоже не раз оказывались «узнаваемыми».
Поведение не совпадает с моделью
Модель подобрана по Bitcoin 2017 года. Реальные пользователи Monero ведут себя иначе, и чем сильнее различие, тем больше информации даёт возраст. Предлагались улучшения (например, подбор распределения по данным самого Monero), но с FCMP++ проблема исчезает в корне.
Флуд
Если кто-то создаёт огромное количество собственных выходов (такие эпизоды наблюдались в 2021 и 2024 годах), они начинают массово попадать в кольца других людей. Для атакующего свои выходы — заведомо не настоящие, и он мысленно вычёркивает их из колец, уменьшая эффективный размер кольца.
Выбор приманок — не криптография, а статистика. Криптография кольцевой подписи гарантирует, что подпись не выдаёт настоящий вход. Но всё, что можно узнать из выбора самих членов кольца, она не защищает. В FCMP++ «кольцо» — это все выходы, и выбирать ничего не нужно.