Coin Selection — это выбор средств, из которых кошелёк составляет транзакцию Bitcoin. Баланс не является единым остатком, из которого можно просто списать часть: он складывается из отдельных неизрасходованных выходов прежних транзакций, называемых UTXO. Кошелёк должен выбрать достаточно средств для платежа и комиссии. Обычно он делает это автоматически; ручной выбор называется Coin Control. Сеть проверяет действительность готовой транзакции, но не требует от всех кошельков одного способа выбора.
Анна хочет заплатить 60000 sat. Платёж готовит её кошелёк — приложение или устройство, позволяющее получать и отправлять биткоины. Сокращение sat означает сатоши, наименьшую единицу, в которой записываются суммы в биткоин-транзакциях. У неё есть UTXO стоимостью 100000 sat. Как и с банкнотой, нельзя просто списать с него часть: вход новой транзакции тратит этот выход целиком. Транзакция создаёт выход на 60000 sat для продавца и при комиссии 1000 sat ещё один, на 39000 sat, для Анны. Второй выход — это сдача, или change. Она не является последующим возвратом от продавца, а создаётся внутри собственной транзакции Анны. Комиссия равна разнице между суммой входов и суммой всех выходов. [1] [7]
Кошелёк может оплатить одну покупку разными UTXO. Но больше входов обычно означает больше данных и, следовательно, более высокую комиссию при той же ставке. Комиссия не является процентом от переводимой суммы. Она зависит от виртуального размера транзакции, измеряемого в vB — виртуальных байтах, учитывающих разный вес её частей. Допустим, расходование UTXO на 10000 sat добавляет вход размером примерно 68 vB. При ставке 10 sat/vB этот вход стоит 680 sat и вносит 9320 sat в оставшуюся часть платежа. Это его эффективная стоимость. Другие части транзакции по-прежнему требуют собственных затрат; фактический размер входа зависит от условий траты в скрипте и данных подписи. Скрипт — короткая программа, описывающая условия траты. При обычном платеже кошелёк с помощью приватного ключа, секретного числового значения, создаёт цифровую подпись — разрешение потратить средства, которое можно проверить. [2] [3] [7]
Анна могла получить много небольших сумм. Их объединение в более крупный собственный выход называется консолидацией. В будущем ей может понадобиться меньше входов, но объединение требует комиссии уже сегодня и публично связывает использованные выходы. Поэтому автоматически объединять всё — не лучший подход. Bitcoin Core также сравнивает затраты с помощью waste metric: оценки, учитывающей разницу между стоимостью входов сейчас и при предполагаемой долгосрочной ставке, плюс стоимость создания и последующей траты сдачи либо избыток, отданный в комиссию. Долгосрочная ставка — рабочее допущение, а не прогноз. Такая оценка измеряет затраты, не приватность. [2] [6]
Анна пометила одно поступление как зарплату, а другое как подарок. Совместная трата даёт наблюдателю блокчейна подсказку, что они связаны. Это не доказывает, что все входы принадлежат одному человеку: транзакции могут создаваться несколькими участниками вместе. Coin Control позволяет выбрать конкретные UTXO, а метки помогают помнить их происхождение. Метка — заметка в кошельке, а не сообщение в блокчейне. BIP 329 описывает перенос таких заметок и сведений о том, считает ли кошелёк определённый выход доступным для траты. Это локальная настройка кошелька, которая не меняет правил сети Bitcoin. Сам формат средства не выбирает. Экспорт меток может раскрыть чувствительные связи, и даже платёж без сдачи не гарантирует анонимность. [4] [6]
Не весь показанный баланс обязательно доступен сразу. Кошелёк может намеренно исключить часть выходов; другие ждут подтверждения или выполнения условий траты. Выбор также должен учитывать ограничения размера и веса транзакции. При трате неподтверждённого поступления новый платёж зависит от прежней транзакции, создавшей его; в этом контексте её называют предком. Для подтверждения всей цепочки может потребоваться дополнительная комиссия. RPC, интерфейс управления Bitcoin Core 29.0 из программ, предоставляет в walletcreatefundedpsbt параметр include_unsafe. Он разрешает включать рискованные неподтверждённые входы. Если исходную транзакцию заменят так, что нужный выход перестанет существовать, зависимый платёж не сможет подтвердиться. Само по себе временное удаление исходной транзакции из памяти узла не меняет её действительности. [3] [5]
Как кошелёк перебирает варианты? Branch-and-bound, или BnB, пробует сочетания входов и отбрасывает ветви поиска, которые не могут дать подходящий результат. Цель — составить платёж без отдельного выхода сдачи. Точное совпадение не обязательно: допустимый диапазон включает избыток вплоть до стоимости создания и последующей траты сдачи. Этот избыток становится комиссией, а не остаётся где-то спрятанным в кошельке. Поэтому платёж без сдачи не обязательно самый дешёвый. Число попыток поиска ограничено: он может не найти существующее решение или лучшую из всех комбинаций. [2]
Bitcoin Core 29.0 сравнивает варианты от BnB, Knapsack и Single Random Draw (SRD). Это разные способы поиска подходящего набора входов. CoinGrinder подключается, когда эффективная ставка более чем втрое превышает долгосрочную; этот метод ищет набор с небольшим весом и сдачей. Полученные варианты сравниваются по объяснённой выше waste metric. Если пользователь решает вычесть комиссию из сумм для получателей, BnB пропускается. Это описание конкретной версии, а не обязательная процедура для всех кошельков и не утверждение о новейшем выпуске. [3]
Для обычного платежа не нужно знать программные параметры. Но перед подписью нужно понимать получателя, сумму, общую комиссию и собственную сдачу. Для опытных пользователей: walletcreatefundedpsbt в Bitcoin Core 29.0 позволяет задать входы через txid, идентификатор исходной транзакции, и vout, порядковый номер её выхода. add_inputs определяет, может ли кошелёк добавить другие входы. Обратите внимание на единицы: fee_rate использует sat/vB, а feeRate — BTC/kvB, то есть биткоины за 1000 виртуальных байтов. Результат — PSBT, формат для передачи подготовленной транзакции на подпись. Само создание PSBT ничего не отправляет и не подтверждает платёж. Ни ручной выбор, ни этот формат не гарантируют правильность получателя или действительность неподтверждённых входов. [5]
Для полной картины прочитайте эту статью вместе с UTXO, Coin Control, Change Address, Fee Rate, PSBT, Приватность в Bitcoin. На эту статью также ссылаются Watch-only Wallet, Change Address, Inventing Bitcoin.