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

Аккаунты

Аккаунт — это метка, привязанная к одному пути деривации BIP32 внутри единственного сида кошелька. Кошелёк хранит столько аккаунтов, сколько вы создадите; один с именем default существует с момента инициализации кошелька.

Запись состоит из двух полей: метки и родительского пути деривации (libwallet/src/types.rs:992). Метка является ключом хранения (impls/src/backends/lmdb.rs:823), поэтому после создания она неизменна. Всё, что кошелёк хранит о монетах, индексируется по пути.

Что входит в аккаунт

Относится к одному аккаунтуОбщее для всего кошелька
Выходы и вычисленный из них балансФайл сида и фраза восстановления
Записи лога транзакций, нумерация с 0 в каждом аккаунтеПароль
Следующий индекс дочерней деривацииФинализированные транзакции в saved_txs/
Последняя подтверждённая высотаКэш слейтов (slate) в процессе обработки
Адреса epicbox и доказательства платежаВысота последнего просканированного блока

Сводка баланса, список выходов (outputs) и список транзакций — всё это читается из одного аккаунта (libwallet/src/internal/updater.rs:479). Идентификаторы журнала транзакций начинаются с 0 для каждого аккаунта (impls/src/backends/lmdb.rs:721), поэтому идентификатор уникален только внутри аккаунта, которому он принадлежит.

epic-wallet address выводит идентификаторы одного аккаунта, и у каждого аккаунта есть свой (controller/src/command.rs:1360). См. addresses.

Деривация

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).

Под каждым путём аккаунта располагаются две ветви. Ключи выходов (outputs) — m/<n>/0/<index>, ключи адресов — m/<n>/1/<index>, хешированные через blake2b в секрет (secret) 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:513). Этот слушатель подписывается с адресом данного аккаунта, поэтому один процесс обслуживает один аккаунт.

Перемещение средств между двумя аккаунтами одного кошелька использует транспорт self, где -d задаёт аккаунт назначения:

epic-wallet -a savings send -m self -d default 1.5

См. transports.

Обновление и сканирование

refresh_from_node обновляет активный аккаунт (libwallet/src/internal/updater.rs:245). scan обходит все аккаунты, поскольку восстанавливает выходы (outputs) по пути деривации, который несёт каждый из них (libwallet/src/internal/scan.rs:376). Курсор сканирования является общим для всего кошелька, тогда как последняя подтверждённая высота блока хранится отдельно для каждого аккаунта; после сканирования высота каждого аккаунта устанавливается по его собственным выходам.

После восстановления

Кошелёк, восстановленный из фразы, восстанавливает пути деривации, но не метки. default сохраняет своё имя, а каждый другой обнаруженный путь получает метку account_1, account_2 и так далее в порядке обнаружения (libwallet/src/internal/scan.rs:512). Средства попадают в ту ветвь, из которой они были выведены.

См. what recovery does not bring back.

Далее