Открыть приложение
Все статьи

Как live.tips обращается с деньгами (никак)

Нет никакого баланса live.tips, никакого графика выплат и никакой комиссии. Вот архитектура, которая делает эти три утверждения скучными, а не смелыми.

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

Для live.tips ответ такой: его пришлось бы переписать заново. Это не обещание о наших намерениях, это описание того, куда уходят деньги.

Деньги никогда не проходят через нас

Когда фанат касается суммы на карте, платёж создаётся в твоём аккаунте Stripe, оседает на твоём балансе Stripe и выплачивается по твоему графику Stripe. Единственная комиссия — это стандартная комиссия Stripe за обработку, которую Stripe списывает с тебя напрямую, ровно так же, как если бы ты интегрировал Stripe сам.

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

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

Твои ключи и где они живут

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

Без аккаунта этот ключ никогда не покидает твоё устройство. Он лежит в собственном хранилище ключей устройства и отправляется только на api.stripe.com по TLS. Никакого сервера live.tips здесь нет вовсе.

Когда ты входишь в аккаунт, ключ переезжает к нам — потому что ключ, который существует только на одном телефоне, не может обслуживать ещё и планшет на сцене. Мы шифруем его (отдельным для каждого секрета ключом AES-256, который сам обёрнут Google Cloud KMS) и храним там, где его не может прочитать никто: ни другой аккаунт, ни мы, заглянув в базу, ни даже ты сам. Он расшифровывается только внутри наших функций, используется, чтобы общаться со Stripe от твоего имени, и больше никогда не выдаётся ни одному устройству. Скажем прямо: вход ставит сервер live.tips на пути между Stripe и твоей историей чаевых. Никогда денег — данных.

Серверы и что они не могут

Их два, и оба минимальны.

Ретранслятор существует потому, что Revolut и MobilePay нельзя вести из браузера так, как Stripe. Их включение запускает горстку функций Firebase, которые отдают твою страницу чаевых на tip.live.tips. Он хранит публичный профиль твоей страницы чаевых — отображаемое имя и платёжные реквизиты, которые ты решил опубликовать, — и, для страницы, за которой нет аккаунта, не ведёт истории чаевых: чаевые ждут ровно до того момента, пока их не покажет твоё сценическое устройство, а всё, за чем никто не вернулся, вычищается в течение часа. Он не видит денег и самоуничтожается после 90 дней бездействия. Если ты пользуешься только Stripe и никогда не входишь в аккаунт, к ретранслятору вообще никогда не обращаются.

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

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

Аккаунт, который необязательно заводить

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

Вход — через Apple, через Google или как гость — теперь возможен, и существует он ради одного: второго устройства. Если планшет на сцене и телефон в кармане должны показывать один и тот же вечер, между ними что-то должно стоять, и это что-то — Firestore, под идентификатором пользователя, который можешь читать только ты. Там живут твои группы, настройки, история чаевых — и, зашифрованный как описано выше, твой ключ Stripe. Это настоящее изменение в истории про приватность, и о нём стоит сказать прямо, а не ждать, пока ты наткнёшься на него сам: без аккаунта ни один сервер не видит чаевых; с аккаунтом их видит твой собственный угол нашего, и записывает их туда наш вебхук. Это цена второго устройства, и платить её или отказаться — решать тебе. Чего он не касается никогда, так это денег: аккаунт переносит твои данные, а не твой баланс, и доли мы по-прежнему не берём.

Почему не стоит верить нам на слово

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

Вот в чём настоящее обещание продукта. Не в том, что нам можно доверять, а в том, что тебе это и не нужно.

Все статьи