跳到主要内容

钱包操作

如何使用已设置好并连接到节点的钱包。此处所有操作均在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,000freeman。值为零的行有时会被隐藏而不显示。

TotalCurrently Spendable之间存在差值是正常现象,原因有三种:Coinbase成熟度尚未达到、转账正在进行中且已预留输入(input),或确认数阈值尚未满足。输出与锁定说明了各种情况的具体含义。

--min_conf设置确认数阈值,即输出(output)被钱包视为可花费之前所需的最小深度。默认值为10,仅在三个子命令中声明:sendsrc/cmd/wallet_args.rs:143)、paysrc/cmd/wallet_args.rs:263)和infosrc/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_heightlibwallet/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)
交易输入输出权重手续费
发送,带一个找零输出1280.008
自发送,带三个找零输出14160.016
自发送,带七个找零输出18320.032
合并十个输出后发送10210.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可保留该文件。参见修改密码

下一步