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

Глоссарий / Справочник разработчика

PaymentDetails

Что такое PaymentDetails?
PaymentDetails является внутренним сообщением BIP70, которое действительно описывало платеж: на какие выходы платить, сколько, когда истекает срок действия запроса и куда отправлять подписанную транзакцию.

Определено в BIP-70.

PaymentDetails представлял собой ту часть, которую продавец действительно подписывал, а внешний конверт нес только сертификат, который это подтверждал. В нем было семь полей: имя сети со значением по умолчанию main, список выходов, обязательная отметка времени, необязательный срок действия, примечание, URL обратного вызова и непрозрачный блок merchant_data. Сейчас URI BIP21 вместе со страницей оформления заказа выполняет ту же задачу без подписи и без сервера.

Как это работает

Статус: исторический. Bitcoin Core удалил BIP70 в версии 0.20.0 3 июня 2020 года, и у PaymentDetails нет действующей реализации. Здесь он описан потому, что имена полей до сих пор встречаются в старых руководствах по интеграции и в справочнике для разработчиков bitcoin.org.

Структуру передавал Protocol Buffers, а не JSON. Этот выбор имел значение по причине, на которой стоит задержаться: продавец сериализовал PaymentDetails в строку байтов и помещал эти точные байты внутрь внешнего PaymentRequest как непрозрачное поле, а не как вложенное сообщение. Подпись покрывала строку байтов, поэтому ни одна библиотека, повторно кодирующая те же поля в другом порядке, не могла сделать недействительной действительную подпись.

Семь полей делились на инструкции и учетные сведения.

  • network, строка со значением по умолчанию "main", где "test" является единственным другим определенным значением.
  • outputs, повторяющийся список, каждый элемент которого связывает сумму в сатоши со скриптом. Более одного выхода допускалось, и продавцы использовали это, чтобы разделить один платеж клиента между горячим кошельком и холодным хранением, не прося клиента отправлять дважды.
  • time, обязательная отметка времени unix, фиксирующая, когда был создан запрос.
  • expires, необязательная отметка времени unix, после которой кошелек должен был отказать. Именно это поле придавало BIP70 сходство с карточным терминалом, потому что продавец мог назвать цену в фиатной валюте и гарантировать ее на фиксированный период.
  • memo, примечание в UTF-8, отображаемое плательщику.
  • payment_url, адрес, по которому кошелек отправлял свое сообщение Payment после отправки транзакции в сеть.
  • merchant_data, непрозрачные байты, возвращаемые без изменений, чтобы продавец мог сопоставить платеж с корзиной покупок.

Обязательными были только time и скрипты выходов. Все остальное продавец мог опустить, и большинство так и делало.

Где это встречается

Идея, стоящая за PaymentDetails, пережила само сообщение, и это полезно заметить.

Сейчас истечение срока цены обрабатывается на бирже, а не в вашем кошельке. При покупке через экран мгновенной покупки вы получаете котировку курса с обратным отсчетом рядом; если отсчет закончится, котировка пересчитывается по новой цене. Это expires, реализованное заново в веб-приложении, и оно защищает продавца от волатильности точно так же. Сопоставление ордеров в книге ордеров биржи делает ту же работу иначе: оно вообще никогда не называет фиксированную цену.

Эквивалентом всего сообщения на стороне продавца служит запись счета в программном обеспечении для оформления заказов. BTCPay Server и подобные инструменты создают URI BIP21, держат его открытым заданное число минут и сверяют входящую транзакцию с внутренним идентификатором заказа, что как раз и было назначением merchant_data.

PaymentDetails vs квитанция

PaymentDetails был запросом; квитанцией в BIP70 было сообщение PaymentACK, которое продавец возвращал после. Одно описывало, что должно произойти, другое подтверждало, что продавец увидел, что это произошло. Ни то, ни другое не было фактом блокчейна, и в этом заключается ограничение, которое люди недооценивали: подписанное подтверждение от продавца доказывает, что сервер продавца что-то сказал, а не что транзакция подтверждена. Платеж в биткоине закрывают подтверждения, а не квитанции.

Не путать с

Часто задаваемые вопросы

Почему BIP70 хранил PaymentDetails как необработанные байты, а не как вложенное сообщение?

Чтобы подпись покрывала точную строку байтов. Protocol Buffers допускает повторное кодирование одних и тех же полей разными допустимыми способами, и подпись поверх сериализованного блока означала, что ни одна библиотека не могла случайно нарушить действительную подпись, повторно сериализовав его.

Связанные термины

Еще в разделе «Справочник разработчика»

Читать эту страницу на английском