Ваш первый перевод
Выполните один перевод между двумя кошельками в приватной сети usernet, затем повторите его через HTTP и epicbox. Меняется только транспорт.
Вам понадобится стенд из раздела запустить локальную сеть — узел, производящий блоки, два кошелька и доступный к трате баланс у Alice. Проверьте это перед началом:
cd wallet_alice
epic-wallet --usernet info
На usernet зрелость coinbase составляет 3 блока, тогда как --min_conf кошелька по умолчанию равно 10,
поэтому команда траты требует --min_conf 3. См. что кошелёк знает.
Что на самом деле делает перевод
Файловый транспорт, этап за этапом
Файловый транспорт не зависит от сети и не требует третьей стороны. Слейт (slate) — это файл, который вы самостоятельно переносите между двумя кошельками, что делает каждый этап проверяемым, а каждый сбой — локальным. Именно поэтому он рассматривается первым.
1. Алиса собирает первый раунд
cd wallet_alice
epic-wallet --usernet send -m file -d ../slate.tx --min_conf 3 1
Произошло два события. Частичный слейт (partial slate) был записан в ../slate.tx, а входы Alice были
зарезервированы. См. что резервирует выходы.
epic-wallet --usernet info
epic-wallet --usernet txs
Должна появиться запись Sent (Created) с Confirmed? false и уменьшенным более чем на 1 EPIC балансом, доступным к
трате, — потому что выход сдачи тоже неподтверждён.
Откройте ../slate.tx в редакторе. Это JSON. Найдите amount, fee, id и participant_data. В participant_data есть одна запись —
Alice, — по которой можно определить, что слейт исходящий и незавершённый.
2. Боб получает
cd ../wallet_bob
epic-wallet --usernet receive -m file -i ../slate.tx
Bob добавил свой выход (output), его доказательство диапазона (range proof) и свою частичную подпись:
INFO Response file ../slate.tx.response generated, and can be sent back to the
transaction originator.
Имя файла ответа — это входной путь с добавленным .response. slate.tx становится slate.tx.response, а не соседним
файлом с другим расширением.
Откройте его. participant_data теперь содержит две записи, поэтому слейт можно финализировать.
3. Алиса финализирует и публикует
cd ../wallet_alice
epic-wallet --usernet finalize -m file -i ../slate.tx.response
finalize завершает агрегированную подпись и публикует транзакцию:
INFO Transaction with slate_id 91b35693-... found in mempool and marked as TxSentMempool.
Команда может зависнуть здесь. Она опрашивает мемпул узла, чтобы подтвердить получение транзакции; см. отправка зависает.
4. Подтвердить
После включения в блок:
epic-wallet --usernet info # Алиса: на 1 EPIC меньше плюс комиссия
cd ../wallet_bob
epic-wallet --usernet info # Боб: на 1 EPIC больше
Транзакция Alice уходит из Sent (Created), а её зарезервированные входы теперь потрачены. В наблюдаемом
прогоне этого сценария с 5 EPIC Alice перешла с 204.10880000 на 199.10080000, то есть комиссия
составила 0.00800000. Комиссии зависят от количества входов и выходов, а не являются фиксированной
ставкой.
Тот же перевод через HTTP
Одна команда, потому что отправитель синхронно выполняет оба раунда через слушатель Foreign API Bob.
# боб, в своём каталоге. 23425 — api_listen_port, заданный при настройке
epic-wallet --usernet listen -n
# alice
epic-wallet --usernet send -m http -d http://127.0.0.1:23425 --min_conf 3 7
Создание, обмен, финализация и публикация — всё происходит внутри одного send. Если Bob не слушает в
момент отправки, очереди нет и повторить попытку не к чему, поэтому отправка завершается ошибкой, а
входы Alice остаются зарезервированными до тех пор, пока она не отменит транзакцию.
Тот же перевод через epicbox
Тоже одна команда, но подписка нужна обоим кошелькам. Подписанный слейт возвращается через релей (relay) асинхронно, а не в виде ответа, поэтому финализацию выполняет собственный слушатель отправителя.
Направьте оба кошелька на релей, который вы запускаете самостоятельно: запустить локальный
epicbox-релей описывает релей, блок [epicbox], необходимый обоим кошелькам, и перевод с одним
слушателем за раз. Собственное значение по умолчанию кошелька — epicbox.epiccash.com на порту 443, то есть
публичный mainnet-релей; кошелёк usernet генерирует адреса в формате mainnet, потому что байты
версии адреса ветвятся только для floonet.
# адрес боба
epic-wallet --usernet address
# боб и алиса, каждый в своём каталоге
epic-wallet --usernet listen -m epicbox -n
# alice
epic-wallet --usernet send -m epicbox -d <bob-address> --min_conf 3 3
<bob-address> — это то, что напечатал address: 52 символа base58, @, затем домен релея.
Наблюдаемый цикл занял около 1.5 секунды:
14:27:31.926 bob INFO Receive new transaction (foreign::receive_tx)
14:27:32.569 alice INFO Finalize transaction (owner::finalize_tx)
14:27:33.164 alice INFO Transaction with slate_id a6318e1c-... found in mempool, TxSentMempool
14:27:33.164 alice INFO Slate [a6318e1c-...] finalized successfully
Релей не взаимодействует с цепочкой. Он выполняет функцию хранения и пересылки JSON слейта с ключом по адресу, а публикацию выполняет ваш собственный узел — именно поэтому приватная цепочка может использовать собственный релей.
Процесс send выводит это при завершении, после того как перевод завершён, закрывая собственную
кратковременную подписку:
ERROR Error reading message Io(Os { code: 10053, kind: ConnectionAborted ... })
Адреса usernet неотличимы от адресов mainnet, поэтому кошелёк usernet, подписанный на публичный релей, занимает адрес mainnet. Реальный отправитель, доставляющий на него средства, формирует слейт, который кошелёк usernet не может опубликовать, и их выходы остаются зарезервированными до тех пор, пока они не отменят транзакцию.
Различия между тремя способами
| Транспорт | Команды | Кто слушает | Записывает контрагента | Доказательства платежа |
|---|---|---|---|---|
file | 3 | никто | No | Передаётся |
http | 1 | получатель | No | Передаётся |
epicbox | 1 | оба | Да | Не передаётся |
txs заполняет столбец From/To Address только для epicbox, поэтому при использовании файла и HTTP журнал
транзакций не содержит информации о том, кто вам заплатил. Epicbox использует slate V2, который не
может содержать доказательство платежа; см. транспорты и доказательства платежа.
Если что-то пошло не так
Баланс Алисы уменьшился, но перевод не завершён. Её входы всё ещё зарезервированы:
epic-wallet --usernet txs # запомните id
epic-wallet --usernet cancel -i <id>
cancel имеет предусловия; см. предусловия отмены.
finalize не может найти файл. Используйте <input>.response и выведите список каталога, чтобы убедиться в том,
что там находится.
Ничего не подтверждается. Проверьте, что узел запущен и майнер сообщает о принятых шарах. Строка
Block rejected на уровне DEBUG означает несоответствие политики майнинга; таблица симптомов в запустить
локальную сеть сопоставляет сообщение с причиной.
Команда кошелька сообщает неверный баланс. Она выполнилась для ~/.epic/user, а не для нужного вам
кошелька. Запустите её из каталога этого кошелька или передайте --current_dir <path>.
В остальных случаях воспользуйтесь процедурой принятия решений из раздела диагностика застрявшей транзакции.