• Руководство пользователя
    • Заметки о безопасности
      Заметки о безопасности
    • Online/Desktop приложения
      • Управление аккаунтом
        • Создать аккаунт
          Создать аккаунт
        • Войти в аккаунт
          Войти в аккаунт
        • Создать Резервную Копию Seed-фразы
          Создать Резервную Копию Seed-фразы
        • Восстановить аккаунт
          Восстановить аккаунт
        • Узнать свой адрес Waves.Exchange
          Узнать свой адрес Waves.Exchange
        • Создать персональный алиас
          Создать персональный алиас
        • Импорт из Waves Keeper
          Импорт из Waves Keeper
        • Использовать устройства Legder Nano
          Использовать устройства Legder Nano
        Управление аккаунтом
      • Управление ассетами
        • Перевести криптовалюту
          • Транзакции
            Транзакции
          Перевести криптовалюту
        • Купить криптовалюту с помощью банковской карты
          • Как работать с платежной системой Advanced Cash
            Как работать с платежной системой Advanced Cash
          Купить криптовалюту с помощью банковской карты
        • Передать в стейкинг
          • Услуга OTC
            Услуга OTC
          • Своп WAVES/USDN
            Своп WAVES/USDN
          • Как получить USDN (Quick Guide)
            Как получить USDN (Quick Guide)
          • Как получить USDT/USDC/BTC/ETH (Quick Guide)
            Как получить USDT/USDC/BTC/ETH (Quick Guide)
          Передать в стейкинг
        • Управление Neutrino
          Управление Neutrino
        • Neutrino пулы
          Neutrino пулы
        • Своп DeFo
          Своп DeFo
        • Создать ассет
          Создать ассет
        • Разослать ассет
          Разослать ассет
        • Перевыпустить ассет
          Перевыпустить ассет
        • Поменять перевыпускаемый на не перевыпускаемый
          Поменять перевыпускаемый на не перевыпускаемый
        • Сжечь ассет
          Сжечь ассет
        • Спонсорская транзакция
          Спонсорская транзакция
        • Спонсорская комиссия
          Спонсорская комиссия
        Управление ассетами
      • Расширенные возможности
        • Script транзакции
          Script транзакции
        • JSON подтверждение
          JSON подтверждение
        Расширенные возможности
      • Торговля на бирже
        Торговля на бирже
      • Левередж
        Левередж
      Online/Desktop приложения
    • Мобильные приложения
      • Управление аккаунтом
        • Создать аккаунт
          Создать аккаунт
        • Войти в аккаунт
          Войти в аккаунт
        • Восстановить аккаунт
          Восстановить аккаунт
        • Узнать свой адрес Waves.Exchange
          Узнать свой адрес Waves.Exchange
        • Создать персональный алиас
          Создать персональный алиас
        Управление аккаунтом
      • Управление ассетами
        • Перевести криптовалюту
          Перевести криптовалюту
        • Купить криптовалюту с помощью банковской карты
          Купить криптовалюту с помощью банковской карты
        • Передать WAVES в стейкинг
          Передать WAVES в стейкинг
        • Передать USDN в стейкинг
          Передать USDN в стейкинг
        • Сжечь ассет
          Сжечь ассет
        Управление ассетами
      • Торговля на бирже
        Торговля на бирже
      Мобильные приложения
    Руководство пользователя
  • API и библиотека
    • CCXT
      CCXT
    • Комиссии
      Комиссии
    • API платежей
      API платежей
    • API авторизации
      API авторизации
    • API шлюза
      • Токен доступа
        • Получить токен в интерфейсе
          Получить токен в интерфейсе
        • POST /v1/oauth2/token
          POST /v1/oauth2/token
        Токен доступа
      • Внесение средств
        • GET /v1/deposit/addresses/{currency}
          GET /v1/deposit/addresses/{currency}
        • GET /v1/deposit/currencies
          GET /v1/deposit/currencies
        • GET /v1/deposit/currencies/{currency}
          GET /v1/deposit/currencies/{currency}
        • Terms of Deposit
          Terms of Deposit
        Внесение средств
      • Вывод средств
        • GET /v1/withdraw/addresses/{currency}/{address}
          GET /v1/withdraw/addresses/{currency}/{address}
        • GET /v1/withdraw/currencies
          GET /v1/withdraw/currencies
        • GET /v1/withdraw/currencies/{currency}
          GET /v1/withdraw/currencies/{currency}
        • Условия вывода
          Условия вывода
        Вывод средств
      • История операций
        История операций
      • Список платформ
        Список платформ
      • Проверка соответствия балансов
        Проверка соответствия балансов
      • Коды ошибок
        Коды ошибок
      API шлюза
    • Матчер
      • Протокол Waves.Exchange
        Протокол Waves.Exchange
      • Комиссия матчера
        Комиссия матчера
      • Установка матчера на Ubuntu из Deb-пакета
        Установка матчера на Ubuntu из Deb-пакета
      • Настройки матчера
        Настройки матчера
      • API Матчера
        • Правила валидации ордера
          Правила валидации ордера
        • Правила валидации ExchangeTransaction
          Правила валидации ExchangeTransaction
        API Матчера
      Матчер
    API и библиотека
  • Глоссарий
    Глоссарий
      • English
      • Русский
      On this page
        • Мотивация
        • Децентрализованная биржа
        • Waves.Exchange
        • Алгоритм матчинга
        • Расчёт комиссии Матчера
        • Торгуемый баланс

          # Протокол Waves.Exchange

          # Мотивация

          Потребность в конвертации ассетов возрастает с ростом числа криптовалют. Одной из главных особенностей среды блокчейна является децентрализация, но до недавнего времени существовали только централизованные обмены, в том числе для Биткойн или Ethereum. Многие биржи поддерживают покупку и продажу криптовалют, фиатных валют и ассетов криптовалюты. Примерами таких централизованных бирж являются Coinbase, BTC-e, ShapeShift и Mt.Gox. Централизация в этой сфере может быть небезопасна по причине единой точки отказа - биржи. При работе централизованных бирж все средства пользователей должны храниться в одном месте для участия в торговле. Средства пользователя хранятся непосредственно на самой бирже, которая отвечает не только за сопоставление ордеров и поддержание текущей книги ордеров в корректном состоянии, но и за сами средства вкладчиков. Крах Mt.Gox - самый яркий пример того, почему такая схема ненадежна. Потери этой биржи после компрометации составили около 650 000 BTC. Если злоумышленник взламывает систему обмена, все пользователи потеряют все средства, потому что их закрытые ключи хранятся централизованно - что и произошло в случае кражи из BTC-e. Это далеко не единственный пример, когда биржи потеряли средства вкладчиков подобным образом. Децентрализованный подход к обмену помогает избежать проблем, вызванных вмешательством злоумышленников в работу биржи.

          # Децентрализованная биржа

          Децентрализованные биржи не требуют от пользователей доверять им свои средства: кошелек пользователя не контролируется ни одной организацией. Ордера подписываются цифровыми подписями владельцев напрямую, в процессе авторизации. Пользователи контролируют свои средства, но децентрализованные биржи имеют недостаток, который заключается в том, что торговля происходит не в реальном времени, как на централизованной бирже.

          На децентрализованной бирже для ордера, который проверяется и помещается в книгу ордеров, любой другой пользователь может добавить контр-ордер с цифровой подписью и отправить полную транзакцию с парой ордеров в блокчейн. Затем активы передаются между покупателем и продавцом. Если все компоненты биржи децентрализованы, то автоматическое сопоставление ордеров на покупку и продажу отсутствует - эти операции также должны выполнять пользователи.

          Из-за отсутствия автоматического сопоставления и быстрой отмены существует уязвимость также и для майнинга. Генератор следующего блока всегда будет иметь возможность выполнить отмененные ордера с собой в качестве контрагента, потенциально получая прибыль от такого ордера.

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

          # Waves.Exchange

          Waves.Exchange обеспечивает торговлю различными активами как традиционная биржа, но при этом предоставляет большую безопасность для участников из-за децентрализованного характера работы. Возможность создавать новые ассеты на основе WAVES позволяет на раннем этапе торговать краудфандинговыми активами, обеспечивающими ликвидность ассетов.

          Торговля в режиме реального времени достигается благодаря единственному централизованному элементу Waves.Exchange - книге ордеров Матчера, которая сопоставляет входящие ордера и совершает сделки с высокой скоростью, обычно в течение миллисекунд. Чтобы узнать, была ли сделка успешно выполнена, нет необходимости ждать следующего блока. Waves.Exchange сочетает скорость на уровне централизованного обмена и безопасность децентрализованного протокола.

          При работе Waves.Exchange ордера попарно связаны нодами, выполняющими функцию Матчера. Матчер может сводить ордера частично. Прежде чем попасть в блокчейн Waves.Exchange, транзакции обмена всегда проверяются нодами на предмет соответствия цен в ордерах. После этого Матчер создает транзакцию обмена, подписывает её и помещает в блокчейн для внесения изменений в балансы пользователей. После подтверждения транзакции подпись Матчера проверяется генерирующими нодами, и биржевая транзакция добавляется в блокчейн. Остатки активов на счетах пользователей изменяются в соответствии с суммой и ценой исполнения ордера. Важным моментом является то, что средства переводятся только после публикации в блокчейне. В случае сбоя Матчера обмен не состоится, но средства не будут потеряны, поскольку биржа не владеет активами клиента.

          # Алгоритм матчинга

          Пользователь инициирует свою готовность покупать или продавать активы, создавая, подписывая и отправляя лимитный или марктеный ордер на узел Матчер. Подробнее про лимитный и марктеный ордер в секции Order статьи Matcher API.

          Лимитный ордер в данном примере такой же, как и на других биржах: ордер на покупку (продажу) фиксированного количества ассетов по цене, равной или лучшей, чем указанная. Когда новый ордер отправляется в Waves.Exchange, все его поля валидируются, а подпись проверяется открытым ключом отправителя. Затем в отношении ордера выполняются следующие проверки: ордер с таким идентификатором не должен существовать, и сумма всех ордеров для конкретного актива должна быть меньше или равна остатку этого актива на счете отправителя. Схема работы приведена на Рисунке 1:

          Figure 1

          Пользователь может установить срок действия (maximum timestamp) для ордера, по истечению которого ордер будет автоматически отменен. Лимитные ордеры старше 30 дней будут автоматически отменены, в то время как маркетные ордеры не имеют срока действия. Срок действия ордера задается в момент подписания ордера. Срок действия представляет собой значение типа long - количество миллисекунд с начала эпохи Unix. Когда ордер не выполнен и срок его действия превышает текущее Unix-время, он может быть отменен пользователем. В этом случае ордер попадает в блокчейн как аннулированный ордер, который невозможно выполнить.

          Каждый ордер имеет определенное состояние, в зависимости от стадии его жизненного цикла. Когда ордер находится в книге ордеров, но еще не заполнен - ​​он имеет состояние «Принят». Также ордер может иметь состояние «Заполнен», «Частично заполнен» или «Отменен». Ордера, которые не полностью заполнены, могут быть отменены, после чего ордер будет удален из книги ордеров матчера.

          # Расчёт цены

          Новый отправленный ордер сопоставляется с ордерами в книге ордеров, если существует ордер с ценой, которая лучше или равна заданной.

          1. Для 'BUY' ордеров "лучше" означает, что есть соответствующий 'SELL' ордер с ценой <= заданной.
          2. Для 'SELL' ордеров "лучше" означает, что есть соответствующий 'BUY' ордер с ценой >= заданной.

          Цена исполнения транзакции обмена всегда определяется ценой ордера, который был принят ранее, то есть ордера, который уже находится в книге ордеров.

          # Полное выполнение

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

          2. Если встречный ордер соответствует отправленному ордеру, он исполняется. Это означает, что встречный ордер удаляется из книги ордеров, создается и подписывается закрытым ключом Матчера транзакция обмена и отправляется в сеть Waves для добавления в цепочку блоков.

          3. Если есть несколько ордеров, которые соответствуют новому ордеру, выбирается самый ранний, основанный на времени принятия.

          # Частичное выполнение

          1. Если сумма отправленного ордера достаточно велика для выполнения нескольких ордеров, Матчер создает несколько транзакций обмена, суммы которых совпадают с соответствующими суммами встречных ордеров. Совпадающие встречные ордера выбираются в порядке времени их принятия (First In, First Out).

          2. Если после выполнения всех встречных ордеров все ещё остается сумма от заданного ордера, для выполнения ордеров используется следующий ценовой уровень книги ордеров, удовлетворяющий входящей цене. Для всех совпадающих встречных ордеров соответствующая транзакция обмена создается аналогично предыдущему шагу.

          3. Если после всех совпадений, описанных в предыдущих шагах, остается сумма из поданного ордера, и нет других открытых ордеров, соответствующих цене, новый ордер помещается в книгу ордеров с оставшейся суммой из начального ордера.

          4. Если первый совпадающий ордер в книге ордеров имеет сумму, превышающую отправленный, то будет создана транзакция обмена с суммой, равной входящему ордеру. Частично выполненный встречный ордер будет заменен оставшейся суммой в книге ордеров.

          # Расчёт комиссии Матчера

          См. статью Комиссия матчера.

          # Торгуемый баланс

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

          tradable_balance(asset) = balance_of_asset -
          spendings_of_asset_in_transactions_in_utx_pool -
          reserved_balance_for_asset
          

          # Баланс ассета

          Текущий баланс в валюте:

          • WAVES
          • ассеты

          # Расходы активов в транзакциях в UTX пуле

          Если вы передаете WAVES и отправляете транзакцию данных и эти транзакции еще не сформированы, траты WAVES в транзакциях UTX-пула будут равны количеству переведённых WAVES плюс комиссия за транзакцию перевода плюс комиссия за транзакцию данных.

          Примечание: UTX пул одной ноды не может быть идентичен UTX пулу другой ноды.

          # Резервный баланс для активов

          Резервный баланс для активов также известен как open volume. Представляет собой сумму всех расходов по активу всех ордеров в паре с этим активом.

          Например, при покупке BTC by Bitcoin Cash (1) и продаже Bitcoin Cash for WCT (2), когда эти ордеры всё ещё активны и не выполнены, значение трат Bitcoin Cash в активных ордерах будет равно количеству трат Bitcoin Cash (1) плюс количеству продаваемых Bitcoin Cash (2).

          Примечание: Для WAVES стоимость ордера включена в резервный баланс.

          Для оплаты всех ордеров в Waves.Exchange требуются WAVES. Из-за этого есть исключение из правила, о котором мы говорили выше.

          Если вы покупаете WAVES за другой актив, зарезервированный баланс WAVES в этом порядке будет max(fee - amount_of_received_waves_in_this_order, 0).

          Таким образом, вы можете купить WAVES за BTC, даже если у вас нет WAVES.

          Матчер
          Комиссия матчера
          Матчер
          Комиссия матчера