kib-sources / odc-android-app

Open Digital Cash. Android application.
GNU Lesser General Public License v2.1
0 stars 1 forks source link

Open Digital Cash

Описание проекта

Каждая банкнота имеет свой блокчейн, блоками в которой являются транзакции (операции передачи банкнот между кошельками), таким образом сохраняется полная история движения банкноты. Эту историю может видеть и анализировать, например, банк, выпускающий банкноты.

[!NOTE] Это почти полностью переработанная, обновленная и дополненная версия старого приложения, которое можно найти здесь (в том числе произведена миграция с Fragments на Compose с новым дизайном, описанном в Figma)

Документация проекта Open Digital Cash

Использованные технологии

UI (Compose)

Home Settings History Wallet details
Light Home_light Settings_light History_light Wallet_details_light
Dark Home_dark Settings_dark History_dark Wallet_details_dark

Демонстрация работы приложения

Демонстрация работы приложения (запись экрана), в том числе 2-х splash-screen (системного android и внутреннего в приложении), анимаций.

[!NOTE] Во время передачи банкнот устройство взаимодействует по Bluetooth Classic с находящимся рядом другим смартфоном с такой же версией приложения OpenDigitalCash. Прием и отправка выглядят одинаково на обоих устройствах.

Демонстрация приложения

Цель

Показать принципиальную возможность реализации цифрового аналога фиатной валюты (см. Электронные Деньги):

Особенности реализации

Multi-module, Clean Architecture, SOLID, DI, MVI, MVVM, Unit-Testing (Junit5), Material Design, Material 3.

Примечание: скорее всего, возможно ещё улучшить независимость модулей, если найти способ преобразовать модели в :core:wallet в локальные и вынести аналогичные общие в модуль :core:model. Таким образом будет убраны лишние связи других модулей с :core:wallet, которые возникают только из-за общих моделей.

Модули проекта

Все модули

App модуль

:app: :build-logic: :core: :feature:
convention common-android atm
common-jvm history
connectivity home
database p2p
datastore settings
design-system wallet-details
domain
model
network
testing
transaction-logic
ui
wallet
wallet-repository

[!NOTE] В этой версии модуль, реализующий кошелек, является открытым, а банкноты хранятся в базе данных. В Минимально Жизнеспособном Продукте кошелек должен находиться в отдельном защищенном разделе смартфона (например, на специальной симкарте OpenDigitalCash; потеря симкарты равна потере кошелька).

Протоколы транзакций

Оффлайн передача банкнот между кошельками (P2P)

Схема нового алгоритма передачи (схему старого можно найти в документации ODC к прошлой версии приложения):

ODC_wallet_to_wallet_diagram (dark)

Протоколы передачи

В этой версии передача между кошельками происходит по защищенному каналу Bluetooth, используя два собственных протокола передачи данных:

Протокол 1

Протокол 2:

Оба этих подхода в совокупности позволяют легко расширять DTO и добавлять их новые типы независимо от алгоритма передачи данных, при этом протокол 1 и протокол 2 никак не зависят друг от друга.

Для обоих протоколов написаны Unit-тесты (Junit5).

Поиск пользователей приложения по Bluetooth

Обычный Bluetooth не позволяет отфильтровать пользователей по UUID сервиса, поэтому реализована фильтрация по имени устройства.

Для отправителя

Начинается поиск устройств Bluetooth, но фильтруются и остаются только те, у которых в начале имени есть определенный префикс.

Для получателя

  1. Перед началом вещания оригинальное имя устройства Bluetooth сохраняется в Android Datastore (для того, чтобы откатить его обратно, в том числе даже при падении и восстановлении работы приложения)
  2. Далее имя пользователя, указанное в разделе настроек ODC, загружается из DataStore, к нему добавляется префикс
  3. Bluetooth-имя устройства Android меняется на новое.
  4. После отмены или успешного подключения Bluetooth-имя устройства Android сразу же меняется на старое, сохраненное ранее в DataStore.

Таким образом, личные настройки смартфона пользователя сохраняются нетронутыми.

Выбор банкнот из кошелька по заданной сумме

Пользователь запрашивает сумму из своего кошелька; эта же ситуация может возникнуть и с обычным банкоматом.

Задача: можно ли из имеющихся банкнот (неделимых, как и бумажных) собрать точную сумму, и если да, то из каких именно?

Является задачей о сумме подмножеств, NP-Complete или NP-hard (в зависимости от задачи). Решена здесь при помощи динамического программирования с использованием Kotlin Coroutines, написаны Unit-тесты на Junit5.


КИБ, OpenDigitalCash