Манэки-нэко DUCAT с монетой Monero в лапе
прямая торговля рядом · спецификация, черновик 1.1.0-dev13

DUCAT

Veilid для передачи. Monero для расчёта. Никакого оператора посередине.

Нигде нет сервера DUCAT — контакты, сообщения, счета и чеки это записи в DHT и запечатанные сквозным шифрованием пакеты, а каждый телефон держит полноценный узел Veilid, возвращая маршрутизацию и хранилище, которые сам занимает.

0 векторов соответствия 0 режимов работы 0 языков 0 серверов

Подписано в отладочном режиме, только stagenet. Пока не для настоящих денег.

Стоит на

Торговля, где посередине никого нет

Дукат шесть веков был золотой монетой, которую принимали от Венеции до Вены и до Леванта — никаких отношений с эмитентом, никакого счёта за спиной, никакого разрешения. DUCAT — это то же самое, для той минуты, когда вы стоите перед человеком и договариваетесь.

🐱

Нигде никакого сервера

Контакты, счета, платежи и чеки идут как запечатанные сквозным шифрованием пакеты по DHT Veilid. Нечего вызвать в суд, ограничить, снести с платформы или выключить, потому что ничего не работает. Каждый телефон — полноценный узел и возвращает маршрутизацию и хранилище, которые занимает.

🔑

Личность — это пара ключей

Создаётся на телефоне. Ни почты, ни номера, никого, у кого регистрироваться — и именно поэтому никто не сможет её вам восстановить, и приложение говорит это вслух, а не прячет.

🎫

Карточки на одно предъявление

Вы даёте человеку карточку — QR, ссылку ducat: или касание NFC — и она годится для одного человека. После получения она перестаёт работать, так что скриншот, попавший не туда, — не вход.

🔒

Запечатанные разговоры

Шифрование в форме X3DH, с одноразовыми предключами и прямой секретностью. Когда приложению приходится откатываться на подписанный предключ, оно показывает вам открытый замок, а не скрывает это.

💬

Разговоры, которые несут деньги

Ветки на почтовом ящике, работающие, пока одна из сторон офлайн — они несут детализированные счета, строки которых обязаны сходиться с итогом, иначе сообщение отклоняется, платежи и чеки, выписанные получателем и указывающие на транзакцию, которую они подтверждают. Небольшие группы расходятся по тем же парным веткам: ни группового ключа, ни общей записи, все свойства ветки нетронуты.

Шесть шагов, без аккаунта,
примерно минута

Каждый снимок на этой странице — приложение на телефоне, а не макет. Ничто здесь не просит вас зарегистрироваться, потому что регистрироваться не у кого.

Шаг 1 из 6: создайте личность — пара ключей, сделанная на этом телефоне, без аккаунта
1 · Личность — пара ключей, а не регистрация
Шаг 4 из 6: выберите PIN, с прямо сказанным предупреждением, что сбросить его нельзя
4 · PIN — и никакого способа его сбросить, сказано прямо
Шаг 5 из 6: как незнакомцы доверяют друг другу — обе стороны вносят залог, доведение до конца его возвращает
5 · Доверие — объяснено до вашей первой сделки
Шаг 6 из 6: резервная копия, которая честно ещё не копия, пока не покинула телефон
6 · Резервная копия — «ещё не копия», пока она не покинула телефон

Ваша личность — это пара ключей, созданная на устройстве: ни почты, ни номера, никого, у кого регистрироваться, и именно поэтому никто не сможет её вам восстановить. Последний шаг — резервная копия, потому что кошелёк, который нельзя восстановить, — единственный способ здесь действительно потерять деньги.

Деньги, которые ваши

Кошелёк Monero в собственном владении, с пересчётом в местную валюту повсюду, сканируемый и расходуемый встроенным движком monero-oxide — никакого демона кошелька на телефоне.

