Технический › FCMP++

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.

Иерархия ключей

s_master k_psдоказать право траты s_vbвидеть всё (баланс) k_giгенерировать key image k_viвидеть входящие s_gaгенерировать адреса K_s = k_gi·G + k_ps·T
Новые кошельки Carrot. Публичный ключ траты использует два генератора — отсюда FCMP++-вид O = x·G + y·T.
КлючДаёт право
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. Этот сайт пересказывает их; при расхождении верьте спецификации.