Выходы и блокировка
Начало отправки резервирует выбранные входы (inputs), и ничто не освобождает их автоматически. Если перевод не завершается, эти средства остаются недоступными до тех пор, пока вы не отмените транзакцию. Таймаута нет, фонового процесса очистки нет.
Состояния выходов
Каждый выход (output), которым владеет кошелёк, имеет статус. Unspent — подтверждён и доступен. Unconfirmed —
обнаружен, но ещё не погребён под достаточным количеством блоков; сюда входит сдача от отправки,
которая не подтверждена. Locked — зарезервирован как вход (input) для перевода, который вы начали.
Spent — потреблён подтверждённой транзакцией, а Deleted — удалён операцией scan --delete_unconfirmed. Только Unspent доступен к
трате.
Состояния выходов и баланс. Шаг 1 из 5. Один подтверждённый выход
Coinbase-выходы подчиняются дополнительному правилу. Намайненная награда появляется в кошельке до того, как её можно потратить, а окно созревания различается в зависимости от сети. См. emission.
Что резервирует выходы
Одна операция резервирует их — tx_lock_outputs. Она помечает выбранные входы как Locked и записывает выход сдачи
как Unconfirmed. В командной строке она выполняется внутри того же send, после того как слейт (slate)
передан транспорту (controller/src/command.rs:542). При ручной последовательности через Owner API вы вызываете её
самостоятельно, сразу после того как init_send_tx выбрал входы и собрал первый слейт.
Во время отправки в процессе выполнения и отправленная сумма, и сдача недоступны. Отправка 1 EPIC из единственного выхода (output) в 100 EPIC не оставляет ничего доступного к трате до разрешения перевода — не 99 EPIC. Выход сдачи ещё не существует в цепочке. Разделение баланса по нескольким выходам позволяет использовать остаток во время перевода; см. keep more than one spendable output.
Что освобождает их
Перевод подтверждается. Входы становятся Spent, сдача становится Unspent. Никаких действий не
требуется.
Вы отменяете его. cancel_tx возвращает Locked входы в состояние Unspent и удаляет неподтверждённую сдачу.
Третьего пути нет. Перезапуск кошелька не освобождает выходы, поскольку состояние хранится на диске; установка высоты истечения срока тоже не освобождает.
Предусловия отмены
cancel_tx обращается к узлу перед любым действием, поэтому недоступный или несинхронизированный узел
блокирует его выполнение (libwallet/src/api_impl/owner.rs:758). Далее требуется ровно одна транзакция, соответствующая переданному
id или slate id, тип этой транзакции должен быть TxSentCreated или TxReceived, а поле confirmed должно быть равно false
(libwallet/src/internal/tx.rs:309).
Тип условия задаёт границу. Как только опубликованный перевод обнаружен в мемпуле узла, его запись
становится TxSentMempool, и с этого момента вы ожидаете цепочку, а не выбираете отказ от него. Кошелёк
опрашивает это обнаружение в течение до четырёх минут после публикации; см. the send appears to
hang.
Состояния транзакций
Запись кошелька о выполненных действиях — это запись журнала транзакций с типом. ConfirmedCoinbase — намайненная
награда. TxReceived и TxSent — завершённый входящий и исходящий перевод. TxSentCreated — исходящий перевод в
процессе, с заблокированными входами. TxSentMempool и TxReceivedMempool — переводы, обнаруженные в мемпуле узла. TxSentCancelled и
TxReceivedCancelled — отменённые формы.
При чтении журнала важны семантики двух полей. Запись TxReceived сохраняет свой тип после подтверждения,
поэтому о подтверждении сообщает поле confirmed, а не тип. А fee пусто у полученной транзакции,
поскольку получатель его не устанавливает; сверяйтесь с записью отправителя или с ядром (kernel).
CLI выводит отображаемые имена для них, поэтому строка Sent (Created) в epic-wallet txs — это TxSentCreated в tx_type через Owner
API. Типы полей указаны в Wallet Owner API reference.
Чтение сводки баланса
epic-wallet info распределяет стоимость кошелька по строкам, которые объясняют нехватку:
$ epic-wallet info
____ Wallet Summary Info - Account 'default' as of height 3675163 ____
Confirmed Total | 12.50000000
Awaiting Confirmation (< 10) | 0.00000000
Awaiting Finalization | 8.49300000
Locked by transaction | 12.50000000
-------------------------------- | -------------
Currently Spendable | 0.00000000
Это один кошелёк, хранящий единственный подтверждённый выход на 12.5 EPIC, в процессе отправки 4
EPIC с комиссией 0.007. Весь вход — Locked by transaction, сдача 8.493 — Awaiting Finalization, поскольку она ещё не попала в цепочку,
и ничего не доступно к трате. Ни одна строка не разрешается самостоятельно.
(< 10) — это minimum_confirmations, количество подтверждений, которое необходимо выходу, прежде чем кошелёк потратит
его. Значение по умолчанию — 10, --min_conf переопределяет его; см. read what the wallet knows.
Строка Immature Coinbase появляется только тогда, когда кошелёк содержит coinbase-выходы внутри окна зрелости.
Поиск перевода, удерживающего входы (inputs), его отмена и повторное сканирование описаны в stuck transactions. Программный вариант — в send and receive.