Личный экран: баланс в XMR и местной валюте, состояние синхронизации, счётчик доступных купюр, плитки режимов и последние движения
Баланс и купюры, которые за ним стоят
Оплата или запрос: сумма в местной валюте или XMR, арифметика комиссий, сколько останется после
Вся арифметика до того, как вы согласитесь
Выписка: текущий баланс, поиск по чекам, выгрузка в CSV
Выписка, восстановленная из цепочки
Выбор, кому платить: контакты с отпечатками их ключей
Кому вы платите, по отпечатку ключа

При оплате видно сумму, оценку сетевой комиссии, итог, сколько останется после, сколько купюр будет потрачено и примерно сколько это займёт — и можно выбрать скорость. История восстанавливается из цепочки: отправления опознаются по key image, сдача никогда не показывается как поступление, каждая строка несёт текущий баланс, а вся выписка выгружается в CSV.

Monero тратит отдельные купюры, а не баланс, поэтому кошелёк с одной крупной купюрой может не суметь заплатить дважды подряд. Приложение считает купюры, которые может потратить, и говорит разменять одну до того, как вы окажетесь у кассы, а не падает уже там.

Разговоры, которые несут деньги

Контакт — это пара ключей, а не идентификатор. Одно сканирование открывает разговор на почтовом ящике, работающий, пока одна из сторон офлайн — и эти ветки несут торговлю, а не только текст.

Ваша карточка: QR на одно предъявление, открывающий разговор, годный для одного человека
Ваша карточка — годится для одного человека
Разговор, несущий деньги: детализированный счёт со строкой налога, чек, плашка о закрытом эскроу
Счёт, платёж, чек — прямо в ветке
Группа из троих на общей доске: одна запись на поколение, вопрос и ответ с другого телефона
Группы — одна общая запись на поколение
Поиск по сказанному, где совпадения по именам стоят выше совпадений в сообщениях
Ищите то, что люди на самом деле сказали

Вы даёте человеку карточку — QR, ссылкой ducat: или касанием NFC — и она годится для одного человека: после получения перестаёт работать, так что скриншот, попавший не туда, — не вход.

Группа — это список, который только растёт, а её слова едут в одной общей записи доски на поколение (§16.24): каждый участник пишет свои страницы под групповым ключом, который несёт сам список, так что сообщение пятерым — это одна запись вместо пяти, и сеть не отличит эту запись ни от какой другой. Выдать себя за другого нельзя, а уход — дело локальное. Группа умеет делить счёт: один итог превращается в отдельный запрос каждому плюс фразу, по которой все могут проверить арифметику, и каждый запрос переходит в «оплачено», как только приходит его подтверждение.

Ваш телефон — это всё дело целиком

Выберите один из девяти режимов, и приложение целиком передаёт управление — свои вкладки, ничего от кошелька. Почти ничему из этого не понадобился новый объект протокола, и это фраза, которой спецификация гордится больше всего.

Режимы работы: личный, касса, открытый счёт, такси, пожертвования, рынок, аренда, наём помощи, киоск
Девять режимов, один протокол
Касса: пробитые позиции с посчитанной строкой налога
Касса — с посчитанным налогом
Один код для сканирования покупателем; детализированный счёт приходит на его телефон
Один код — счёт приходит при сканировании
Открытые счета: открытые, выставленные и ждущие, закрываемые одним счётом
Открытые счета — закрываются из автобуса домой
Режим киоска, сторона покупателя: нажмите, что хотите, налог показан до подтверждения
Киоск — покупатель заказывает сам
Панель персонала киоска за PIN-кодом: заказы, меню и ставка налога
Панель персонала за PIN-кодом
Постоянный код для пожертвований, с ценой связываемости прямо на экране
Пожертвования — с названной ценой

