Перерандомизация входа
Как потратить выход из дерева, не показав, какой именно
В FCMP++ вход транзакции — не ссылка на выход, а его «перекрашенная» копия: к каждой точке выхода прибавляется случайное кратное отдельного генератора. Получившиеся точки неотличимы от случайных, но тратящий знает «краску» и может доказать: (1) снятие краски даёт какой-то лист дерева и (2) он знает ключ этого листа.
Зачем вообще перерандомизировать
Membership proof доказывает утверждение «точка X — лист дерева». Если опубликовать сам выход O, доказывать уже нечего: все видят, какой выход тратится. Если не публиковать ничего, то нечего связать с key image и обязательством суммы. Нужна середина: публикуем что-то, что математически связано с выходом, но эту связь видит только тратящий.
Такой приём — «перерандомизация» (re-randomization). В RingCT роль похожего приёма играл псевдовыход C̃: то же обязательство суммы, но с новой маской. FCMP++ применяет ту же идею ко всем частям выхода.
Из чего состоит лист
O и C берутся прямо из выхода в блокчейне, I узел вычисляет сам при добавлении выхода в дерево. В дерево кладутся только координаты (числа), а не сами точки — так их удобнее «хешировать» на следующем уровне (см. Curve Trees).
Формулы перерандомизации
Тратящий выбирает четыре случайных скаляра r_o, r_i, r_r_i, r_c и публикует:
| Публикуется | Формула | Что прячет |
|---|---|---|
| Õ | O + r_o·T | какой ключ выхода тратится |
| Ĩ | I + r_i·U | генератор key image этого выхода |
| R | r_i·V + r_r_i·T | обязательство к r_i — нужно, чтобы связать Ĩ с key image |
| C̃ | C + r_c·G | какое обязательство суммы тратится (как псевдовыход в RingCT) |
T, U, V — фиксированные генераторы, полученные хешированием в точку; их логарифмы относительно G и друг друга никто не знает. Это критично: если бы кто-то знал T = t·G, он мог бы «перекрашивать» одну компоненту в другую.
Что доказывается про эти точки
Транзакция содержит два доказательства, и они делят работу:
- Membership proof (внутри арифметической схемы над Helios/Selene) доказывает: существует лист
(O, I, C)в дереве с корнемρ, и существуютr_o, r_i, r_r_i, r_c, такие что опубликованныеÕ, Ĩ, R, C̃получены по формулам выше. - SA+L (вне схемы, на Ed25519) доказывает: тратящий знает
x, yтакие, чтоÕ = x·G + (y + r_o)·T, и key imageL = x·I— используя только опубликованныеÕ, Ĩ, R.
Обратите внимание: membership proof не знает ничего о ключах траты, а SA+L ничего не знает о дереве. Это разделение позволяет, например, отдать построение membership proof другому устройству, не давая ему права тратить.
Почему это безопасно
- Скрытие:
r_o·T— случайная точка подгруппы, поэтомуÕраспределена равномерно, как бы ни выгляделO. СравниватьÕс выходами бесполезно — это показывает инструмент. - Нельзя подделать лист: чтобы «снять краску» с выдуманной точки и попасть в настоящий лист, нужно решить дискретный логарифм между генераторами.
- Нельзя подменить сумму: баланс проверяется по
C̃, а membership proof гарантирует, чтоC̃отличается от настоящегоCлиста только на кратноеG— то есть сумма та же. - Нельзя потратить дважды:
L = x·Iзависит только от выхода, а не отr; при второй трате получится тот жеL.