Skip to content

Пошаговое взаимодействие сервисов: Booker и различных шлюзов

Sergey Sherkunov edited this page Jun 23, 2020 · 1 revision

Терминология:

  1. Базовые токены не находятся под управлением, связанным с эмиссией или сжиганием, организации/шлюза.
  2. Производные токены находятся под управлением, связанным с эмиссией или сжиганием, организации/шлюза.
  3. Платёжная система является сторонним сервисом, в которой происходят транзакции перевода, эмиссии и сжигания токенов.
  4. Шлюз является централизованным сервисом обслуживающим платёжную систему и фиксирующим текущие состояние клиентов и организации.

Действующие лица:

  1. Клиент.
  2. Booker координирует и валидирует шлюзы.
  3. Нативные платёжные системы: Bitcoin, Ethereum, Monero, etc.
  4. Целевая платёжная система: BitShares.
  5. Нативные шлюзы, управляющие базовыми токенами в базовых платёжных системах.
  6. Целевой шлюз, управляющий производными (деривативными) токенами в целевой платёжной сети.

Ситуации:

  1. Клиент обращается к Booker за созданием ордера перевода базовых токенов в производные, вызывая метод new_order.
  2. Клиент передаёт в запросе:
    1. Тип ордера, order_type: OrderType

class OrderType(Enum): DEPOSIT = 0 WITHDRAWAL = 1

  1. Название нативной платёжной системы (Bitcoin, Ethereum, Monero, etc.), in_tx_payment: str.
  2. Название нативных токенов, in_tx_coin: str.
  3. Адрес отправления шлюзом пользователю производных токенов в целевой платёжной системе, принадлежащий пользователю, out_tx_to: str.
  4. Количество базовых токенов (опционально), in_tx_amount: Decimal.
  1. Booker проверяет существование out_tx_to в целевой платёжной системе, вызывая метод validate_address целевого шлюза.
  2. Booker передаёт в запросе:
    1. out_tx_to.
  3. Если целевой шлюз обнаруживает, что out_tx_to…
    1. … существует, то целевой шлюз возвращает пустой ответ.
    2. … не существует, то целевой шлюз возвращает ответ с ошибкой.
  4. Если Booker обнаруживает, что out_tx_to…
    1. … существует, то Booker продолжает обработку запроса.
    2. … не существует, то Booker завершает обработку запроса с ошибкой.
  5. Booker проверяет существование депозитного адреса (in_tx_to: str), произведя поиск операций в базе данных по адресу out_tx_to…
  6. Если Booker обнаруживает, что in_tx_to…
    1. … существует, то Booker использует этот in_tx_to.
    2. … не существует, то:
      1. Booker обращается к нативному шлюзу за созданием in_tx_to, вызывая метод get_deposit_address.
      2. Booker передаёт в запросе:
        1. out_tx_to.
      3. Нативный шлюз передаёт в ответе in_tx_to.
  7. Booker создаёт ордер.
  8. Booker ставит ордер в очередь задач.
  9. Booker передаёт в ответе:
    1. Уникальный идентификатор ордера, order_id: UUID.
    2. in_tx_to.
  10. Booker вынимает ордер из очереди задач.
  11. Booker обращается к нативному шлюзу за созданием ордера базовых токенов в производные, вызывая метод new_order.
  12. Booker передаёт в запросе:
    1. order_id.
    2. order_type.
    3. in_tx_coin.
    4. in_tx_to.
    5. in_tx_amount.
    6. out_tx_to.
  13. Нативный шлюз создаёт копию ордера, где начальное состояние in_tx_status = TxStatus.WAIT.
  14. Нативный шлюз ставит ордер в очередь задач.
  15. Нативный шлюз передаёт пустой ответ.
  16. Нативный шлюз вынимает ордер из очереди задач.
  17. Если нативный шлюз обнаруживает, что нет привязанной к ордеру входящей транзакции, то:
    1. Шлюз привязывает любую непривязанную транзакцию, in_tx_to у которой совпадает с in_tx_to у ордера.
    2. Обновляет поля:
      1. in_tx_hash.
      2. Индекс выхода в UTXO, индекс события в Ethereum, индекс операции в BitShares, иной идентификатор операции в транзакции, in_tx_index: str.
      3. in_tx_from.
      4. in_tx_amount.
      5. in_tx_created_at.
  18. Нативный шлюз обновляет поля:
    1. in_tx_confirmations.
  19. Если нативный шлюз обнаруживает, что in_tx_confirmations < in_tx_max_confirmations, то нативный шлюз устанавливает поле in_tx_status = TxStatus.RECEIVED_NOT_CONFIRMED.
  20. Если нативный шлюз обнаруживает, что in_tx_confirmations >= in_tx_max_confirmations, то нативный шлюз устанавливает поле in_tx_status = TxStatus.RECEIVED_AND_CONFIRMED. Это состояние поля финальное и не может быть откатано.
  21. Нативный шлюз обращается Booker за обновлением состояния ордера, вызывая метод update_order.
  22. Нативный шлюз передаёт в запросе поля:
    1. order_id.
    2. in_tx_hash.
    3. in_tx_index.
    4. in_tx_from.
    5. in_tx_amount.
    6. in_tx_created_at.
    7. in_tx_max_confirmations.
    8. in_tx_confirmations.
    9. in_tx_status.
    10. in_tx_error.
  23. Если Booker обнаруживает, что in_tx_status == TxStatus.RECEIVED_AND_CONFIRMED, то Booker ставит ордер в очередь задач.
  24. Booker передаёт пустой ответ.
  25. Если нативный шлюз обнаруживает, что in_tx_status != TxStatus.ERROR || in_tx_status != TxStatus.RECEIVED_AND_CONFIRMED, то нативный шлюз ставит ордер в очередь задач и переходит к шагу 18.
  26. Booker вынимает ордер из очереди задач.
  27. Booker обращается к целевому шлюзу за созданием ордера базовых токенов в производные, вызывая метод new_order.
  28. Booker передаёт в запросе:
    1. order_id.
    2. order_type.
    3. in_tx_coin.
    4. in_tx_hash.
    5. in_tx_index.
    6. in_tx_from.
    7. in_tx_to.
    8. in_tx_amount.
    9. in_tx_created_at.
    10. in_tx_max_confirmations.
    11. in_tx_confirmations.
    12. in_tx_status.
    13. in_tx_error.
    14. out_tx_to.
  29. Целевой шлюз обращается к нативному шлюзу за валидацией запроса, вызывая метод validate_order.
  30. Целевой шлюз передаёт поля:
    1. order_id.
    2. order_type.
    3. in_tx_coin.
    4. in_tx_hash.
    5. in_tx_index.
    6. in_tx_from.
    7. in_tx_to.
    8. in_tx_amount.
    9. in_tx_created_at.
    10. in_tx_max_confirmations.
    11. in_tx_confirmations.
    12. in_tx_status.
    13. in_tx_error.
    14. out_tx_to.
  31. Нативный шлюз валидирует поля.
  32. Если поля…
    1. … валидны, то нативный шлюз возвращает пустой ответ.
    2. … не валидны, то нативный шлюз возвращает ответ с ошибкой.
  33. Если целевой шлюз…
    1. … получил пустой ответ, то целевой шлюз продолжает обработку запроса.
    2. … получил ответ с ошибкой, то целевой шлюз возвращает ответ с ошибкой.
  34. Целевой шлюз создаёт копию ордера, где начальное состояние in_tx_status = TxStatus.WAIT.
  35. Целевой шлюз ставит ордер в очередь задач.
  36. Целевой шлюз передаёт пустой ответ.
  37. Целевой шлюз вынимает ордер из очереди задач.
  38. Если целевой шлюз обнаруживает, что транзакция out_tx…
    1. … существует, то целевой шлюз продолжает обработку ордера.
    2. … не существует, то целевой шлюз создаёт транзакцию переевода с out_tx_to и обновляет поля:
      1. out_tx_hash.
      2. out_tx_index.
      3. out_tx_from.
      4. out_tx_amount.
      5. out_tx_created_at.
  39. Целевой шлюз обновляет поля:
    1. in_tx_confirmations.
  40. Если целевой шлюз обнаруживает, что out_tx_confirmations < out_tx_max_confirmations, то целевой шлюз устанавливает поле out_tx_status = TxStatus.RECEIVED_NOT_CONFIRMED.
  41. Если целевой шлюз обнаруживает, что out_tx_confirmations >= out_tx_max_confirmations, то целевой шлюз устанавливает поле out_tx_status = TxStatus.RECEIVED_AND_CONFIRMED. Это состояние поля финальное и не может быть откатано.
  42. Целевой шлюз обращается Booker за обновлением состояния ордера, вызывая метод update_order.
  43. Целевой шлюз передаёт в запросе поля:
    1. order_id.
    2. out_tx_hash.
    3. out_tx_index.
    4. out_tx_from.
    5. out_tx_amount.
    6. out_tx_created_at.
    7. out_tx_max_confirmations.
    8. out_tx_confirmations.
    9. out_tx_status.
    10. out_tx_error.
  44. Booker передаёт пустой ответ.
  45. Если целевой шлюз обнаруживает, что out_tx_status != TxStatus.ERROR || in_tx_status != TxStatus.RECEIVED_AND_CONFIRMED, то целевой шлюз ставит ордер в очередь задач и переходит к шагу 39.