Перейти к основному содержимому

Операции кошелька

Что делать с кошельком, который настроен и подключён к узлу. Всё здесь относится к 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)
ТранзакцияВходыВыходыВесКомиссия
Отправить с одним выходом сдачи1280.008
Отправить себе с тремя выходами сдачи14160.016
Отправить себе с семью выходами сдачи18320.032
Отправить с консолидацией десяти выходов10210.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, чтобы сохранить его. См. смена пароля.

Далее