Cashu — открытый протокол e-cash: цифровых токенов, которые выпускает эмитент, или mint. Часто они представляют суммы в биткоинах; пополнить или вывести средства можно, например, через Lightning Network. Пользователь управляет токенами, а не биткоин-ключами эмитента, от сотрудничества которого продолжает зависеть.
Представим, что Анна отправляет Петру токен Cashu личным сообщением. Она не публикует транзакцию Bitcoin в блокчейне, а передаёт данные, которые Пётр может погасить у соответствующего эмитента. Токен может содержать одно или несколько доказательств (Proof). Это записи данных, каждая из которых содержит, в частности, сумму, секретное значение и подпись эмитента. Cashu — общий протокол, а не единый сервис с общим резервом. Важны эмитент, денежная единица и набор ключей подписи. Сумма в sats выражена в мелких единицах биткоина; то же число в другой единице означает другое. Токены одного эмитента не принимаются автоматически другим. Для интересующихся форматом: V4 использует компактное двоичное кодирование CBOR и содержит доказательства только одного эмитента. [1] [2] [9]
Анна может сохранить копию обычного токена без дополнительных условий расходования. Поэтому Петру нужен swap: кошелёк передаёт старые доказательства эмитенту и получает новые, с секретами, которых Анна не знает. Эмитент делает старые входы недействительными. Именно успешный обмен не позволяет Анне потратить ту же копию снова. Проверки состояния недостаточно. UNSPENT означает отсутствие записи об обработке или расходовании; это не резервирование для Петра. PENDING — обработка идёт, SPENT — доказательство уже погашено. Не публикуйте токен как квитанцию: обладатель пригодной копии может успеть использовать её первым. [3] [5]
Blind Signature, слепая подпись, помогает отделить выпуск токена от последующего использования. Кошелёк создаёт секрет, скрывает его математическое представление и просит эмитента подписать его. Затем снимает ослепление. По самому предъявленному токену эмитент не должен определять прежний запрос на выпуск. Но скрыто не всё: разные номиналы используют разные ключи, поэтому эмитент знает выпускаемые категории стоимости. Метод называется BDHKE и работает на кривой secp256k1. Для понимания платежа не нужно вычислять точки кривой; важно знать, какую связь защищает эта математика. [1]
Необязательное расширение NUT-12 добавляет DLEQ — математическое доказательство, что подпись создана тем же приватным ключом, которому соответствует публичный ключ эмитента. С нужными сопроводительными данными Пётр может проверить подпись без обращения к эмитенту. Это не показывает, потрачена ли уже другая копия, отвечает ли сервис и достаточно ли у него биткоин-резервов. Если DLEQ приложено, спецификация требует его проверки кошельком. Проверка подписи всё равно не заменяет завершённого swap. Counterparty risk, риск неисполнения оператором обязательств, сохраняется. [7]
Пётр может захотеть оплатить запрос через Lightning Network вместо получения новых токенов. Такая операция называется melt. Сначала кошелёк запрашивает предложение: нужную сумму и единицу, срок действия и возможный резерв на комиссии. Могут добавиться комиссии за входы. Затем кошелёк передаёт доказательства, а эмитент выполняет внешний платёж. HTTP 200 означает успешную обработку веб-запроса, но не обязательно оплату. PENDING всё ещё означает «обрабатывается», а PAID сообщает об успехе. Кошелёк должен проследить окончательный результат и соответствующее подтверждение выбранного способа оплаты. [4]
Эмитент может сменить набор ключей подписи. active=false означает, что старый набор больше не выпускает новые токены; само по себе это не мешает принимать старые доказательства как входы. Необязательное final_expiry означает другое: окончательный срок, после которого спецификация уже не требует от эмитента погашать токены из этого набора. Не путайте эти случаи. input_fee_ppk также задаёт ставку за каждый вход, а не просто процент от суммы перевода. Ставки всех использованных доказательств складывают, сумму делят на 1000 и только затем округляют комиссию вверх до целых единиц. Например, для набора ключей с единицей sat 3 входа со ставкой 100 ppk дают сумму 300; после деления и округления комиссия составляет 1 sat. Одинаковые суммы платежей могут стоить по-разному из-за числа доказательств или разных наборов ключей. [2]
Слепая подпись не стирает время платежа, суммы и данные сетевого соединения. Даже способ запроса новых номиналов способен что-то подсказать эмитенту. NUT-03 рекомендует располагать запрошенные значения по возрастанию, чтобы порядок лишний раз не раскрывал разделение на платёж и сдачу. Повторные запросы отправителя о состоянии переданных токенов тоже могут облегчить его связывание с получателем. Cashu предоставляет средства для более приватного обращения денег; это не означает, что любое приложение в любой ситуации автоматически скрывает все связи. [3] [5]
Восстановление должно соответствовать кошельку и эмитенту. NUT-13 описывает повторное получение секретов токенов и факторов ослепления из seed, исходного секрета, набора ключей и счётчика. Версия набора 01 использует HMAC-SHA256, более старая 00 — BIP32. Подписи, которых seed создать не может, получают от эмитента через NUT-09; затем проверяют, что уже потрачено. Поэтому обещания «есть Seed Phrase — восстановлю всё где угодно» недостаточно. Прежде чем полагаться на кошелёк, проверьте резервное копирование, восстановление и небольшой вывод. Копия не заставит исчезнувшего эмитента ответить и не пополнит его резервы. [8] [6]
Для полной картины прочитайте эту статью вместе с Fedimint, Chaumian eCash, Blind Signature, Lightning Network, Counterparty risk, Satoshi. На эту статью также ссылаются Chaumian eCash, Blind Signature, Fedimint, Fiduciary Media.