Операции кошелька
Что делать с кошельком, который настроен и подключён к узлу. Всё здесь относится к mainnet, поэтому флаг сети не указывается, и каждая команда, перемещающая средства, является реальной.
Предварительная настройка: настройка узла и кошелька. Механика перевода та же, что вы уже применяли на локальной цепочке в разделе первый перевод.
Читать состояние кошелька
epic-wallet info
Total 15.00000000
Immature Coinbase 0.00000000
Awaiting Confirmation 0.00000000
Locked by transaction 0.00000000
Currently Spendable 15.00000000
Суммы выводятся с 8 десятичными знаками, поскольку 1 EPIC равен 100,000,000 freeman. Строки с нулевыми значениями иногда скрываются, а не отображаются.
Разрыв между Total и Currently Spendable — норма и означает одно из трёх: не прошла зрелость coinbase, перевод в
процессе и зарезервировал входы, либо не достигнут порог подтверждений. Раздел выходы и
блокировка объясняет, какой случай какой.
--min_conf задаёт порог подтверждений — минимальную глубину, которую должен иметь выход (output), чтобы
кошелёк считал его доступным к трате. Значение по умолчанию — 10; флаг объявляется ровно для трёх
подкоманд: send (src/cmd/wallet_args.rs:143), pay (src/cmd/wallet_args.rs:263) и info (src/cmd/wallet_args.rs:361). Ключа конфигурации нет, поэтому значение по
умолчанию применяется, если флаг не передан. Для info он изменяет значение Currently Spendable, которое выводит
сводка, — так можно проверить, что станет доступно при заданном пороге:
epic-wallet info --min_conf 1
Зрелость coinbase — отдельный порог на уровне консенсуса и не зависит от этого флага. См. тайминг эмиссии.
epic-wallet txs
Детали по каждой транзакции. Sent (Created) со значением Confirmed? false — незавершённый перевод, удерживающий
зарезервированные входы. Столбец From/To Address заполняется только для epicbox-переводов; файловый и
HTTP-транспорт оставляют его пустым, поэтому по одному лишь журналу нельзя определить, кто вам
заплатил.
Глубина подтверждения транзакции
Глубина транзакции — это текущая высота блока минус высота, на которой кошелёк зафиксировал её
подтверждение. Кошелёк записывает эту высоту в журнал транзакций как confirmation_height (libwallet/src/types.rs:849); значение
устанавливается, когда обновление обнаруживает выходы в цепочке (libwallet/src/internal/updater.rs:370). Поле равно null, пока confirmed
не станет true. Высота блока берётся из get_status узла, поле tip.height.
Оба поля присутствуют в результате retrieve_txs Owner API. epic-wallet txs выводит высоту, а не глубину, поэтому
интеграция вычисляет разность самостоятельно.
Автоматизация этих команд
epic-wallet запрашивает пароль кошелька, когда он нужен команде. Два способа передать его без запроса:
Через командную строку. -p — глобальный флаг, поэтому он указывается перед подкомандой (src/cmd/wallet_args.rs:78).
Считывайте его из переменной окружения, а не вводите вручную, чтобы значение не попало в историю
оболочки:
epic-wallet -p "$EPIC_WALLET_PASSWORD" info
Через Owner API. open_wallet принимает пароль в качестве параметра и возвращает токен сессии для всех
последующих вызовов. Примеры клиентов считывают EPIC_WALLET_PASSWORD из переменной окружения и передают напрямую в
open_wallet — это и есть шаблон для копирования:
wallet = EpicWallet()
wallet.open_wallet(password=os.environ["EPIC_WALLET_PASSWORD"])
Получить
Тот, кто платит вам, нуждается в участии вашего кошелька, поскольку перевод Epic строится обеими сторонами. Это означает необходимость слушателя либо файла слейта (slate), который вы обрабатываете вручную.
epic-wallet listen -m epicbox -n
Удерживает подключение к epicbox-релею. Выведите адрес для передачи другим:
epic-wallet address
Адрес epicbox состоит из 52 символов base58: @, затем домен релея. Он маршрутизирует слейты
(slates) к вам. Это не аккаунт в цепочке, его нельзя найти в блокчейне, и он не раскрывает ваш
баланс. Повреждённый адрес не проходит контрольную сумму локально, до отправки чего-либо.
Слейт (slate), отправленный в ваше отсутствие, доставляется при повторном подключении. Время хранения слейта на релее ограничено двумя независимыми лимитами, и меньший из них — не срок хранения, поэтому отправитель, чей перевод так и не прошёл, отменяет его и повторяет попытку, не ожидая бесконечно. См. доставка и её ограничения.
Для обработки файла слейта вместо прослушивания:
epic-wallet receive -m file -i slate.tx
# записывает slate.tx.response, который возвращается отправителю
Отправить
epic-wallet send -m epicbox -d <recipient-address> <amount>
Can spend funds Это резервирует ваши входы немедленно, до того как получатель предпринял какие-либо действия. См. что резервирует выходы.
Запросить комиссию перед подтверждением:
epic-wallet send -e -m epicbox -d <recipient-address> <amount>
-e/--estimate-selection выводит сумму и комиссию для обеих стратегий выбора и ничего не собирает (controller/src/command.rs:482).
Комиссии зависят от числа входов и выходов, а не от фиксированной ставки; арифметика описана в разделе сохранить более одного доступного к трате выхода.
После публикации команда опрашивает мемпул узла, чтобы подтвердить получение транзакции; см.
отправка зависает. При использовании -m epicbox обеим сторонам нужна подписка, поскольку
контрподписанный слейт возвращается через релей и финализируется собственным слушателем.
Epicbox использует slate V2 и не поддерживает доказательство платежа. См. транспорты.
Хранить несколько доступных к трате выходов
Кошелёк, содержащий один выход (output), может выполнять один перевод за раз. Отправка блокирует
этот выход и записывает сдачу как неподтверждённую, поэтому ничего не доступно к трате, пока перевод
не подтвердится и сдача не наберёт --min_conf подтверждений. См. что резервирует выходы.
Разделите баланс, отправив средства самому себе. -m self блокирует входы (inputs) и получает слейт
(slate) обратно в тот же кошелёк одной командой (controller/src/command.rs:550), -d задаёт имя целевого аккаунта, а -o
устанавливает количество записываемых выходов сдачи:
epic-wallet send -m self -d default -o 3 10
Can spend funds Самоотправка блокирует выбранные входы до подтверждения.
Эта транзакция содержит один вход, четыре выхода и одно ядро (kernel): 10 EPIC, возвращённых на
аккаунт default, плюс три выхода сдачи. После подтверждения можно одновременно держать в процессе
четыре перевода.
Стоимость выхода
Комиссия равна весу транзакции, умноженному на 0.001 EPIC. Вес считает каждый выход четыре раза,
каждое ядро один раз, вычитает каждый вход и имеет нижнюю границу 1 (weight(), tx_fee()):
weight = max(4 × outputs + kernels − inputs, 1)
| Транзакция | Входы | Выходы | Вес | Комиссия |
|---|---|---|---|---|
| Отправить с одним выходом сдачи | 1 | 2 | 8 | 0.008 |
| Отправить себе с тремя выходами сдачи | 1 | 4 | 16 | 0.016 |
| Отправить себе с семью выходами сдачи | 1 | 8 | 32 | 0.032 |
| Отправить с консолидацией десяти выходов | 10 | 2 | 1 | 0.001 |
Каждый дополнительный выход добавляет 0.004 EPIC. Каждый дополнительный вход убирает 0.001, но не ниже нижней границы.
Какие выходы тратит отправка
-s/--selection | Выбирает | Результат |
|---|---|---|
smallest, значение по умолчанию | минимальное количество выходов, покрывающих сумму и комиссию | остаток баланса остаётся доступным к трате |
all | каждый выход с не менее чем --min_conf подтверждениями | весь доступный к трате баланс блокируется для перевода, комиссия ниже, и один выход сдачи возвращается |
all возвращает один выход сдачи, поэтому кошелёк снова содержит один выход. Это связывает
потраченные выходы друг с другом в цепочке; см. InitTxArgs.
Повторно опубликовать завершённый перевод, который не получил подтверждения
Финализированная транзакция записывается в wallet_data/saved_txs/ до публикации, поэтому её можно опубликовать
повторно без пересборки. Это актуально, когда оба раунда перевода завершились, но публикация не
достигла узла.
epic-wallet txs # найти id неподтверждённой записи Sent
epic-wallet repost -i <id>
| Флаг | Эффект |
|---|---|
-i <id> | Идентификатор лога транзакции с сохранённой транзакцией |
-m <file> | Записать транзакцию в файл вместо публикации |
-f | Опубликовать напрямую, минуя Dandelion релей |
Объявлено в src/cmd/wallet_args.rs:335. repost требует сохранённого объекта транзакции, поэтому работает только для
переводов, у которых запись saved_txs/ ещё присутствует. Кошелёк, восстановленный только из фразы, таких
записей не имеет.
Отменить перевод, который не может завершиться
Destructive Отмена освобождает зарезервированные входы и прекращает перевод.
epic-wallet txs # найти id незавершённого перевода
epic-wallet cancel -i <id>
См. предусловия отмены и диагностика застрявшей транзакции — что делать, когда cancel
отказывает.
Восстановить кошелёк, расходящийся с цепочкой
epic-wallet scan
Пересканирует цепочку по вашим ключам и перестраивает локальное представление ваших выходов.
Заблокированные выходы не освобождаются, поскольку блокировка — локальная запись, о которой цепочка ничего не знает. См. что их освобождает.
scan --delete_unconfirmed is a different thingРазблокирует заблокированные выходы и удаляет их записи в журнале транзакций, то есть удаляет
записи, а не восстанавливает их. Сначала используйте обычный scan.
Аккаунты
Аккаунт — это метка, привязанная к одному пути деривации внутри единственного сида кошелька. В
каждом кошельке есть один аккаунт с именем default.
epic-wallet account # вывести все метки с путями деривации
epic-wallet account -c savings # создать один
epic-wallet -a savings info # выполнить любую команду для него
-a указывается перед субкомандой и по умолчанию равен default. Он выбирает аккаунт для данного
вызова, определяет, с какого аккаунта send тратит средства и на какой аккаунт receive или слушатель
epicbox зачисляет средства.
Аккаунты совместно используют фразу восстановления, пароль и резервную копию, поэтому резервируются вместе. См. аккаунты — схема деривации и что каждый аккаунт хранит отдельно.
Изменить пароль
epic-wallet change_password
Сид перешифровывается с новым паролем, фраза при этом не меняется. wallet.seed.bak записывается, а затем
удаляется; передайте --remove-backup, чтобы сохранить его. См. смена пароля.