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
- 凭据:由
open_wallet返回的token,open_wallet接受钱包密码 - 加密:首次调用之后,每次调用均通过ECDH握手进行封装
在每个声明了token的方法的信封中发送该token。将端口保持在本地回环地址。参见钱包的owner访问。
按功能分类的方法
可花费资金
Can spend funds 这七个方法用于构建、完成或放弃转账。
| 方法 | 用途 |
|---|---|
init_send_tx() | 选择输入并构建slate的第一轮 |
tx_lock_outputs() | 预留已选输入。手动发送流程中必须调用。接受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为十六进制,body_enc为上述base64字符串。信封不含其他字段(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时,会将你的输出(output)合并到一笔交易中,这会将它们关联在一起,使链上分析者能够追踪。设为false时,输出保持独立,代价是后续UTXO集合更大。
支付证明需要slate V3。 payment_proof_recipient_address将证明字段写入slate,而只有V3才携带这些字段。通过epicbox传输会将slate转换为V2,因此以该方式发送的转账虽能完成,但不会产生证明。请先确定传输方式:相应地选择传输方式。
ttl_blocks在到期时不会释放输出(output)。 参见输出与锁定。
src_acct_name为单次调用指定来源账户。 accounts未返回的标签将解析为当前活跃账户(libwallet/src/api_impl/owner.rs:383)。参见账户。
send_args在调用内部执行完整交换流程。 它发送slate,然后在你请求的情况下最终确认并广播,因此该调用会阻塞,直到对方响应为止。
将send_args.method设为epicbox时,调用在slate发布到中继且输入(input)已锁定后立即返回第一轮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。其方法无需令牌。新开发应以v3为目标,且该监听器应绑定在回环地址上。
完整方法参考
十个方法。握手、令牌及账户标签。
八个方法。余额、输出、历史记录、地址。
七个方法。用于转移价值的方法。
四个方法,以及丢弃这些方法的传输方式。
四个方法。恢复助记词、密码、删除和扫描。
四个方法。中继设置和后台刷新。
来源
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说明监听器及其中间件的连接方式