vByte, сокращённо vB, — единица виртуального размера транзакции Bitcoin. Разные части её данных учитываются по-разному. Кошелёк использует этот размер для расчёта комиссии: более крупная транзакция или более высокая выбранная ставка означает большую итоговую комиссию.
Анна хочет отправить Bitcoin, и кошелёк предлагает ставку 2 sat/vB. Sat означает сатоши, наименьшую единицу биткоина; vB обозначает виртуальный размер транзакции. Если готовая транзакция занимает 127 vB, комиссия по такой ставке составит 254 sat. Ставка, также называемая Fee Rate, — не полная стоимость перевода. Пример объясняет расчёт, а не рекомендует ставку для сегодняшней сети. Сама уплата комиссии также не гарантирует определённого времени подтверждения. [3] [5] [7]
Кошелёк не тратит баланс как одно число. Он использует ранее полученные и ещё не потраченные выходы транзакций — UTXO. Каждый используемый выход добавляет вход; часто создаётся и выход, возвращающий сдачу в ваш кошелёк. Поэтому объединение множества мелких поступлений может потребовать больше данных, чем отправка большей суммы из одного поступления. Комиссия равна сумме значений входов минус сумма значений выходов. Цифровая подпись подтверждает право потратить выбранные средства. До создания подписи кошелёк оценивает размер; фактическую ставку определяют окончательная комиссия и окончательный размер. [6] [7]
Байт — обычная единица объёма данных. Но при расчёте комиссии Bitcoin не все байты учитываются с одинаковым весом. SegWit отделяет часть данных, доказывающих право тратить средства, включая подписи. Эта часть называется witness. Байт базовых данных добавляет к весу транзакции 4 WU, а байт, добавленный форматом записи с witness, — 1 WU. WU означает единицу веса. Вспомогательные поля marker и flag этой записи учитываются с таким же меньшим весом. Подписи по-прежнему проверяются: меньший вес не разрешает пропускать проверки. [1] [2]
Сериализация — запись транзакции в виде точно заданной последовательности байтов, которую компьютеры могут передавать и читать. Обозначим B размер без witness, а T — полный размер. BIP 141 определяет вес формулой W = 3 × B + T. Базовые данные уже входят в T, поэтому формула учитывает их четыре раза, а добавленные witness-данные — один. Это не измерение денежной стоимости платежа или времени работы процессора. [1]
Виртуальный размер — вес, делённый на 4 и округлённый вверх до целого числа: vsize = ceil(W / 4). ceil означает округление вверх. Поэтому транзакция весом 401 WU занимает 101 vB. Округляется результат для транзакции целиком. Если сначала округлить каждый вход отдельно, а потом сложить результаты, размер может получиться другим. [1]
Возьмём условные размеры B = 100 и T = 208 байтов. Формула даёт W = 508 WU и vsize = 127 vB — размер из начального примера комиссии. Но полная транзакция не уменьшилась: её полный вариант записи всё ещё передаёт 208 байтов. Виртуальный размер — взвешенная мера для учёта места в блоках и расчёта комиссий, а не сжатие файла. [1] [5]
Обозреватель блоков — приложение для поиска транзакций и блоков определённой сети. Если в транзакции нет witness-данных, B = T, а значит W = 4 × T. Тогда её базовый виртуальный размер совпадает с полным размером в байтах. Поэтому обозреватель иногда показывает одинаковые числа в двух полях размера, а иногда разные. Для SegWit нельзя просто поделить все переданные байты на четыре: разное взвешивание относится к определённым частям данных. [1] [2]
Узел — программа, которая проверяет транзакции и блоки и обменивается данными с другими участниками сети. Bitcoin Core v29.0 использует для некоторых рабочих правил скорректированный размер ceil(max(W, sigop_cost × bytes_per_sigop) / 4). sigop_cost — взвешенная стоимость операций с подписями; bytes_per_sigop — параметр этих правил. max выбирает большее значение. Необычно требовательная проверка может увеличить размер, учитываемый такими правилами. Это не меняет вес по BIP 141 или правила допустимости блоков. Речь о детали указанной версии, а не о дополнительном обязательном расчёте для обычного платежа. [1] [4]
Платёж может тратить выход другой, ещё не подтверждённой транзакции. При оценке такого пакета можно делить соответствующую сумму комиссий на сумму нужных виртуальных размеров. Простое среднее отдельных ставок не учитывало бы различия в размерах. Bitcoin Core v29.0 также учитывает местные изменения приоритета и не считает повторно транзакции, уже находящиеся в его очереди ожидания. Высокая общая ставка не отменяет остальные правила и не гарантирует принятия или подтверждения. [4] [8]
Перед отправкой сопоставьте ставку с общей комиссией и оценкой размера. После создания транзакции decoderawtransaction может показать фактические поля size, vsize и weight: байты, виртуальный размер и вес. Для обычного платежа не нужно считать формулы вручную. Не путайте vByte с похожим названием CompactSize: это кодирование целого числа переменной длины. Оно не является другим названием vByte или способом уменьшить транзакцию. [5] [6]
Для полной картины прочитайте эту статью вместе с Block Weight, Compact Blocks, Block Propagation, Initial Block Download, Bitcoin, SegWit. На эту статью также ссылаются Compact Blocks, Pruned Node, Block Weight, Package Relay.