Касса пробивает позиции или принимает набранную сумму, считает налог с продаж своего региона и показывает один код; счёт приходит на телефон покупателя в момент сканирования, а чек уходит обратно, когда он платит. Открытый счёт отмечает покупателю каждый напиток и закрывается одним счётом. Киоск отдаёт телефон покупателю целиком, с панелью персонала за PIN-кодом. Ящик для пожертвований предлагает оба пути: код DUCAT, который открывает разговор и присылает чек, как только деньги дошли, и постоянный адрес, на который может дать любой кошелёк Monero, — с ценой связываемости прямо на экране, а не в правилах.

Поездка, которую никто не распределяет

Наберите, куда едете. Телефон превращает координаты GPS в геоячейку — публичную доску, адресом которой служит само место — и вывешивает вызов: карточку на одно предъявление, приблизительный район и цену, посчитанную по настоящему маршруту. Никакого имени на доску не попадает — ни на карточку, ни в запись за ней. Водители следят за своей ячейкой и соседними и забирают его; гонку судит DHT, и никакого диспетчера не существует.

Зелёная линия — вот суть: тарифы DUCAT примерно на 15 % ниже того, что агрегатор берёт с пассажира, и водитель забирает всё — отсутствующая доля платформы, отданная им обоим. Согласие приходит с лицом: имя, машина, цвет, номер, время подачи — запечатанное для пассажира и никогда не показанное доске. Ваше собственное имя и подъезд, у которого вы стоите, в тот же миг уходят навстречу — тому единственному водителю, который вызов забрал.

Одна уступка, названная прямо на экране: поиск адресов, построение маршрута и плитки карты обращаются к OpenStreetMap — единственное место, где DUCAT отправляет местоположение за пределы устройства. Сами доски никогда не несут точность лучше ~1,2 км.

Вызов поездки: маршрут, расстояние, время и тариф против того, что взял бы агрегатор
Вызов, в сравнении с агрегатором
Счётчик: тариф набран один раз, код посадки, условия приходят в чат при старте
Счётчик, с условиями прямо в ветке

Продайте, сдайте в аренду или предложите час своего времени

Та же механика досок несёт не только поездки. Объявление на рынке, аренда или час умелой помощи вывешиваются на доску, адресованную районом, и незнакомый человек поблизости читает её, и никто из вас двоих не касается никакой платформы.

Объявления живут на более крупных досках, чем вызовы — около пяти километров в поперечнике, потому что за связкой ключей люди готовы проехать. Поиск читает вашу доску и кольцо вокруг, рисуя результаты по мере ответов, так что что-то припаркованное рядом с вами появляется на экране меньше чем за шесть секунд, тогда как «здесь ничего не выставлено» занимает около сорока и по пути отмечает проверенные районы.

Просмотр рынка: объявление, найденное на доске, с ценой, залогами и кнопкой спросить
Рынок
Просмотр помощи: умение, предлагаемое рядом, с ценой за час
Нанять помощь
Выставление автомобиля в аренду: публичная половина, уходящая на доску
Публичная половина — то, что доска может прочитать
Только для того, кто забронирует: адрес и детали передачи никогда не попадают на доску
Приватная половина — никогда на доске
Поиск снаряжения рядом: живое объявление с ценой за день и залогом
Найти — цена, залог и способ спросить

Форма объявления разрезана надвое, и приложение говорит, какая половина какая: всё из первой части уходит на публичную доску, которую может прочитать любой поблизости, а адрес, место, где лежат ключи, и номер машины идут во вторую, которая не покидает ваш телефон, пока бронь не станет настоящей.

Дом, лента
и собственная полка

Записи, которые несут счёт, столь же хорошо несут страницу. Ваш ключ уже сам по себе адрес, так что написанному есть где жить, ни у кого не прося места.

Лента: записи людей, которых вы держите, и ваш собственный дом
Лента — записи людей, которых вы держите
Библиотека: выпуски, разложенные по издателям, сохраняемые наружу, а не открываемые
Библиотека — выпуски, разложенные по издателям
Весь мир: издания на тематических досках, где «Всё» читает каждую полку разом
Весь мир — тематические доски, все полки разом
Открытое объявление: снимки из его набора, описание продавца, набранная цена рядом с сегодняшним курсом
Открытое объявление — его снимки и набранная цена

