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

Выходы и блокировка

Начало отправки резервирует выбранные входы (inputs), и ничто не освобождает их автоматически. Если перевод не завершается, эти средства остаются недоступными до тех пор, пока вы не отмените транзакцию. Таймаута нет, фонового процесса очистки нет.

Состояния выходов​

Каждый выход (output), которым владеет кошелёк, имеет статус. Unspent — подтверждён и доступен. Unconfirmed — обнаружен, но ещё не погребён под достаточным количеством блоков; сюда входит сдача от отправки, которая не подтверждена. Locked — зарезервирован как вход (input) для перевода, который вы начали. Spent — потреблён подтверждённой транзакцией, а Deleted — удалён операцией scan --delete_unconfirmed. Только Unspent доступен к трате.

Один перевод (transfer), прослеженный через состояния выходов (outputs), с пересчётом сводки баланса на каждом шаге. Переходите по шагам или выбирайте, что происходит при незавершении.

Состояния выходов и баланс. Шаг 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:316).

Тип условия задаёт границу. Как только опубликованный перевод обнаружен в мемпуле узла, его запись становится 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.

Далее​