Управление парком крипто-банкоматов: наличные, кассеты, комплаенс
Крипто-банкомат — это кассовый аппарат, работающий в обе стороны: клиент вносит банкноты и получает крипто либо отправляет крипто и забирает банкноты. Управлять парком таких аппаратов — значит вести логистический бизнес с программным интерфейсом. Экран выставляет котировку и подтверждает, но сложное здесь физическое: наличные в кассетах, аппараты в местах, где вас нет, и обмен в каждом шкафу, который должен сходиться до цента. Кто считает крипто-банкомат приложением, увидел лишь лёгкую половину.
Поэтому это разбор операционной половины: две подсистемы внутри шкафа, обмен у стекла, кассеты, которых не бывает в демо, задача прогнозирования, в которую превращается парк, и дисциплина управления и сверки аппаратов, которых вы не видите.
Два аппарата в одном шкафу
Крипто-банкомат — это на самом деле две подсистемы, соединённые вместе: кассовый аппарат — приёмник банкнот, валидатор, диспенсер или ресайклер и кассеты, в которых лежат купюры, — и крипто-терминал — кошелёк, подключение к сети и экран, который выставляет котировку и подтверждает. Покупка идёт от наличных к крипто: клиент вставляет банкноты, валидатор считает и укладывает их, а аппарат отправляет крипто на кошелёк клиента. Продажа идёт от крипто к наличным: клиент отправляет крипто на адрес аппарата и, как только перевод подтверждён, диспенсер отсчитывает банкноты из кассеты. Всё сложное находится на стыке этих двух половин: банкноты физические и необратимы после укладки, а крипто цифровое и необратимо после подтверждения — и аппарат не должен фиксировать ни одну из сторон, пока не уверен в другой.
Обмен у стекла
В каждом автомате происходит обмен, и действует та же дисциплина фиксированного курса, что и на кассовом терминале: экран показывает курс, удерживает его на время сессии с обратным отсчётом, и клиент совершает операцию по этой котировке, иначе сессия запрашивает курс заново. Безопасность строится на порядке действий. При покупке автомат выдаёт криптовалюту только после того, как купюры проверены и уложены в стекер, а не просто вставлены: купюра в горловине эскроу ещё не деньги. При продаже он не выдаёт ни одной купюры, пока входящий перевод не набрал нужное число подтверждений, потому что выданную купюру не вернуть. Необратимое действие всегда идёт последним и только после того, как другая сторона стала окончательной. Нарушьте этот порядок, и получится автомат, который отдаёт криптовалюту за купюры, которых не получил, или наличные за перевод, который так и не пришёл.
Кассеты: физическая половина, которую не показывают на демо
Наличные хранятся в кассетах: съёмных боксах с купюрами, как правило по одному на номинал, которые вставляются в автомат. Ресайклер может выдавать те же купюры, которые принял; простой диспенсер берёт только из кассет, загруженных оператором. У каждой кассеты два числа: количество, которое считает ПО, и количество, которое есть на самом деле. Вся работа оператора, если свести её к одной фразе, состоит в том, чтобы эти числа совпадали. Каждая принятая купюра увеличивает расчётный остаток, каждая выданная уменьшает его, а выезд на инкассацию сверяет его с физическим пересчётом. Если при инкассации расчётный и посчитанный остатки расходятся, это расхождение и есть главное число в управлении парком: ошибка счёта, замятие или что-то похуже. Его находят пересчётом, а не надеждой.
Остатки наличных и почему парк автоматов — задача прогнозирования
Один автомат — рутина, парк — задача прогнозирования. Пустой диспенсер отправляет клиентов восвояси, а купюроприёмник с заполненным стекером перестаёт принимать наличные. И то и другое простой, и ни то ни другое не видно по индикатору ошибки, который заметил бы прохожий: автомат просто не может завершить операцию, которую хотел клиент. Поэтому консоль отслеживает остатки по каждой кассете каждого автомата и превращает их в маршруты: какие терминалы нужно пополнить, а какие разгрузить, пока ни то ни другое не упёрлось в предел. Хорошо управляемый парк — это прежде всего график инкассации: кто едет к какому терминалу, с какой суммой и в какой день. ПО нужно, чтобы строить этот график по живым остаткам, а не наугад и не в пятничной панике.
Удалённая блокировка и управление из консоли
Автоматы стоят там, где оператора нет: в холле, в торговом зале, на вокзале, поэтому управление должно быть удалённым. Из консоли оператор может мгновенно заблокировать один автомат или весь парк, и заблокированный автомат не завершает новых операций. Блокировка нужна при замятии, подозрении на неисправность, расхождении в наличных или когда автомат надо заморозить, пока к нему едет сотрудник. Ключи и кассеты остаются на месте; автомат просто перестаёт проводить операции, пока человек не снимет блокировку. Принцип в том, что опасные действия выполняются из консоли с указанием причины и попадают в журнал, а не делаются нажатием на экран самого автомата на месте, без записи, когда потом никто не сможет восстановить, что было сделано и зачем.
Парк криптоматов — это не программный продукт с приложенным к нему железом. Это логистика наличных с экраном на фасаде, и каждая цифра на этом экране должна сходиться с банкнотой, которую можно взять в руки.
Сверка автомата, которого вы не видите
Сверка — ежедневное доказательство честности парка. Каждая сессия на автомате оставляет запись: купюры внутрь и криптовалюта наружу или наоборот, с зафиксированным курсом, адресами кошельков и подтверждениями. Сложите сессии автомата с последней инкассации, и получите наличные, которые в нём должны лежать; пересчитайте кассеты при выезде, и получите наличные, которые в нём лежат; эти суммы должны совпасть. Криптовалютная сторона сверяется так же, по балансу кошелька автомата. Парк, который сверяется по каждому автомату каждый день, ловит неисправный терминал в первый же день: замятие, скимминг, ошибку счёта. А не обнаруживает его как квартальную дыру, которую никто не может объяснить. Смысл журнала по каждому автомату в том, что он выдерживает аудит именно потому, что ему никогда не позволяли расходиться с реальностью.
Комплаенс — задача оператора; ПО обеспечивает исполнение и фиксирует
Обязательства лежат на операторе парка криптоматов. Необходимые разрешения, проверки личности и лимиты по операциям зависят от того, где стоит каждый автомат, и относятся к оператору, а не к устройству и не к его производителю. ПО делает намеренно механическую работу: применяет любые лимиты на клиента и на день, которые настроил оператор, запрашивает любой шаг идентификации, который оператор требует, при любом заданном им пороге, и записывает каждую купюру, каждый перевод и каждое решение по лимитам, чтобы оператор мог позже отвечать за парк. Автомат не определяет политику; он одинаково применяет политику оператора на каждом терминале и записывает, что произошло. Правильно выстроить политику — дело оператора. Вклад ПО в том, что эта политика единообразна и поддаётся аудиту в парке, за которым не уследит один человек.
Честная граница
Одному автомату в одной точке консоль парка почти не нужна: хватит таблицы и еженедельного пересчёта. Эта система окупается в масштабе парка, когда цифры перестают помещаться в одной голове: остатки наличных по множеству терминалов, пересчёт кассет, который должен сходиться по каждой точке, удалённая блокировка для автоматов в нескольких часах пути и журнал по каждому автомату, выдерживающий аудит. Если у вас один терминал, это лишние издержки; если двадцать, то график, сверка и удалённое управление отличают бизнес от кучи терминалов, которые медленно выходят из баланса. Консоль парка находится по адресу /products/atm, а термины — кассета, ресайклер, сверка, расчёт — в /glossary.
Есть система, которую нужно построить?
Расскажите о задаче. Мы вернёмся с архитектурой и планом.