Дом персоны стоит по адресу, который называет её собственный ключ, а лента — это хронология людей, которых вы держите: запись может нести картинку и файл, а сердца возвращаются. Сайты раздаёт с собственного диска тот, кто их опубликовал, и открываются они в запечатанной комнате, так что чтение одного ничего не тянет откуда-то ещё.

Издания — газета, серия, программа — продаются по всему миру на тематических досках, а не по району: запись ложится и на доску темы, и на доску своего языка, а «Всё» читает все шесть полок разом. Объявление забирает свой набор с телефона продавца — до 24 фотографий в полный размер, описание, характеристики и вложенные файлы — и целиком отклоняется на любом ключе, которого не называет, чтобы плохой документ не мог спрятать хорошие снимки.

Вы оба вносите залог.
Доведёте до конца — он вернётся.

Посередине нет компании, которая могла бы встать на чью-то сторону, поэтому DUCAT делает проще. Деньги лежат по адресу, который можете открыть только вы вдвоём, а разблокировка возвращает каждой стороне её собственный залог, поимённо. Забрать залог не может никто — включая нас, потому что нет никаких нас, кому платить.

~10 % поездка короткая, мало риска ущерба
~20 % ночлег ключи от чьего-то дома
~30 % автомобиль ущерб может превысить цену

Эти числа обоснованы, а не угаданы — модель Bisq «2 из 2» без хранителя это ближайший работающий прецедент, а литература о двойном депозите доказывает, что в равновесии схема защищена от обмана. Отсюда две границы: залог, который стоит меньше комиссии за его возврат, становится нулём, а не украшением, и ни один не превышает половины цены. Более уязвимая сторона вносит второй, чтобы её деньги никогда не лежали в общем адресе одни.

⅔

Эскроу, за которым не стоит никакая компания

Когда сделка требует большего, чем залог: пассажир, водитель и взаимно доверенный контакт-арбитр проводят по запечатанной ветке распределённую генерацию ключей — три устройства выводят один адрес Monero, каждое держит только долю, любые двое могут подписать, и нигде нет раздающего. Счастливый путь — два касания.

Всё остальное — соглашение: одна сторона предлагает раздел, другая подписывает или встречно предлагает своё. Тот, кто застрял, обращается к арбитру, чья подпись и есть решение — захваченный арбитр в худшем случае может выбрать между названными сторонами, но никогда заплатить себе. Доказано в цепочке, на stagenet, во всех формах, включая освобождение FROST с двумя входами.

∅

Чего стоило имя

Прежде чем появится сделка, есть незнакомец, и вопрос в том, чего стоило ему его имя. Персона может сжечь Monero — отправить их на адрес, ключей от которого нет ни у кого, выведенный из хеша, который любой может пересчитать сам, — и нести при этом собственное доказательство платежа Monero. Ваш клиент проверяет это доказательство на собственном узле, спрашивает второй узел, попала ли транзакция в блок, и с этого момента показывает персону словами везде, где вы что-то решаете: сожжено 0,01 XMR, с блока N. Никогда оценкой. Правило, которое важно, — это предупреждение: когда то, чем вы собираетесь рискнуть, стоит больше, чем они сожгли, приложение так и говорит, потому что имени, которое ничего не стоило, нечего терять, исчезая.

После закрытой сделки любая из сторон может подписать чек с оценкой, а всякий, кого вы встречали лично, может подписать поручительство. И то и другое едет запечатанной веткой, и то и другое взвешивает только читающий — один голос на подписанта, считая лишь тех подписантов, чьё собственное сжигание вы проверили, и считая поручительство только от людей, которые уже есть в ваших контактах. Один шаг, никакого графа, нигде ничего не опубликовано. Репутация, которая стоит денег, а не приватности.

