Нотатки з практики

Керування парком крипто-банкоматів: готівка, касети, комплаєнс

Крипто-банкомат — це касовий апарат, що працює в обидва боки: клієнт вносить банкноти й отримує крипту або надсилає крипту й забирає банкноти. Керування парком таких апаратів — це логістичний бізнес у програмному інтерфейсі. Екран котирує й підтверджує, але найскладніше — фізичне: готівка в касетах, апарати там, де вас немає, і обмін у кожному корпусі, який має зійтися до цента. Хто сприймає крипто-банкомат як застосунок, той бачив лише легшу половину.

Тож це розбір операційної половини: дві підсистеми всередині корпусу, обмін біля скла, касети, яких ніхто не показує в демо, задача прогнозування, якою стає парк, і дисципліна керування та звірки апаратів, яких ви не бачите.

Два апарати в одному корпусі

Крипто-банкомат — це насправді дві підсистеми, з'єднані разом: апарат для роботи з готівкою — приймач банкнот, валідатор, диспенсер або рециклер і касети, що тримають банкноти, — та крипто-термінал — гаманець, мережеве з'єднання та екран, що котирує й підтверджує. Купівля йде від готівки до крипти: клієнт вносить банкноти, валідатор рахує й вкладає їх, а апарат надсилає крипту на гаманець клієнта. Продаж іде від крипти до готівки: клієнт надсилає крипту на адресу апарата, і після підтвердження переказу диспенсер відраховує банкноти з касети. Усе складне міститься там, де ці дві половини зустрічаються, бо банкноти фізичні й незворотні після вкладання, а крипта цифрова й незворотна після підтвердження — і апарат не повинен фіксувати одну сторону, доки інша не стала певною.

Обмін біля скла

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

Касети: фізична половина, яку ніхто не демонструє

Готівка зберігається в касетах — знімних боксах з банкнотами, зазвичай по одному на номінал, які вставляються в автомат. Рециклер може видавати ті самі банкноти, які прийняв; простіший диспенсер бере лише з касет, які завантажив оператор. Кожна касета має два числа: кількість, яку вважає програма, і кількість, яка є насправді. Уся робота оператора, зведена до одного речення, — тримати ці два числа рівними. Кожна прийнята банкнота збільшує розрахункову кількість, кожна видана — зменшує, а виїзд на інкасацію скидає її за фізичним підрахунком. Якщо під час інкасації розрахункова й підрахована кількість розходяться, ця різниця — найважливіше число в управлінні парком: це помилка підрахунку, застрягання або щось гірше, і виявляють це лічбою, а не сподіваннями.

Залишки готівки, і чому парк автоматів — це задача прогнозування

Один автомат — рутина; парк — задача прогнозування. Диспенсер, який спорожнів, відмовляє клієнтам, а приймач банкнот із повним стекером перестає приймати готівку — обидва випадки є простоєм, і жоден не показує індикатора помилки, який помітив би перехожий, бо автомат просто не може завершити потрібну клієнту операцію. Тому консоль відстежує залишок готівки по кожній касеті кожного автомата й перетворює ці дані на маршрути: яким автоматам потрібне завантаження, а яким — вивантаження, доки жоден не впирається в межу. Добре керований парк — це переважно графік інкасації: хто їде до якого автомата, з якою сумою і в який день; а програма потрібна, щоб будувати цей графік за живими залишками, а не навмання й не в паніці п'ятниці по обіді.

Віддалене блокування і керування з консолі

Автомати стоять там, де оператора немає, — у вестибюлі, торговому залі, на вокзалі, — тому керування має бути віддаленим. З консолі оператор може миттєво заблокувати окремий автомат або весь парк, і заблокований автомат нічого нового не проводить. Блокування — це реакція на застрягання, підозру на несправність, розбіжність у готівці або потребу заморозити автомат, поки до нього їде людина. Ключі й касети лишаються на місці; автомат просто припиняє операції, доки людина його не розблокує. Принцип такий: небезпечні дії виконуються з консолі із зазначеною причиною і потрапляють у журнал — а не торканням екрана самого автомата на місці без запису, коли ніхто потім не відновить, що зроблено і навіщо.

Парк крипто-ATM — це не програмний продукт із додатковим залізом. Це логістика готівки з екраном спереду — і кожне число на цьому екрані має зводитися до банкноти, яку можна потримати в руці.
— Protocore · Інженерія платежів

Звірка автомата, якого ви не бачите

Звірка — щоденний доказ чесності парку. Кожна сесія на автоматі лишає запис — банкноти всередину і крипта назовні або навпаки, із зафіксованим курсом, адресами гаманців і підтвердженнями. Підсумуйте сесії автомата від останньої інкасації — отримаєте готівку, яка в ньому має бути; перерахуйте касети під час виїзду — отримаєте готівку, яка в ньому є; ці суми мусять збігатися. Крипто-сторона звіряється так само — з балансом гаманця автомата. Парк, що звіряється по кожному автомату щодня, ловить проблемний апарат у перший день — застрягання, скімінг, помилку підрахунку, — а не знаходить його як квартальну діру, якої ніхто не може пояснити. Сенс журналу по кожному автомату в тому, що він витримує аудит саме тому, що йому ніколи не дозволяли розходитися.

Комплаєнс — справа оператора; програма забезпечує виконання і веде записи

Обов'язки несе оператор парку крипто-ATM. Дозволи, які він має мати, перевірки особи, які мусить проводити, і ліміти операцій, яких має дотримуватися, залежать від місця встановлення кожного автомата, і належать вони оператору — не пристрою і не його постачальнику. Програма робить свідомо механічну справу: застосовує ліміти на клієнта й на добу, які налаштував оператор, запитує крок ідентифікації, якого вимагає оператор, за порогом, який він задав, і записує кожну банкноту, кожен переказ і кожне рішення щодо лімітів, щоб оператор міг пізніше відповісти за парк. Автомат не визначає політику; він однаково застосовує політику оператора в кожному апараті й фіксує, що сталося. Правильна політика — дисципліна оператора. Внесок програми — зробити цю політику єдиною та придатною до аудиту в парку, який жодна людина не здатна охопити поглядом одночасно.

Чесна межа

Одному автомату в одному місці консоль парку майже не потрібна — вистачить таблиці й щотижневого підрахунку. Тут усе виправдовує себе в масштабі парку, коли числа перестають вміщатися в одній голові: залишки готівки у багатьох автоматах, підрахунок касет, що має зводитися по кожній локації, віддалене блокування для автоматів за години їзди та журнал по кожному автомату, що витримує аудит. З одним автоматом це зайві витрати; з двадцятьма графік, звірка й віддалене керування — різниця між бізнесом і купою автоматів, що повільно розходяться з балансом. Консоль парку — за адресою /products/atm, а терміни — касета, рециклер, звірка, розрахунок — у /glossary.

Маєте систему для розробки?

Розкажіть, яку проблему треба розв’язати. Ми повернемося з архітектурою та планом.