Доказательства платежа
На прозрачной цепочке доказать факт оплаты означает указать на транзакцию. В Epic не на что указывать, потому что в реестре хранятся слепые обязательства (commitments) без отправителя, получателя или читаемой суммы. Доказательство платежа поэтому необходимо формировать намеренно, в момент перевода.
Доказательство платежа — это такой конструкт. Оно связывает сумму, отправителя и получателя в свидетельство, которое отправитель может предъявить впоследствии.
Что устанавливает доказательство платежа
Доказательство платежа подтверждает, что владелец конкретного ключа получателя подтвердил получение конкретной суммы от конкретного отправителя в рамках определённой транзакции.
Оно не подтверждает факт доставки товара, подтверждение транзакции или то, что получатель является тем, за кого себя выдаёт вне протокола. Это криптографическая квитанция, и единственная её копия — та, которую вы сохраняете, поскольку ничто в цепочке не позволяет её восстановить.
Запросить при отправке
Доказательство нельзя сформировать постфактум. Получатель подписывает сообщение доказательства в рамках своего раунда обмена, поэтому запрос необходимо делать в момент начала перевода.
epic-wallet send --request_payment_proof --proof_address <recipient_proof_address> -d <dest> 1.5
Требуется адрес доказательства получателя. При отправке на Tor-адрес кошелёк может подставить его
автоматически; в противном случае получатель предоставляет его из epic-wallet address.
Через Owner API задайте поля доказательства платежа в InitTxArgs при вызове init_send_tx. Получение и верификация
— retrieve_payment_proof и verify_payment_proof.
Выбрать транспорт соответственно
Доказательство платежа является полем слейта (slate) V3, а epicbox конвертирует каждый слейт в V2,
поэтому запрос доказательства не сохраняется при отправке через epicbox (impls/src/adapters/epicbox.rs:251). Для перевода,
требующего доказательства, используйте любой другой транспорт; сравнение содержит
соответствующую таблицу.
Верификация
verify_payment_proof завершается ошибкой, если ядро (kernel) транзакции, указанное в доказательстве, отсутствует в
цепочке, либо если подпись получателя или подпись отправителя не проходит верификацию по сообщению
доказательства. Успешный вызов означает, что доказательство корректно.
Возвращаемое значение — пара булевых значений, указывающих, какой стороной доказательства является
вызывающий кошелёк: (sender_mine, recipient_mine), каждое из которых равно true, когда собственный адрес доказательства
кошелька совпадает с адресом соответствующей стороны (verify_payment_proof(), возвращается в libwallet/src/api_impl/owner.rs:1143). Сигнатура JSON-RPC
приведена в api/src/owner_rpc_s.rs:2161.