支付证明
在透明链上,证明你向某人付款意味着指向一笔交易。在Epic上没有任何东西可以指向,因为账本持有的是盲化的承诺(commitment),不含发送方、接收方或可读金额。因此,支付证明必须在转账时主动构建。
支付证明就是这种构建产物。它将金额、发送方和接收方绑定为发送方日后可出示的凭据。
它所证明的内容
支付证明表明:特定接收方密钥的持有者确认在特定交易中从特定发送方收到了特定金额。
它不能证明货物已交付、交易已获得确认,或接收方在协议之外就是其所声称的身份。它是一份密码学收据,且你保存的副本是唯一的,因为链上没有任何内容可供重建它。
发送时请求支付证明
支付证明无法事后生成。接收方在交换的轮次中对证明消息进行签名,因此必须在转账开始时请求。
epic-wallet send --request_payment_proof --proof_address <recipient_proof_address> -d <dest> 1.5
接收方的证明地址是必填项。向Tor地址发送时,钱包可自动提供该地址;否则接收方需从epic-wallet address提供。
通过Owner API,在调用init_send_tx时在InitTxArgs上设置支付证明字段。检索和验证分别使用retrieve_payment_proof和verify_payment_proof。
据此选择传输方式
支付证明是V3 slate字段,而epicbox会将所有slate转换为V2,因此证明请求在epicbox发送中不会保留(impls/src/adapters/epicbox.rs:251)。需要支付证明的转账请通过其他任意传输方式路由;对比说明中有对照表。
验证
如果证明所指定的交易内核(kernel)不在链上,或接收方签名、发送方签名中有任何一个无法通过证明消息验证,verify_payment_proof将返回错误。调用成功即表示证明有效。
返回值是一对布尔值,表明调用钱包处于证明的哪一方,即(sender_mine, recipient_mine),当钱包自身的证明地址与对应方匹配时各为true(verify_payment_proof(),在libwallet/src/api_impl/owner.rs:1143处返回)。JSON-RPC签名见api/src/owner_rpc_s.rs:2161。