输出与锁定
发起发送操作会预留所选输入(input),且没有任何机制会自动释放它们。如果转账未完成,这些资金将持续不可用,直到你取消该交易。系统没有超时机制,也没有后台进程负责清理。
输出状态
钱包拥有的每个输出(output)都带有一个状态。Unspent表示已确认且可用。Unconfirmed表示已发现但尚未被足够多的区块埋入,包括尚未确认的发送所产生的找零。Locked表示已作为输入(input)预留给你发起的转账。Spent表示已被已确认的交易消耗,Deleted表示已被scan --delete_unconfirmed移除。只有Unspent是可花费的。
输出状态与余额. 第1步,共5步。一个已确认的输出(output)
Coinbase输出带有额外规则。挖矿奖励在可花费之前会先出现在钱包中,且成熟窗口因网络而异。参见emission。
什么会预留输出
有一个操作会预留它们:tx_lock_outputs。它将选定的输入(input)标记为Locked,并将找零输出(output)写为Unconfirmed。在命令行中,它在同一个send内运行,在slate被交给传输方式之后(controller/src/command.rs:542)。在通过Owner API手动执行的流程中,需要在init_send_tx选定输入并构建第一个slate之后立即自行调用它。
在进行中的发送操作期间,你发送的金额和找零均不可用。从单个100 EPIC输出(output)中发送1 EPIC,在转账完成之前你没有任何可花费的余额,而不是99 EPIC。找零输出尚不存在于链上。将余额分散到多个输出中,才能在转账期间保持其余部分可用;参见保留多个可花费输出。
什么会释放输出
**转账已确认。**输入变为Spent,找零变为Unspent。无需任何操作。
你取消了它。cancel_tx将Locked输入恢复为Unspent,并丢弃未确认的找零。
没有第三种途径。重启钱包不会释放输出(output),因为状态保存在磁盘上;设置到期区块高度同样不会释放。
取消的前提条件
cancel_tx在执行任何操作之前会先联系节点,因此节点宕机或未同步会阻止其执行(libwallet/src/api_impl/owner.rs:758)。然后它需要恰好一笔与你传入的id或slate id匹配的交易,该交易的类型为TxSentCreated或TxReceived,且其confirmed字段为false(libwallet/src/internal/tx.rs:309)。
类型条件决定了边界。一旦已广播的转账在节点的内存池(mempool)中被观察到,其条目即变为TxSentMempool,从那时起你是在等待链确认,而非选择放弃它。钱包在广播后最多轮询四分钟以等待该观察结果;参见发送似乎卡住。
交易状态
钱包对已完成操作的记录是一个带有类型的交易日志条目。ConfirmedCoinbase是挖矿奖励。TxReceived和TxSent分别是已完成的入账和出账转账。TxSentCreated是正在进行中的出账转账,其输入已锁定。TxSentMempool和TxReceivedMempool是在节点内存池中观察到的转账。TxSentCancelled和TxReceivedCancelled是已取消的形式。
读取日志时有两个字段语义需要注意。TxReceived条目在确认后保持其类型不变,因此告知你确认状态的是confirmed字段,而非类型。fee在接收到的交易中为空,因为接收方不设置该字段;请从发送方的记录或内核(kernel)中核对。
CLI打印这些字段的显示名称,因此epic-wallet txs中的Sent (Created)行在通过Owner API的tx_type中显示为TxSentCreated。字段类型详见钱包Owner API参考。
读取余额摘要
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输出(output),正处于发送4 EPIC(手续费0.007)的过程中。整个输入为Locked by transaction,8.493的找零为Awaiting Finalization,因为它尚未上链,且没有任何可花费余额。两行均无法自行解决。
(< 10)为minimum_confirmations,即输出在此钱包花费前所需的确认数。默认值为10,--min_conf可覆盖此值;参见读取钱包已知信息。仅当钱包持有处于成熟期窗口内的coinbase输出时,才会出现Immature Coinbase行。
查找持有输入(input)的转账、释放它并重新扫描,参见卡住的交易。编程方式参见发送与接收。