И ведёт себя как приложение

Инструментом приватности, которым неприятно пользоваться, пользуются один раз. Этот называет, во что вам обходятся вещи, говорит на двадцати языках и имеет тёмную тему, сделанную не задним числом.

Профиль: цена связываемости, если разрешить контактам платить напрямую, названная там, где вы выбираете
Цена названа в момент выбора
Тот же главный экран в тёмной теме Mocha
Mocha — тёмная тема, сделанная как следует
Тот же главный экран по-арабски: полное зеркало справа налево, с восточноарабскими цифрами
Арабский — полное зеркало справа налево
Деловая половина настроек: тарифный регион, ставка налога, приватность, резервная копия
Деловая половина настроек

У удобства в системе приватности есть цена, и приложение называет её в момент выбора, а не в правилах, которых никто не читает. Разрешить контактам платить вам напрямую значит переиспользовать один адрес — поэтому оно говорит, что любой наблюдающий за цепочкой увидит, что каждый раз платили одному и тому же человеку, включая тех, кто заплатил вам всего однажды, и указывает на альтернативу. Та же привычка проходит насквозь: замеченное в mempool показывается как увидено, но не рассчитано; профиль всегда подаётся как утверждение, каковым он и является.

Оно говорит на двадцати языках — каждый экран читает из ресурсов, множественные формы составляются, а не склеиваются, а арабский и фарси доказывают зеркало. Чеки — это записи, а не сообщения: каждый чек живёт в собственном хранилище, переживает удаление ветки и контакта и едет в зашифрованной резервной копии — которая несёт людей так же, как и деньги.

То же приложение на столе

Нативное окно поверх того же Rust, что работает на телефоне, — так что касса лавочника, киоск, пресс-комната, рынок и лента оказываются одной реализацией, а не портом.

Страница чата на столе: группы на досках над парными ветками, с панелью разговора
Чат — группы на досках, над парными ветками
Касса на столе: пробитая продажа и открытые счета
Касса — пробитая продажа и открытые счета
Страница рынка на столе: объявления рядом с ячейкой с их миниатюрами
Рынок — объявления рядом с ячейкой, с миниатюрами
Страница состояния на столе: узел, его таблица маршрутов, Переподключить, журнал
Состояние — узел, его таблица маршрутов, Переподключить

Оно говорит на двадцати языках телефона из тех же ресурсов и проверено против телефона в каждом обряде: чат, группы на досках, счета и чеки, заказ в киоске, оплаченный с телефона, который со столом прежде не встречался, файлы и сайты, розданные и полученные, и звонки с настоящим звуком.

Что доказано, а что нет

README ведёт учёт того, что действительно прошло от начала до конца в настоящей сети и на настоящем stagenet — и называет пробелы, а не закапывает их.

Показано от начала до конца
  • Две полные распределённые поездки телефон↔компьютер — от вызова через геоячейку до расчёта в цепочке, чаевые и чек — а поездка с залогом теперь доведена до конца и на двух телефонах
  • Полная дуга эскроу — два телефона и арбитр за столом независимо вывели один адрес «2 из 3»; внести → освободить → водитель получил деньги
  • Бронирование — хозяин и гость вносят каждый свой залог, банк подтверждён собственным сканированием гостя, раздел предложен, подписан, обе стороны целы; оно продолжилось, а не началось заново, когда посреди прогона узел Monero не ответил вовремя
  • Открытый счёт с телефона на компьютер, от счёта до чека; десять атак отклонено
  • Телефон, стёртый дочиста, прошёл настройку: первая карточка, первый платёж, продажа в киоске, оплаченная от начала до конца, — а затем снова стёрт и восстановлен из собственной копии
  • Все рельсы эскроу через интерфейс за один день — продажа на рынке, уличный вызов с живой позицией, переходящей между телефонами, аренда снаряжения и заказ помощи, первый прогон которого вскрыл и починил настоящую гонку
  • Слой доверия, пройденный, а не доказанный на словах — сжигание доказано и проверено на собственном узле незнакомца за 12 с, чек с оценкой верно взвешен в ноль, четыре компьютера пришли к выводу «2 ваших контактов их знают», и безымянная карточка вызова, которой имя дали данные, которыми поделились следом
