跳到主要内容

诊断卡住的交易

未完成的转账会使资金处于以下状态之一:被某笔可取消的转账已预留、未成熟,或等待确认。未完成的转账不会消耗任何价值。

首先,对其分类

epic-wallet info

对比各项数值。总额与可花费金额之间的差距说明属于哪种情况。

现象原因前往
发送后,可花费余额低于总余额转账进行中,输出(output)已预留案例 1
挖矿后,可花费余额低于总余额Coinbase 成熟度案例 2
发送操作挂起数分钟内存池(mempool)确认等待案例 3
已发送,但接收方未收到投递失败案例 4
数据与链不一致本地数据库未更新案例 5
已接收,但始终未确认等待发送方案例 6

情况1:输出(output)被进行中的转账预留

epic-wallet txs

查找类型为Sent (Created)Confirmed?为false的条目,Owner API将其报告为tx_type: "TxSentCreated"。每个此类条目都持有输入(input)。不可用金额大于发送金额,因为在交易上链之前,找零输出(output)同样处于未确认状态。

判断对方是否会响应。如果对方暂时离线且预计会回来,等待是正确的做法。如果转账不会完成,则取消它:

epic-wallet cancel -i <id>

或通过slate id:

epic-wallet cancel -t <slate_id>

取消操作会将已预留的输入返还为可花费状态,并丢弃未确认的找零。余额立即更新。

cancel有前置条件,已广播到内存池(mempool)的交易已超出这些条件的适用范围。参见取消操作的前置条件

取消后,重新发起一笔新的发送,而不是复用旧的slate。

情况2:coinbase成熟度

挖矿奖励在达到网络规定的成熟深度之前无法花费,mainnet上该深度为1,440个区块。参见发行时序

在达到该深度之前,该金额显示为当前不可花费。

情况3:发送操作似乎挂起

广播交易后,钱包每秒轮询一次节点的内存池,最长持续four分钟,以确认交易已到达,在此期间不打印任何内容。共尝试240次,每次间隔一秒,在sendcontroller/src/command.rs:609)中、在finalizecontroller/src/command.rs:779)中以及在epicbox监听器自身的最终确认路径(impls/src/adapters/epicbox.rs:582)中均如此。这些命令背后的Owner API调用会在同等时间窗口内阻塞,因此后端不得在请求线程上运行它们。

等待其完成。如果以Transaction with slate_id ... not found in mempool after waiting结束,则表示广播未到达节点。检查节点是否正在运行且已同步,然后参见情况5

情况4:接收方未收到

转账在投递环节失败。需要检查的内容取决于传输方式。

**通过epicbox。**中继会为未连接的接收方排队存储slate。适用两项限制,且较短的那项并非存储过期时限。已存储的slate无论状态如何,7天后将被删除。另外,若某接收方反复连接但未确认收到所提供的slate,在经过九次投递尝试后,其全部待处理队列将被丢弃;按默认60秒的挑战间隔计算,大约需要九分钟。发送方不会收到任何通知,因此应将已接受的发送视为已接受投递,而非已完成投递。参见投递及其限制

请接收方运行epic-wallet listen -m epicbox并保持运行。如果slate仍在队列中,它将会到达。如果已被丢弃,则取消并重新发送。

**通过HTTP。**没有队列。发送时监听器必须处于可达状态。取消并在其恢复后重试。

**无论哪种方式,都要检查钱包版本。**3.x钱包与4.x钱包可能对slate格式存在分歧。

情况5:本地数据库未更新

如果钱包的数据与链不一致,重建其视图:

epic-wallet scan

此操作会根据你的密钥重新扫描链并修复输出(output)集。不会删除记录。

此操作不会清除已锁定的输出,因为锁定是链不感知的本地记录。对于这类输出,请使用cancel

如果重新扫描似乎没有任何效果,请先检查节点的高度。当节点报告的高度低于钱包最后确认的高度时,刷新会被跳过,这正是在节点仍在同步或已被重置时所看到的现象:

curl -s -u epic:$(cat ~/.epic/main/.api_secret) -H 'Content-Type: application/json' \
-d '{"jsonrpc":"2.0","method":"get_status","params":[],"id":1}' \
http://127.0.0.1:3413/v2/owner

凭据相关内容参见钱包向节点出示的凭据

情况6:已接收但从未确认

作为接收方,你已完成自己的环节并返回了slate。最终确认和广播是发送方的步骤,你无法代为执行,因为你不持有他们的密钥。

epic-wallet txs

Received条目中Confirmed?为false,确切表示此情况,tx_type: "TxReceived"通过API完成。请联系发送方。

TxReceived在确认后保留其类型,因此confirmed是唯一能说明情况的字段。fee在接收的转账中为空,因为接收方从未设置它。

若要放弃该交易,cancel同样适用于TxReceived,且仅释放您这一方已预留的部分。

若以上均不符合

Case 5收集epic-wallet infoepic-wallet txs以及节点的get_status。同时记录您的钱包和节点版本、所用传输方式,以及对方是否运行了监听器。

下一步