-
Notifications
You must be signed in to change notification settings - Fork 3
Пошаговое взаимодействие сервисов: Booker и различных шлюзов
Sergey Sherkunov edited this page Jun 23, 2020
·
1 revision
Терминология:
- Базовые токены не находятся под управлением, связанным с эмиссией или сжиганием, организации/шлюза.
- Производные токены находятся под управлением, связанным с эмиссией или сжиганием, организации/шлюза.
- Платёжная система является сторонним сервисом, в которой происходят транзакции перевода, эмиссии и сжигания токенов.
- Шлюз является централизованным сервисом обслуживающим платёжную систему и фиксирующим текущие состояние клиентов и организации.
Действующие лица:
- Клиент.
- Booker координирует и валидирует шлюзы.
- Нативные платёжные системы: Bitcoin, Ethereum, Monero, etc.
- Целевая платёжная система: BitShares.
- Нативные шлюзы, управляющие базовыми токенами в базовых платёжных системах.
- Целевой шлюз, управляющий производными (деривативными) токенами в целевой платёжной сети.
Ситуации:
- Клиент обращается к Booker за созданием ордера перевода базовых токенов в производные, вызывая метод new_order.
- Клиент передаёт в запросе:
- Тип ордера, order_type: OrderType
class OrderType(Enum): DEPOSIT = 0 WITHDRAWAL = 1
- Название нативной платёжной системы (Bitcoin, Ethereum, Monero, etc.), in_tx_payment: str.
- Название нативных токенов, in_tx_coin: str.
- Адрес отправления шлюзом пользователю производных токенов в целевой платёжной системе, принадлежащий пользователю, out_tx_to: str.
- Количество базовых токенов (опционально), in_tx_amount: Decimal.
- Booker проверяет существование out_tx_to в целевой платёжной системе, вызывая метод validate_address целевого шлюза.
- Booker передаёт в запросе:
- out_tx_to.
- Если целевой шлюз обнаруживает, что out_tx_to…
- … существует, то целевой шлюз возвращает пустой ответ.
- … не существует, то целевой шлюз возвращает ответ с ошибкой.
- Если Booker обнаруживает, что out_tx_to…
- … существует, то Booker продолжает обработку запроса.
- … не существует, то Booker завершает обработку запроса с ошибкой.
- Booker проверяет существование депозитного адреса (in_tx_to: str), произведя поиск операций в базе данных по адресу out_tx_to…
- Если Booker обнаруживает, что in_tx_to…
- … существует, то Booker использует этот in_tx_to.
- … не существует, то:
- Booker обращается к нативному шлюзу за созданием in_tx_to, вызывая метод get_deposit_address.
- Booker передаёт в запросе:
- out_tx_to.
- Нативный шлюз передаёт в ответе in_tx_to.
- Booker создаёт ордер.
- Booker ставит ордер в очередь задач.
- Booker передаёт в ответе:
- Уникальный идентификатор ордера, order_id: UUID.
- in_tx_to.
- Booker вынимает ордер из очереди задач.
- Booker обращается к нативному шлюзу за созданием ордера базовых токенов в производные, вызывая метод new_order.
- Booker передаёт в запросе:
- order_id.
- order_type.
- in_tx_coin.
- in_tx_to.
- in_tx_amount.
- out_tx_to.
- Нативный шлюз создаёт копию ордера, где начальное состояние in_tx_status = TxStatus.WAIT.
- Нативный шлюз ставит ордер в очередь задач.
- Нативный шлюз передаёт пустой ответ.
- Нативный шлюз вынимает ордер из очереди задач.
- Если нативный шлюз обнаруживает, что нет привязанной к ордеру входящей транзакции, то:
- Шлюз привязывает любую непривязанную транзакцию, in_tx_to у которой совпадает с in_tx_to у ордера.
- Обновляет поля:
- in_tx_hash.
- Индекс выхода в UTXO, индекс события в Ethereum, индекс операции в BitShares, иной идентификатор операции в транзакции, in_tx_index: str.
- in_tx_from.
- in_tx_amount.
- in_tx_created_at.
- Нативный шлюз обновляет поля:
- in_tx_confirmations.
- Если нативный шлюз обнаруживает, что in_tx_confirmations < in_tx_max_confirmations, то нативный шлюз устанавливает поле in_tx_status = TxStatus.RECEIVED_NOT_CONFIRMED.
- Если нативный шлюз обнаруживает, что in_tx_confirmations >= in_tx_max_confirmations, то нативный шлюз устанавливает поле in_tx_status = TxStatus.RECEIVED_AND_CONFIRMED. Это состояние поля финальное и не может быть откатано.
- Нативный шлюз обращается Booker за обновлением состояния ордера, вызывая метод update_order.
- Нативный шлюз передаёт в запросе поля:
- order_id.
- in_tx_hash.
- in_tx_index.
- in_tx_from.
- in_tx_amount.
- in_tx_created_at.
- in_tx_max_confirmations.
- in_tx_confirmations.
- in_tx_status.
- in_tx_error.
- Если Booker обнаруживает, что in_tx_status == TxStatus.RECEIVED_AND_CONFIRMED, то Booker ставит ордер в очередь задач.
- Booker передаёт пустой ответ.
- Если нативный шлюз обнаруживает, что in_tx_status != TxStatus.ERROR || in_tx_status != TxStatus.RECEIVED_AND_CONFIRMED, то нативный шлюз ставит ордер в очередь задач и переходит к шагу 18.
- Booker вынимает ордер из очереди задач.
- Booker обращается к целевому шлюзу за созданием ордера базовых токенов в производные, вызывая метод new_order.
- Booker передаёт в запросе:
- order_id.
- order_type.
- in_tx_coin.
- in_tx_hash.
- in_tx_index.
- in_tx_from.
- in_tx_to.
- in_tx_amount.
- in_tx_created_at.
- in_tx_max_confirmations.
- in_tx_confirmations.
- in_tx_status.
- in_tx_error.
- out_tx_to.
- Целевой шлюз обращается к нативному шлюзу за валидацией запроса, вызывая метод validate_order.
- Целевой шлюз передаёт поля:
- order_id.
- order_type.
- in_tx_coin.
- in_tx_hash.
- in_tx_index.
- in_tx_from.
- in_tx_to.
- in_tx_amount.
- in_tx_created_at.
- in_tx_max_confirmations.
- in_tx_confirmations.
- in_tx_status.
- in_tx_error.
- out_tx_to.
- Нативный шлюз валидирует поля.
- Если поля…
- … валидны, то нативный шлюз возвращает пустой ответ.
- … не валидны, то нативный шлюз возвращает ответ с ошибкой.
- Если целевой шлюз…
- … получил пустой ответ, то целевой шлюз продолжает обработку запроса.
- … получил ответ с ошибкой, то целевой шлюз возвращает ответ с ошибкой.
- Целевой шлюз создаёт копию ордера, где начальное состояние in_tx_status = TxStatus.WAIT.
- Целевой шлюз ставит ордер в очередь задач.
- Целевой шлюз передаёт пустой ответ.
- Целевой шлюз вынимает ордер из очереди задач.
- Если целевой шлюз обнаруживает, что транзакция out_tx…
- … существует, то целевой шлюз продолжает обработку ордера.
- … не существует, то целевой шлюз создаёт транзакцию переевода с out_tx_to и обновляет поля:
- out_tx_hash.
- out_tx_index.
- out_tx_from.
- out_tx_amount.
- out_tx_created_at.
- Целевой шлюз обновляет поля:
- in_tx_confirmations.
- Если целевой шлюз обнаруживает, что out_tx_confirmations < out_tx_max_confirmations, то целевой шлюз устанавливает поле out_tx_status = TxStatus.RECEIVED_NOT_CONFIRMED.
- Если целевой шлюз обнаруживает, что out_tx_confirmations >= out_tx_max_confirmations, то целевой шлюз устанавливает поле out_tx_status = TxStatus.RECEIVED_AND_CONFIRMED. Это состояние поля финальное и не может быть откатано.
- Целевой шлюз обращается Booker за обновлением состояния ордера, вызывая метод update_order.
- Целевой шлюз передаёт в запросе поля:
- order_id.
- out_tx_hash.
- out_tx_index.
- out_tx_from.
- out_tx_amount.
- out_tx_created_at.
- out_tx_max_confirmations.
- out_tx_confirmations.
- out_tx_status.
- out_tx_error.
- Booker передаёт пустой ответ.
- Если целевой шлюз обнаруживает, что out_tx_status != TxStatus.ERROR || in_tx_status != TxStatus.RECEIVED_AND_CONFIRMED, то целевой шлюз ставит ордер в очередь задач и переходит к шагу 39.