Транспорты
Слейт (slate) должен пройти путь от одного кошелька к другому и обратно. Транспорт не зависит от криптографии, и результирующая транзакция одинакова вне зависимости от выбранного маршрута. Различаются операционные издержки, необходимость доступности получателя в момент отправки и сохранность всех полей слейта при передаче.
Методы отправки: http, file, self, keybase, emoji, epicbox. Слушатель принимает http, keybase или epicbox.
Сравнение
| Транспорт | Получатель доступен при отправке | Требует доступный адрес | Работает за NAT | Версия слейта (Slate) | Доказательства платежа |
|---|---|---|---|---|---|
epicbox | Не требуется, релей хранит слейт | No | Да | Всегда V2 | Не передаётся |
http | Требуется | Да, публичный URL | No | Согласуется со слушателем | Передаётся |
file | Не требуется | No | Да | V3, если слейт использует поле V3 | Передаётся |
emoji | Не требуется | No | Да | V3, если слейт использует поле V3 | Передаётся |
keybase | Не требуется | Идентификатор Keybase | Да | Отправляется без преобразования | Передаётся |
self | Тот же кошелёк | No | Да | n/a | n/a |
Epicbox — единственный транспорт, не требующий доступности получателя в момент отправки, и единственный, который не сохраняет доказательство платежа. Именно эти два столбца определяют выбор в большинстве интеграций.
Столбец версии объясняет столбец доказательства. Доказательство платежа — это поле слейта V3. file и
emoji сериализуют V3, как только слейт содержит payment_proof или ttl_cutoff_height (impls/src/adapters/file.rs:30 и impls/src/adapters/emoji.rs:1151). keybase сериализует слейт
без преобразования версии, поэтому все поля сохраняются (impls/src/adapters/keybase.rs:304). http запрашивает у слушателя
поддерживаемую версию и возвращает ошибку вместо понижения версии слейта, содержащего доказательство
(impls/src/adapters/http.rs:143). epicbox безусловно преобразует в V2 (impls/src/adapters/epicbox.rs:251), поэтому запрос доказательства исчезает ещё до того,
как слейт покидает отправителя. Чтобы запросить доказательство, см. выберите транспорт
соответствующим образом.
Наблюдаемые различия между тремя транспортами, к которым обращается разработчик:
| Транспорт | Команды для выполнения перевода | Кто должен слушать | txs записывает контрагента |
|---|---|---|---|
file | 3, разделены между двумя кошельками | никто | Нет, From/To Address — None |
http | 1, только отправитель | получатель | Нет, From/To Address — None |
epicbox | 1 команда, но оба кошелька требуют подписки | обе стороны | Да, адрес отправителя |
Epicbox требует, чтобы отправитель тоже слушал. send -m epicbox подключается к релею, публикует слейт,
блокирует свои входы и возвращает управление (controller/src/command.rs:566). Ответа он не ожидает. Подписанный слейт
возвращается через релей в виде нового сообщения, и финализирует и публикует его тот процесс,
который удерживает epicbox-подписку отправителя (process_incoming_slate()). Таким образом, получателю нужен listen -m epicbox для
подписи, а отправителю — listen -m epicbox для финализации. Ни одна из сторон не обязана быть подключена в момент
действия другой, поскольку релей хранит сообщение до повторного подключения адресата. Запустите обе
подписки перед отправкой. Наблюдаемое время полного цикла составило около 1.5 секунды.
Только epicbox сообщает, кто вам заплатил. При использовании файла и HTTP поле контрагента в журнале транзакций остаётся пустым, поэтому атрибуция обеспечивается другими средствами вашей системы. См. интеграция с биржей.
epicbox
Релей с хранением и пересылкой. Кошелёк удерживает WebSocket-соединение с релеем, а релей хранит адресованные вам слейты до повторного подключения и подтверждения получения. Это единственный вариант, когда ни одна из сторон не может принимать входящие соединения.
# receiver
epic-wallet listen -m epicbox
# sender
epic-wallet send -m epicbox -d <52-char-key>@epicbox.epiccash.com 1.5
Релей хранит подписанные слейты и проверяет подписи по адресу отправителя. Слейты не хранятся бесконечно; см. доставка и её ограничения. После того как финализирующая подписка публикует транзакцию, она ожидает её появления в мемпуле узла — именно поэтому процесс может выглядеть зависшим; см. отправка кажется зависшей.
Протокол передачи данных задокументирован в справочнике по epicbox.
http
Отправитель публикует слейт напрямую в слушатель получателя. Минимальная задержка, и все поля слейта V3 сохраняются, включая доказательства платежей.
# receiver
epic-wallet listen
# sender
epic-wallet send -m http -d http://receiver.example:3415 1.5
Получатель должен быть доступен, что предполагает наличие публичного хоста или проброса порта.
file
Записать слейт в файл, передать его любым способом и обработать на другой стороне. Сетевых зависимостей нет.
epic-wallet send -m file -d slate.tx 1.5 # отправитель, раунд 1
epic-wallet receive -m file -i slate.tx # receiver
epic-wallet finalize -m file -i slate.tx.response # sender
Используйте этот способ для отладки, перемещения средств между подконтрольными вам машинами и точного изучения содержимого слейта.
emoji
Слейт, закодированный в виде последовательности эмодзи, для вставки через чат-приложение.
Кодирование использует таблицу из 1,024 записей, что даёт 10 бит на глиф. Первый глиф — заголовок, кодирующий количество добавленных битов дополнения, поэтому слейт в виде эмодзи всегда начинается с одного из десяти конкретных глифов. Ожидайте примерно 0.8 глифа на байт JSON слейта, что составляет около 3.2 раза больше числа байт после кодирования в UTF-8.
Декодирование требует точных глифов из таблицы, поэтому чат-клиент, подменяющий или нормализующий эмодзи, нарушает его работу; кроме того, декодирование имеет квадратичную сложность по длине, поэтому большие слейты обрабатываются медленно.
keybase
Требует наличия клиента Keybase и остаётся доступным для совместимости.
self
Обе стороны перевода — один и тот же кошелёк. Полезно для перемещения средств между аккаунтами
одного кошелька и для проверки механизма транзакций без контрагента. --dest задаёт аккаунт назначения.
epic-wallet send -m self -d <destination_account> 1.5
Выбор
| Ситуация | Использование |
|---|---|
| Интеграция, где важна корректность | http в частной сети |
| Обычные пользователи, мобильные устройства, нестабильное соединение | epicbox |
| Отладка или перевод средств между собственными машинами | file |
| Требуются доказательства платежа | Всё, кроме epicbox |
| Перевод через чат | emoji |