跳到主要内容

你的第一笔转账

在私有usernet上完成两个钱包之间的一次转账,然后分别通过HTTP和epicbox重复该操作。只有传输方式发生变化。

你需要运行本地网络中的环境,即一个正在产生区块的节点、两个钱包,以及Alice账户中可花费的余额。开始前请先确认:

cd wallet_alice
epic-wallet --usernet info

在usernet上,coinbase成熟度为3个区块,而钱包的--min_conf默认值为10,因此花费命令需要加--min_conf 3。参见读取钱包信息

转账实际执行的操作

准备. 两个钱包均可访问的节点,以及持有可花费输出(output)的发送方。接收方是否需要在线取决于传输方式。

文件传输方式,逐阶段说明

文件方式不依赖网络,也不需要第三方。slate是一个由你在两个钱包之间手动传递的文件,这使得每个阶段都可检查,每次失败都是本地的。这就是它排在第一位的原因。

1. Alice 构建第一轮

cd wallet_alice
epic-wallet --usernet send -m file -d ../slate.tx --min_conf 3 1

发生了两件事:一个部分slate已写入../slate.tx,Alice的输入(input)已被预留。参见什么会预留输出

epic-wallet --usernet info
epic-wallet --usernet txs

你应该看到一条Sent (Created)记录,其中Confirmed?为false,且可花费余额减少了超过1 EPIC,因为找零输出(output)也处于未确认状态。

用编辑器打开../slate.tx,它是JSON格式。找到amountfeeidparticipant_dataparticipant_data中只有一条条目,即Alice的,这说明该slate是出站且未完成的。

2. Bob 接收

cd ../wallet_bob
epic-wallet --usernet receive -m file -i ../slate.tx

Bob已添加了他的输出(output)、其范围证明(range proof)和他的部分签名:

INFO Response file ../slate.tx.response generated, and can be sent back to the
transaction originator.

响应文件名是在输入路径后追加.responseslate.tx变为slate.tx.response,而不是同目录下使用不同扩展名的文件。

打开它。participant_data现在有两条条目,因此该slate可以被最终确认。

3. Alice 最终确认并广播

cd ../wallet_alice
epic-wallet --usernet finalize -m file -i ../slate.tx.response

finalize完成聚合签名并广播交易:

INFO Transaction with slate_id 91b35693-... found in mempool and marked as TxSentMempool.

该命令在此处可能看起来卡住了。它正在轮询节点的内存池(mempool)以确认交易已到达;参见发送看起来卡住了

4. 确认

一旦某个区块将其包含:

epic-wallet --usernet info # Alice:减少1 EPIC,加上手续费
cd ../wallet_bob
epic-wallet --usernet info # Bob:增加1 EPIC

Alice的交易从Sent (Created)移出,她的已预留输入现已被花费。在一次使用5 EPIC的实际运行中,Alice的余额从204.10880000变为199.10080000,因此手续费为0.00800000。手续费根据输入和输出的数量计算,而非固定费率。

通过HTTP进行相同转账

只需一条命令,因为发送方通过Bob的Foreign API监听器同步驱动两轮交互。

# bob,在他自己的目录中。23425是设置时指定的api_listen_port
epic-wallet --usernet listen -n

# alice
epic-wallet --usernet send -m http -d http://127.0.0.1:23425 --min_conf 3 7

创建、交换、最终确认和广播全部在那一条send内完成。如果Bob在你发送时未处于监听状态,则没有队列,也没有可重试的对象,发送将失败,Alice的输入将保持已预留状态,直到她取消。

通过epicbox进行相同转账

同样只需一条命令,但两个钱包都需要订阅。已签名的slate通过中继异步返回,而非作为直接响应,因此是发送方自己的监听器来完成最终确认。

将两个钱包都指向你自己运行的中继:运行本地epicbox中继涵盖了中继、两个钱包都需要的[epicbox]区块,以及每次只有一个监听器的转账流程。钱包自身的默认值为epicbox.epiccash.com,端口443,即公共mainnet中继;usernet钱包生成mainnet格式的地址,因为地址版本字节仅对floonet进行分支处理。

# bob的地址
epic-wallet --usernet address

# bob和alice,各在自己的目录中
epic-wallet --usernet listen -m epicbox -n

# alice
epic-wallet --usernet send -m epicbox -d <bob-address> --min_conf 3 3

<bob-address>address打印的内容:52个base58字符、@,然后是中继域名。

一次实际观测的往返耗时约1.5秒:

14:27:31.926 bob INFO Receive new transaction (foreign::receive_tx)
14:27:32.569 alice INFO Finalize transaction (owner::finalize_tx)
14:27:33.164 alice INFO Transaction with slate_id a6318e1c-... found in mempool, TxSentMempool
14:27:33.164 alice INFO Slate [a6318e1c-...] finalized successfully

中继从不接触链。它是以地址为键、对slate JSON进行存储转发的系统,由你自己的节点负责广播,这就是私有链可以使用自有中继的原因。

send进程在退出时打印以下内容,此时转账已完成,它正在关闭自己的短暂订阅:

ERROR Error reading message Io(Os { code: 10053, kind: ConnectionAborted ... })
Keep a test chain off a public relay

Usernet地址与mainnet地址无法区分,因此订阅了公共中继的usernet钱包会占用一个mainnet地址。向其发送转账的真实发送方构建的slate无法被usernet钱包广播,其输出将保持已预留状态,直到他们取消。

三种方式的区别

传输方式命令监听方记录对手方支付证明
file3无需任何人携带
http1接收方携带
epicbox1双方不携带

txs仅在epicbox情况下填充其From/To Address列,因此使用文件和HTTP时,交易日志中不会显示付款方信息。Epicbox使用slate V2,无法携带支付证明(payment proof);参见传输方式支付证明

故障排查

**Alice的余额不足,转账未完成。**她的输入(input)仍处于已预留状态:

epic-wallet --usernet txs # 记下id
epic-wallet --usernet cancel -i <id>

cancel有前置条件;参见取消的前置条件

**finalize找不到该文件。**请使用<input>.response,并列出目录以确认实际存在的内容。

**没有任何内容得到确认。**检查节点是否正在运行,以及矿工是否报告了已接受的份额。DEBUG级别出现Block rejected行表示挖矿策略不匹配;运行本地网络中的症状表将该消息与原因对应起来。

**钱包命令报告了错误的余额。**它作用于~/.epic/user,而非你所指定的钱包。请从该钱包的目录下运行命令,或传入--current_dir <path>

其他任何问题,请参阅诊断卡住的交易,这是相应的决策流程。

下一步