Сказано, а не закопано
  • Никакой проверки никем вне проекта — §2.5 и есть довод о том, почему это важно; внутренний проход по пяти поверхностям атаки нашёл сорок с лишним вещей и починил большую часть, что куда меньше
  • Нет разработчика, который никогда не читал core/
  • NFC проверен на компиляции, ни разу не испытан в поле между двумя телефонами — и само касание ни разу не измерено на телефоне
  • Задержки измерены на компьютере с подключённым узлом, а не на телефоне от батареи
  • Две рации, две батареи, двое независимых часов — полевой день всё ещё за нами
  • У компьютера нет второго фактора — ни блокировки устройства, ни собственного секрета, поэтому проверка, которую телефон ставит перед тратой, там работать не может
!

Пре-альфа. Stagenet. Не для настоящих денег.

Каждая сборка подписана в отладочном режиме и рассчитывается на stagenet Monero — монеты без ценности, так задумано. Спецификация это черновик 1.1.0-dev13, и она говорит о себе: ничто здесь не окончательно, а §14 — настоящая повестка. Попробуйте её, сломайте, прочитайте — только не финансируйте.

Спецификация и есть продукт.
Всё остальное держит её честной.

ducat-protocol.md — основной артефакт: пять частей, журнал изменений впереди и набор тестов соответствия, который прогоняет вторая реализация, чтобы документ не мог молча разойтись с кодом.

★ ducat-protocol.md   спецификация — черновик 1.1.0-dev13, изменения впереди
  core/               эталонная реализация (Rust)
  vectors/            406 случаев соответствия + схема
  conformance/        четыре проверяющих, на каждый push
  harness/            от начала до конца по настоящим маршрутам Veilid
  sim/                офлайн-симулятор, рыночные сценарии
  applications/       android/ + desktop/ (те же исходники)
  mobile/             мост на Rust: кошелёк · почтовый ящик · узел
  research/           доказательства, а не продукт

Четыре проверяющих, на каждый push

  • Каждый вектор проверен по schema.json
  • Вторая реализация прогоняет все 406 и обязана совпасть
  • Документ сверен с кодом — так нашёлся нормативный раздел, на который ссылались трижды и который никогда не был написан, диапазон значений, не объявленный реестром, и шесть видов векторов, которые документ ни разу не назвал
  • Ничто импортированное не остаётся необъявленным

Ответственность нормативна, а не желательна: §18.7 делает этику Veilid требованием соответствия — никаких комиссий протокола, никакой оплаты узлам, никогда. Стройте из этого кода что угодно, но клиент, зарабатывающий на переносе, — не DUCAT.

Поставьте на телефон
или на стол

Ничего не нужно ставить заранее — каждая сборка несёт собственную библиотеку Rust и JVM. Android на телефоне и то же приложение нативным окном в Linux, Windows и macOS. Сборки для iOS нет; она получит папку, когда её заслужит.

🤖 Android

Браузер телефона, самая свежая сборка, никакой страницы релизов. armeabi-v7a только для телефонов старше примерно 2016 года; x86_64 — для эмуляторов.

🐧 Linux

.deb и .rpm ставятся пакетами; AppImage просто запускается.

🪟 Windows

Без подписи — Windows предупредит при первом открытии.

🍎 macOS

Сборки для Apple Silicon и Intel. Без подписи — macOS предупредит при первом открытии.

Подписано в отладочном режиме, только stagenet — не для настоящих денег.