Перейти к основному содержимому

Доказательства платежа

На прозрачной цепочке доказать факт оплаты означает указать на транзакцию. В 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.

Далее