钱包操作
如何使用已设置好并连接到节点的钱包。此处所有操作均在mainnet上进行,因此无需网络参数,且每条涉及转账的命令均为真实操作。
首先完成设置:节点与钱包设置。转账机制与你在首次转账中在本地链上执行的操作相同。
读取钱包已知信息
epic-wallet info
Total 15.00000000
Immature Coinbase 0.00000000
Awaiting Confirmation 0.00000000
Locked by transaction 0.00000000
Currently Spendable 15.00000000
金额以8位小数显示,因为1 EPIC等于100,000,000个freeman。值为零的行有时会被隐藏而不显示。
Total与Currently Spendable之间存在差值是正常现象,原因有三种:Coinbase成熟度尚未达到、转账正在进行中且已预留输入(input),或确认数阈值尚未满足。输出与锁定说明了各种情况的具体含义。
--min_conf设置确认数阈值,即输出(output)被钱包视为可花费之前所需的最小深度。默认值为10,仅在三个子命令中声明:send(src/cmd/wallet_args.rs:143)、pay(src/cmd/wallet_args.rs:263)和info(src/cmd/wallet_args.rs:361)。没有对应的配置文件键,因此除非传入该参数,否则使用默认值。在info上,它会改变摘要报告中的Currently Spendable数值,可通过此方式检查给定阈值下的可用余额:
epic-wallet info --min_conf 1
Coinbase成熟度是独立的共识层下限,不受此参数影响。参见发行时序。
epic-wallet txs
单笔交易详情。Sent (Created)中Confirmed?为false表示这是一笔持有已预留输入的未完成转账。From/To Address列仅在epicbox转账时填充;文件和HTTP方式不填充该列,因此仅凭日志无法得知付款方身份。
交易的确认深度
交易深度为当前链高度减去钱包看到该交易确认时的高度。钱包将该高度记录在交易日志中,字段为confirmation_height(libwallet/src/types.rs:849),在刷新时发现输出(output)已上链时设置(libwallet/src/internal/updater.rs:370)。在confirmed为true之前,该字段值为null。链高度来自节点的get_status,字段为tip.height。
两个字段均位于Owner API的retrieve_txs结果中。epic-wallet txs在输出中打印高度而非深度,因此集成方需自行计算差值。
自动化这些命令
epic-wallet在命令需要钱包密码时会提示输入。以下两种方式可免提示提供密码:
通过命令行。 -p是全局参数,须置于子命令之前(src/cmd/wallet_args.rs:78)。建议从环境变量读取而非直接输入,以避免值被记录到shell历史中:
epic-wallet -p "$EPIC_WALLET_PASSWORD" info
通过Owner API。 open_wallet以密码作为参数,并为后续所有调用返回一个会话令牌。示例客户端从环境变量读取EPIC_WALLET_PASSWORD并直接传入open_wallet,可参照此模式:
wallet = EpicWallet()
wallet.open_wallet(password=os.environ["EPIC_WALLET_PASSWORD"])
接收
向你付款的一方需要你的钱包参与,因为Epic转账由双方共同构建。这意味着需要一个监听器,或者一个由你手动处理的slate文件。
epic-wallet listen -m epicbox -n
此操作保持与epicbox中继的连接。打印地址以供分发:
epic-wallet address
epicbox地址由52个base58字符组成:@,后跟中继域名。它将slate路由到你的钱包。它不是链上账户,无法在链上查询,也不会暴露你的余额。损坏的地址在发送任何内容之前会在本地校验和检查时失败。
你离线期间发送的slate在你重新连接时送达。中继保存slate的时长受两个独立限制约束,其中较短的一个并非存储过期时间,因此转账始终未到账的发送方应取消并重试,而不是无限期等待。参见送达及其限制。
若要处理slate文件而非监听:
epic-wallet receive -m file -i slate.tx
# 将 slate.tx.response 写回发送方
发送
epic-wallet send -m epicbox -d <recipient-address> <amount>
Can spend funds 此操作在接收方执行任何操作之前立即预留你的输入(input)。参见哪些操作会预留输出。
在确认前先查询手续费:
epic-wallet send -e -m epicbox -d <recipient-address> <amount>
-e/--estimate-selection打印两种选择策略下的金额和手续费,不构建任何内容(controller/src/command.rs:482)。
手续费取决于输入(input)和输出(output)的数量,而非固定费率,计算方式详见保留多个可花费输出。
广播后,命令会轮询节点的内存池(mempool)以确认交易已到达;参见发送命令似乎卡住。使用-m epicbox时,双方均需订阅,因为反签名的slate通过中继返回,由你自己的监听器完成最终确认。
Epicbox使用slate V2,不支持支付证明。参见传输方式。
保留多个可花费输出
只持有单个输出(output)的钱包一次只能执行一笔转账。发送操作会锁定该输出并将找零记录为未确认状态,因此在转账确认且找零达到--min_conf个确认数之前,没有任何资金可花费。参见哪些操作会预留输出。
通过向自己发送来拆分余额。-m self会锁定输入(input)并在一条命令(controller/src/command.rs:550)中将slate接收回同一钱包,-d指定目标账户,-o设置写入的找零输出数量:
epic-wallet send -m self -d default -o 3 10
Can spend funds 自转账会锁定所选输入(input),直至交易确认。
该交易有一个输入(input)、四个输出(output)和一个内核(kernel):10 EPIC转回default账户,加上三个找零输出。一旦确认,可同时进行四笔转账。
输出的手续费成本
手续费为交易权重乘以0.001 EPIC。权重计算方式为:每个输出计4次,每个内核计1次,每个输入减1,最低值为1(weight(),tx_fee()):
weight = max(4 × outputs + kernels − inputs, 1)
| 交易 | 输入 | 输出 | 权重 | 手续费 |
|---|---|---|---|---|
| 发送,带一个找零输出 | 1 | 2 | 8 | 0.008 |
| 自发送,带三个找零输出 | 1 | 4 | 16 | 0.016 |
| 自发送,带七个找零输出 | 1 | 8 | 32 | 0.032 |
| 合并十个输出后发送 | 10 | 2 | 1 | 0.001 |
每增加一个输出增加0.004 EPIC。每增加一个输入减少0.001,直至最低值。
发送时花费哪些输出
-s/--selection | 选择 | 结果 |
|---|---|---|
smallest,默认值 | 覆盖金额和手续费所需的最少输出 | 余额的其余部分保持可花费状态 |
all | 每个至少有--min_conf个确认数的输出 | 全部可花费余额在转账期间被锁定,手续费更低,并返还一个找零输出 |
all返回单个找零输出(output),因此钱包再次只持有一个输出。它将已花费的输出在链上相互关联;参见InitTxArgs。
重新广播未获确认的已完成转账
已最终确认的交易在广播前会写入wallet_data/saved_txs/,因此无需重新构建即可再次广播。这适用于转账已完成两轮交互但广播未到达节点的情况。
epic-wallet txs # 查找未确认的已发送条目的 id
epic-wallet repost -i <id>
| 参数 | 效果 |
|---|---|
-i <id> | 存储该交易的交易日志ID |
-m <file> | 将交易写入该文件,而非广播 |
-f | 直接广播,绕过Dandelion中继 |
在src/cmd/wallet_args.rs:335处声明。repost需要已存储的交易对象,因此仅适用于saved_txs/条目仍存在的转账。仅通过助记词恢复的钱包不包含这些记录。
取消无法完成的转账
Destructive 取消操作会释放已预留的输入并放弃该转账。
epic-wallet txs # 查找未完成转账的 id
epic-wallet cancel -i <id>
参见取消操作的前提条件,以及诊断卡住的交易,了解cancel拒绝执行时的处理方法。
修复与链不一致的钱包
epic-wallet scan
根据你的密钥重新扫描链,并重建本地的输出(output)视图。
此操作不会释放已锁定的输出(output),因为锁定是本地记录,链对此一无所知。参见哪些操作会释放锁定。
scan --delete_unconfirmed is a different thing此操作会解锁已锁定的输出(output)并删除其交易日志条目,因此会丢弃记录而非重建记录。请优先使用普通的scan。
账户
账户是绑定到钱包单一种子文件内某个派生路径的标签。每个钱包都有一个名为default的账户。
epic-wallet account # 列出每个标签及其派生路径
epic-wallet account -c savings # 创建一个
epic-wallet -a savings info # 对其执行任意命令
-a位于子命令之前,默认值为default。它为当次调用选择账户,并决定send从哪个账户花费,以及receive或epicbox监听器将资金记入哪个账户。
各账户共享恢复助记词、密码和备份,因此一并备份。派生方案及各账户独立持有的内容详见账户。
修改密码
epic-wallet change_password
种子文件以新密码重新加密,助记词不变。wallet.seed.bak会被写入后删除;传入--remove-backup可保留该文件。参见修改密码。