Глоссарий / Справочник разработчика
PP amount
- Что такое PP amount?
- PP amount представляло собой поле в сатоши внутри выходной записи BIP70; оно устанавливалось в ноль, когда продавец хотел, чтобы сумму отправки выбрал плательщик.
Определено в BIP-70.
Ошибки в платежах происходят именно из единиц измерения. Сумма в BIP70 была 64-битным числом сатоши, тогда как параметр amount в URI по BIP21 задается десятичным значением в биткоинах, поэтому один и тот же платеж записывается как 250000 в первом случае и как 0,0025 во втором. Всем, кто переводит деньги между системами, стоит проверить, какую единицу ожидает поле, прежде чем доверять итоговой сумме.
Как это работает
Статус: исторический. Поле относилось к BIP70, который Bitcoin Core объявил устаревшим в версии 0.19 и удалил в версии 0.20.0 3 июня 2020 года.
Выходную запись в сообщении PaymentDetails составляли два поля: скрипт, указывающий, куда уходят деньги, и сумма, указывающая сколько. Сумма была беззнаковым 64-битным целым числом сатоши со значением по умолчанию ноль, и у нуля был конкретный смысл. Он не означал «не платить ничего». Он означал, что продавец не называет сумму и кошелек должен спросить клиента, именно так работали страницы для пожертвований.
В одном запросе могло быть несколько выходных записей, у каждой своя сумма, и платящий кошелек должен был закрыть все их одной транзакцией. Это полезнее, чем кажется. Продавец мог направить часть продажи сразу в холодное хранение, часть в горячий кошелек для возвратов, а часть партнеру, и при этом клиенту не нужно было делать три платежа или знать о таком разделении.
Диапазон никогда не был ограничением. Беззнаковое 64-битное целое число достигает максимума 18 446 744 073 709 551 615 сатоши, примерно в 8800 раз больше тех 2 100 000 000 000 000 сатоши, которые когда-либо будут существовать. Интересная граница была на другом конце. Сумма ниже порога пыли создавала выходную запись, которую сеть не передавала бы, и политика Bitcoin Core устанавливает этот порог на уровне 546 сатоши для устаревшей выходной записи pay-to-public-key-hash и 294 сатоши для одноключевой выходной записи segwit.
Где это встречается
Сегодня поле amount из BIP70 не реализует никто, но путаница с единицами измерения, стоящая за ним, полностью жива.
Три спецификации, три единицы измерения. URI по BIP21 указывают суммы в биткоинах. BIP70 указывал их в сатоши. Счета BOLT11 в Lightning идут еще мельче и указывают миллисатоши, тысячную часть сатоши. Интерфейсы кошельков добавляют сверху настройку отображения, так что один и тот же баланс выглядит как 0,00250000 или как 250 000 в зависимости от настройки, которую вы задали один раз и забыли.
Практическая цена такой ошибки измеряется реальными деньгами. Оценки комиссии приходят в сатоши за виртуальный байт, поэтому трата segwit с одной входной и двумя выходными записями размером около 141 vbytes стоит 705 сатоши при 5 sat/vB. Если прочитать это число как биткоины, вы решите, что обычная транзакция стоит больше, чем большинство людей тратят на комиссии за год.
Это исправляют две привычки. Выберите одну единицу измерения в настройках кошелька и оставьте ее там, чтобы число ожидаемых цифр никогда не менялось. И читайте обозначение единицы на любом экране вывода средств раньше, чем само число, потому что минимальные суммы на бирже, комиссии сети и ваш баланс на одной и той же странице часто указаны в разных единицах.
PP amount vs сумма в URI биткоина
Сумма в BIP70 была целым числом сатоши; сумма в BIP21 является десятичным значением в биткоинах, и коэффициент между ними составляет 100 000 000. В этом вся разница, и ее достаточно, чтобы иметь значение. Поле, содержащее 0,0025 в одном формате, содержит 250000 в другом, и программное обеспечение, переходящее между ними без пересчета, дает ошибку в восемь порядков величины в ту сторону, в которую она склоняется. Победил современный формат, поэтому число, которое вы встречаете сегодня в платежной ссылке, задано в биткоинах, если только что-то явно не указывает sats.