跳到主要内容

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().

加密握手​

init_secure_api之后的每次调用均在加密信封内传输。参数固定,在api/src/owner_rpc_s.rs:1453中声明:AES-256 GCM模式,12字节nonce,16字节tag附加在密文末尾,附加认证数据为空。

  1. 在客户端生成一个secp256k1密钥对。
  2. 调用init_secure_api,在ecdh_pubkey中以十六进制传入压缩公钥。钱包以相同形式返回自身的公钥。
  3. 用你的私有标量乘以钱包的公钥点,取32字节的x坐标。该值即为AES-256密钥(api/src/owner_rpc_s.rs:2433)。
  4. 将目标调用序列化为完整的JSON-RPC请求对象。该内层请求即为加密内容,token和方法参数均放置于此。
  5. 使用新生成的12字节nonce对其加密,将密文与tag拼接后进行base64编码。
  6. 以encrypted_request_v3方法发送请求,携带两个参数:十六进制的nonce和base64字符串形式的body_enc。信封不含其他字段(api/src/types.rs:59)。
  7. 响应为encrypted_response_v3,携带各自的nonce和body_enc。使用相同密钥解密,还原内层JSON-RPC响应,该响应再包含各自的Ok或Err信封。
  8. 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_namestring,可选来源账户。为null时使用当前活跃账户
amountu64以freemen为单位的金额。1 EPIC等于100000000
minimum_confirmationsu64输出(output)可用前所需的确认数
max_outputsu32最多选择的输入(input)数量
num_change_outputsu32创建的找零输出数量
selection_strategy_is_use_allbooltrue时合并所有可用输出;false时选择最少数量
messagestring,可选提交至slate中的消息
target_slate_versionu16,可选输出的slate版本,2或3
ttl_blocksu64,可选过期区块数。默认为无
payment_proof_recipient_addressstring,可选请求支付证明
estimate_onlybool,可选计算手续费但不预留任何资源
send_argsobject,可选目标地址与传输方式,用于在单次调用中完成整个交换流程

附加行为:

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为目标,且监听器应绑定在本地回环地址。

完整方法参考​

来源​

下一页​