Аккаунты
Аккаунт — это метка, привязанная к одному пути деривации BIP32 внутри единственного сида кошелька.
Кошелёк содержит столько аккаунтов, сколько вы создадите, и один с именем default существует с момента
инициализации кошелька.
Запись состоит из двух полей: метки и родительского пути деривации (libwallet/src/types.rs:997). Метка является ключом
хранения (impls/src/backends/lmdb.rs:830), поэтому после создания она неизменна. Всё, что кошелёк хранит о монетах,
индексируется по пути.
Что входит в аккаунт
| Относится к одному аккаунту | Общее для всего кошелька |
|---|---|
| Выходы и вычисленный из них баланс | Файл сида и фраза восстановления |
| Записи лога транзакций, нумерация с 0 в каждом аккаунте | Пароль |
| Следующий индекс дочерней деривации | Финализированные транзакции в saved_txs/ |
| Последняя подтверждённая высота | Кэш слейтов (slate) в процессе обработки |
| Адреса epicbox и доказательства платежа | Высота последнего просканированного блока |
Сводка баланса, список выходов (outputs) и список транзакций — всё это читается из одного аккаунта
(libwallet/src/internal/updater.rs:475). Идентификаторы журнала транзакций начинаются с 0 для каждого аккаунта (impls/src/backends/lmdb.rs:727), поэтому
идентификатор уникален только внутри аккаунта, которому он принадлежит.
epic-wallet address выводит идентификаторы одного аккаунта, и у каждого аккаунта есть собственный (controller/src/command.rs:1360). См.
адреса.
Деривация
default — это идентификатор глубины 2, у которого все дочерние индексы равны нулю. Аккаунт n берёт
наибольший существующий первый индекс и прибавляет единицу (libwallet/src/internal/keys.rs:81), поэтому пути выделяются в порядке
создания и никогда не используются повторно.
Метод accounts возвращает метку и идентификатор пути в виде hex: один байт глубины, за которым следуют
четыре дочерних индекса в формате big-endian:
[
{
"label": "default",
"path": "0200000000000000000000000000000000"
}
]
Получено из кошелька, запущенного с 4.0.0 на 2026-08-26. Аккаунт, созданный вторым, возвращает
0200000001000000000000000000000000
(api/src/owner_rpc_s.rs:99).
Под каждым путём аккаунта располагаются две ветви. Ключи выходов (transaction outputs) — это m/<n>/0/<index>, а
ключи адресов — m/<n>/1/<index>, хешированные через blake2b в секрет secp256k1 (libwallet/src/address.rs:31). Инструмент, владеющий
сидом, может вывести оба для любого аккаунта без базы данных кошелька. Метка — единственное, что
хранится только в базе данных.
Из командной строки
epic-wallet account # вывести все метки с путями деривации
epic-wallet account -c savings # создать один
epic-wallet -a savings info # выполнить любую команду для него
-a по умолчанию равно default (src/cmd/wallet_args.rs:81) и вступает в силу при открытии кошелька, поэтому выбирает
аккаунт для данного конкретного вызова. Листинг выводит два столбца: имя и родительский путь
деривации BIP-32 (controller/src/display.rs:431).
Какой аккаунт использует перевод
Отправка тратит средства из аккаунта, выбранного -a. В Owner API src_acct_name в InitTxArgs задаёт его для
одного вызова, а метка, которой нет в accounts, разрешается в активный аккаунт (libwallet/src/api_impl/owner.rs:383). Передавайте
метку, которую вернул метод accounts.
Получение через file или http зачисляет средства на аккаунт, выбранный -a. Foreign API
принимает его как dest_acct_name в receive_tx.
Получение через epicbox зачисляет средства на аккаунт, который был активен в момент открытия
кошелька слушателем (impls/src/adapters/epicbox.rs:520). Этот слушатель подписывается с адресом данного аккаунта, поэтому один
процесс обслуживает один аккаунт.
Перемещение средств между двумя аккаунтами одного кошелька использует транспорт self, где -d
задаёт аккаунт назначения:
epic-wallet -a savings send -m self -d default 1.5
См. транспорты.
Обновление и сканирование
refresh_from_node обновляет активный аккаунт (libwallet/src/internal/updater.rs:241). scan обходит каждый аккаунт, поскольку восстанавливает
выходы по пути деривации, который каждый из них несёт (libwallet/src/internal/scan.rs:376). Курсор сканирования является общим для
всего кошелька, тогда как последняя подтверждённая высота задаётся для каждого аккаунта отдельно,
поэтому после сканирования высота каждого аккаунта устанавливается по его собственным выходам.
После восстановления
Кошелёк, восстановленный из фразы, восстанавливает пути деривации, но не метки. default сохраняет своё
имя, а каждый другой обнаруженный путь получает метку account_1, account_2 и так далее в порядке обнаружения
(libwallet/src/internal/scan.rs:512). Средства попадают в ту ветвь, под которой были выведены.
См. что восстановление не возвращает.