跳到主要内容

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返回的tokenopen_wallet接受钱包密码
  • 加密:首次调用之后,每次调用均通过ECDH握手进行封装

在每个声明了token的方法的信封中发送该token。将端口保持在本地回环地址。参见钱包的owner访问

按功能分类的方法

可花费资金

Can spend funds 这七个方法用于构建、完成或放弃转账。

方法用途
init_send_tx()选择输入并构建slate的第一轮
tx_lock_outputs()预留已选输入。手动发送流程中必须调用。接受tokenslateparticipant_idaddr_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为十六进制,body_enc为上述base64字符串。信封不含其他字段(api/src/types.rs:59)。
  7. 响应为encrypted_response_v3,携带其自身的noncebody_enc。使用相同密钥解密,恢复内层JSON-RPC响应,该响应再包含其自身的OkErr信封。
  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_outputsretrieve_txs接受limitoffsetsort_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时,会将你的输出(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)已锁定后立即返回第一轮slateapi/src/owner.rs:761)。finalizepost_tx适用于httpkeybase路径。在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为目标,且该监听器应绑定在回环地址上。

完整方法参考

来源

下一页