Carrot: новые адреса
Новая схема адресации и ключей, которая приходит вместе с FCMP++
Carrot (Cryptonote Address on Rerandomizable-RingCT-Output Transactions) — схема адресов и одноразовых выходов для эпохи FCMP++. Она сохраняет формат существующих адресов, но вводит более гибкую иерархию ключей (отдельно «видеть входящие», «видеть всё», «генерировать key image», «доказать право траты»), закрывает Janus-атаку и ускоряет сканирование.
Зачем менять то, что работает
Выход в FCMP++ имеет вид O = x·G + y·T, и старые формулы одноразовых адресов этого не учитывают. Раз уж всё равно нужно менять, Carrot исправляет давние неудобства CryptoNote:
- View-only кошелёк не видит трат. Нужно было импортировать key images.
- Janus-атака на подадреса: отправитель мог проверить, связаны ли два подадреса.
- «Burning bug»: можно было отправить два выхода с одним и тем же одноразовым ключом, и получатель мог потратить только один.
- Медленное сканирование — операции на Ed25519 и 1-байтный view tag.
Иерархия ключей
| Ключ | Даёт право |
|---|---|
k_vi — view-incoming | находить входящие платежи (как старый ключ просмотра) |
k_gi — generate-image | вычислять key image → видеть, какие выходы потрачены |
s_vb — view-balance | видеть все входящие и исходящие, точный баланс; распознавать собственную сдачу |
s_ga — generate-address | создавать подадреса (например, на сервере магазина) без права видеть платежи |
k_ps — prove-spend | единственный ключ, который реально нужен для траты; можно держать на аппаратном кошельке |
Совместимость со старыми кошельками
Существующий кошелёк отображается в Carrot так: k_vi = a, k_gi = b, k_ps = 0. Тогда K_s = b·G = B, и старые адреса остаются прежними — на них можно отправлять, их можно сканировать. Новые возможности (отдельный view-balance ключ и т. п.) получат кошельки, созданные по новой схеме.
Что ещё меняется в выходах
- Обмен ключами на X25519 (кривая Монтгомери вместо Эдвардса) — быстрее при сканировании.
- View tag — 3 байта вместо 1: ложных срабатываний в 65 536 раз меньше.
- Защита от Janus: в выход добавляется «якорь» (anchor), по которому получатель проверяет, что отправитель знал полный адрес, а не склеил его из частей разных подадресов.
- Защита от burning bug: одноразовый ключ привязан к первому key image транзакции, поэтому двух одинаковых выходов не бывает.
- Внутренние (self-send) выходы: сдача строится через
s_vb, и кошелёк с view-balance ключом надёжно её распознаёт.
Спецификация Carrot опубликована в репозитории jeffro256/carrot, спецификация FCMP++ — в работах kayabaNerve и репозитории monero-oxide / fcmp-plus-plus. Этот сайт пересказывает их; при расхождении верьте спецификации.