Wallet Owner API v3
Owner API是软件驱动钱包的接口:创建钱包、读取余额、构建并最终确认转账、验证证明。对于大多数集成场景,它是主要接口层。
- 端点:
http://127.0.0.1:3420/v3/owner,通过epic-wallet owner_api启动 - 协议:JSON-RPC 2.0 over HTTP POST
- 凭据:HTTP Basic,用户名
epic,密码为钱包的.owner_api_secret内容,以及由open_wallet返回的token(open_wallet需要钱包密码) - 加密:首次调用之后,每次调用均通过ECDH握手进行封装
每次请求(包括init_secure_api)均需携带Basic凭据,每个声明了token的方法须在信封内传入该token。端口保持在本地回环地址。参见钱包的owner访问。
按功能分类的方法
可花费资金
Can spend funds 这七个方法用于构建、完成或放弃转账。
| 方法 | 用途 |
|---|---|
init_send_tx() | 选择输入并构建slate的第一轮 |
tx_lock_outputs() | 预留所选输入(input)。手动发送流程中必须使用。接受token、slate、participant_id和addr_to |
finalize_tx() | 完成聚合签名 |
post_tx() | 广播至网络 |
issue_invoice_tx() | 创建支付请求 |
process_invoice_tx() | 为他人的支付请求提供资金 |
cancel_tx() | 放弃转账并释放其已预留输出 |
破坏性
Destructive 删除本地钱包数据。
| 方法 | 效果 |
|---|---|
delete_wallet() | 删除钱包 |
暴露机密
get_mnemonic() 返回恢复助记词。
更改钱包状态
change_password() 重新加密种子文件。scan() 重建输出(output)状态。
只读
Read only 适用于任何允许读取余额的操作,安全无副作用。
accounts(), retrieve_outputs(), retrieve_txs(), retrieve_summary_info(), node_height(), get_stored_tx(), get_public_address(), get_public_proof_address(), get_updater_messages().
钱包生命周期
create_config(), create_wallet(), open_wallet(), close_wallet(), get_top_level_directory(), set_top_level_directory(), create_account_path(), set_active_account().
open_wallet返回其他所有调用所需的令牌。
证明
retrieve_payment_proof()、verify_payment_proof()、proof_address_from_onion_v3()、verify_slate_messages()。参见支付证明。
配置与后台更新
set_tor_config(), set_epicbox_config(), start_updater(), stop_updater().
传输方式
加密握手
init_secure_api之后的每次调用均在加密信封内传输。参数固定,在api/src/owner_rpc_s.rs:1453中声明:AES-256 GCM模式,12字节nonce,16字节tag附加在密文末尾,附加认证数据为空。
- 在客户端生成一个secp256k1密钥对。
- 调用
init_secure_api,在ecdh_pubkey中以十六进制传入压缩公钥。钱包以相同形式返回自身的公钥。 - 用你的私有标量乘以钱包的公钥点,取32字节的x坐标。该值即为AES-256密钥(
api/src/owner_rpc_s.rs:2433)。 - 将目标调用序列化为完整的JSON-RPC请求对象。该内层请求即为加密内容,
token和方法参数均放置于此。 - 使用新生成的12字节nonce对其加密,将密文与tag拼接后进行base64编码。
- 以
encrypted_request_v3方法发送请求,携带两个参数:十六进制的nonce和base64字符串形式的body_enc。信封不含其他字段(api/src/types.rs:59)。 - 响应为
encrypted_response_v3,携带各自的nonce和body_enc。使用相同密钥解密,还原内层JSON-RPC响应,该响应再包含各自的Ok或Err信封。 open_wallet是第一个通过信封发送的调用,返回其他所有方法所需的令牌。
{"jsonrpc": "2.0", "id": 1, "method": "encrypted_request_v3", "params": {"nonce": "ef32...", "body_enc": "e0bcd..."}}
examples/python/epic_wallet.py实现了完整流程,包括对解密体的二次解包。完整客户端代码见连接与读取。
读取输出(output)与交易
retrieve_outputs和retrieve_txs接受limit、offset和sort_order。
InitTxArgs
控制输入(input)选择和交易结构。
| 字段 | 类型 | 含义 |
|---|---|---|
src_acct_name | string,可选 | 来源账户。为null时使用当前活跃账户 |
amount | u64 | 以freemen为单位的金额。1 EPIC等于100000000 |
minimum_confirmations | u64 | 输出(output)可用前所需的确认数 |
max_outputs | u32 | 最多选择的输入(input)数量 |
num_change_outputs | u32 | 创建的找零输出数量 |
selection_strategy_is_use_all | bool | true时合并所有可用输出;false时选择最少数量 |
message | string,可选 | 提交至slate中的消息 |
target_slate_version | u16,可选 | 输出的slate版本,2或3 |
ttl_blocks | u64,可选 | 过期区块数。默认为无 |
payment_proof_recipient_address | string,可选 | 请求支付证明 |
estimate_only | bool,可选 | 计算手续费但不预留任何资源 |
send_args | object,可选 | 目标地址与传输方式,用于在单次调用中完成整个交换流程 |
附加行为:
selection_strategy_is_use_all会影响隐私。 设为true时,会将你的输出(outputs)合并为一笔交易,使链上分析者能够将其关联。设为false时,输出保持独立,代价是后续UTXO集更大。
支付证明需要slate V3。 payment_proof_recipient_address将证明字段写入slate,而只有V3才携带这些字段。通过epicbox传输会将slate转换为V2,因此以该方式完成的转账不会产生证明。请先确定传输方式:相应地选择传输方式。
ttl_blocks不会在到期时释放输出。 参见输出与锁定。
src_acct_name为单次调用指定来源账户。 accounts未返回的标签将解析为当前活跃账户(libwallet/src/api_impl/owner.rs:383)。参见账户。
send_args在调用内部执行完整交换流程。 它发送slate,然后在你要求时最终确认并广播,因此该调用会阻塞,直到对方完成响应。
将send_args.method设为epicbox时,调用在slate发布到中继且输入(inputs)已锁定后立即返回第一轮slate(api/src/owner.rs:761)。finalize和post_tx适用于http和keybase路径。在epicbox路径上,钱包自身的订阅会在对方回复到达时完成最终确认并广播,内存池(mempool)等待也在此处发生。
手续费
手续费是交易结构的函数,与网络需求无关:
fee = max(4 × outputs + kernels − inputs, 1) × 0.001 EPIC
一笔典型的双输入(input)、双输出(output)、单内核(kernel)转账需要700,000 freemen,即0.007 EPIC。由于钱包不提供基础手续费,因此不存在可竞价的手续费市场。
版本2
同一监听器还提供一个较早的、未加密的Owner API,共17个方法,路径为/v2/owner。其方法不需要令牌,但监听器的Basic凭据同样适用,与/v3/owner一致。新开发应以v3为目标,且监听器应绑定在本地回环地址。
完整方法参考
10个方法。握手、令牌及账户标签。
8个方法。余额、输出、历史记录、地址。
7个方法。涉及价值转移的操作。
4个方法,以及会丢弃支付证明的传输方式。
4个方法。恢复助记词、密码、删除与扫描。
4个方法。中继设置与后台刷新。
来源
api/src/owner_rpc_s.rs定义了所有v3方法,大多数方法在其文档注释中包含完整的JSON请求与响应示例api/src/owner_rpc.rs对应较旧的v2接口libwallet/src/api_impl/owner.rs对应方法背后的实现libwallet/src/api_impl/types.rs适用于InitTxArgs及相关方法controller/src/controller.rs:123了解监听器及其中间件的连接方式