Change Address — адрес, который кошелёк использует для возврата сдачи при платеже. Биткоин расходует выбранные полученные суммы целиком. После вычета платежа и комиссии остаток обычно поступает в новый собственный выход кошелька. Деньги по-прежнему ваши, но теперь записаны в другом выходе, часто на новом адресе.
Алиса ранее получила 120 000 sat, наименьших единиц биткоина, и хочет заплатить 100 000 sat. В нашем примере её средства — один UTXO, то есть неизрасходованный выход предыдущей транзакции. Он становится входом платежа и тратится целиком. При комиссии 2 000 sat получатель получает 100 000 sat, а остаток 18 000 sat поступает в новый выход кошелька Алисы. Это похоже на оплату крупной купюрой со сдачей, но обе суммы распределяются в одной транзакции. Алиса не ждёт, пока получатель что-то вернёт. Кошелёк обычно сам выбирает адрес сдачи. Поэтому обозреватель может показывать два адреса назначения, хотя Алиса платила одному человеку. После подтверждения сдача — новый UTXO с собственным идентификатором выхода outpoint, а не неизрасходованный кусочек старого выхода. Outpoint объединяет идентификатор транзакции txid и позицию выхода в этой транзакции. В дальнейшем ею можно пользоваться как другими своими средствами. [1]
Скрипт scriptPubKey задаёт условия расходования выхода. Он не объясняет, зачем вы отправили деньги. Блок содержит суммы и скрипты scriptPubKey, а не метки плательщика, получателя или сдачи. Кошелёк распознаёт собственные выходы для сдачи по записям о выводе адресов; обозреватель блокчейна или аналитик лишь оценивает их назначение. Ни порядок выходов, ни предположение о том, что второй выход является сдачей, не надёжны. Транзакция может не иметь сдачи, содержать один выход для сдачи, несколько выходов под контролем отправителя или выходы нескольких участников. Поэтому обозначение change выражает связь выхода с кошельком. Это не отдельное свойство, записанное в протоколе. [1]
Эвристика — предположение по косвенным признакам. Payjoin и CoinJoin позволяют нескольким участникам совместно составить транзакцию, поэтому простые предположения могут оказаться неверными. BIP — документ технического предложения или стандарта. Распространённые эвристики считают сдачей, например, выход с тем же типом скрипта, что и у входов, неокруглённую сумму, новый адрес или сумму, соответствующую рассчитанному остатку. Для обычного платежа с двумя выходами такие предположения могут работать и связывать последующие траты, однако у каждого есть контрпримеры. BIP78 Payjoin намеренно нарушает как предположение об общем владельце входов, так и распознавание сдачи по типу скрипта или округлённой сумме. CoinJoin, пакетные платежи и переводы между собственными адресами добавляют неоднозначности. Оценка должна указывать степень неопределённости и подтверждающие её данные; сама эвристика не является доказательством, следующим из протокола, или доказательством юридического права собственности. [4] [14]
PSBT — пакет с проектом транзакции и дополнительными данными для обмена между кошельком и подписывающим устройством. Multisig требует разрешения по правилу с несколькими ключами. Данные о выводе ключей по BIP32 у выходов PSBT позволяют аппаратному подписывающему устройству или устройству, работающему офлайн, проверить предлагаемую сдачу. Устройство должно самостоятельно вывести соответствующий выход и проверить, что он соответствует тем же правилам кошелька. BIP174 описывает проверку как для одного ключа, так и для Multisig; при нескольких подписях недостаточно, чтобы выход содержал один локальный ключ. Злонамеренный координатор, составляющий транзакцию, может заменить сдачу собственным выходом или скрыть остаток в завышенной комиссии. Поэтому перед подписанием проверьте на доверенном экране выходы получателей, общую комиссию и каждый заявленный выход для сдачи. [5]
Для расчёта обозначим выбранные средства I, платежи получателям R, комиссию F, а сдачу C: C = I − R − F. RPC — программный интерфейс для передачи команд узлу. Coin Selection, то есть выбор UTXO, одновременно определяет входы, комиссию и возможную сдачу. Точно подобранная комбинация входов не требует выхода для сдачи. В остальных случаях кошелёк сравнивает остаток с затратами на создание выхода и его последующее расходование. RPC fundrawtransaction в Bitcoin Core может добавить не более одного выхода для сдачи и возвращает его позицию. При отправке всех выбранных средств получателям сдача намеренно не создаётся. Ручной выбор с помощью Coin Control меняет используемые входы, а значит и размер сдачи, но каждый выбранный вход расходуется целиком. Поэтому проверяйте итоговые входы, суммы получателей, комиссию и сдачу, а не только сумму платежа. [9] [10] [13]
HD Wallet выводит множество ключей и адресов из одного начального секрета. Путь вывода определяет, какой адрес вычислить; BIP обозначает документ технического предложения или стандарта. HD Wallet обычно выводит адреса для получения средств из внешней ветви, а адреса для сдачи — из внутренней. BIP44 обозначает change=0 как внешнюю ветвь, а change=1 — как внутреннюю. Для учётной записи с нативным SegWit этому соответствуют, например, пути m/84'/0'/0'/0/i и m/84'/0'/0'/1/i. Это соглашение между реализациями кошельков, а не правило консенсуса; кошелёк на основе дескрипторов может использовать другие правила. Новый внутренний адрес ограничивает повторное использование адресов. Вернуть сдачу на исходный адрес допустимо, но это связывает историю платежей и может упростить её сопоставление с конкретным человеком. [2] [3]
Обозначение xpub ниже — расширенный публичный ключ: он позволяет выводить дочерние публичные данные, но сам не может подписывать платежи. Seed — секретное начальное значение для вывода ключей. Дескриптор выхода описывает тип скрипта, ключи, сведения об их происхождении и правило вывода следующих адресов. Пара wpkh([fingerprint/84h/0h/0h]xpub…/0/*) и …/1/* может описывать ветвь получения и ветвь сдачи; BIP389 позволяет выразить несколько ветвей общей записью. Флаг internal указывает кошельку, какой дескриптор использовать для сдачи, но не меняет сам результирующий скрипт. При восстановлении одного seed может быть недостаточно, чтобы найти все средства. Без сведений об учётной записи, типе скрипта и способе вывода адресов кошелёк может пропустить действительные выходы для сдачи, хотя необходимые ключи по-прежнему существуют. [6] [7] [8]
Dust означает очень маленький выход, который оценивается по правилам узла для ретрансляции транзакций. Соответствующий порог рассчитывается на основе типа выхода, оценки размера данных, необходимых для его последующего расходования, и настраиваемой ставки dust relay feerate. Это не единое универсальное число satoshi и не запрет, установленный консенсусом. Кошелёк может отказаться от сдачи даже выше этого порога, если создание выхода и его последующее расходование обойдутся дороже возвращаемой суммы. Этот порог экономической целесообразности зависит от текущей ставки комиссии, оценки будущей ставки и размера скрипта. Отказ от создания сдачи увеличивает текущую комиссию; слишком маленький выход, в свою очередь, впоследствии может оказаться неоправданно дорогим для расходования. [12]
Replace-by-fee (RBF) заменяет неподтверждённую транзакцию другой транзакцией с более высокой комиссией. RPC bumpfee в Bitcoin Core может покрыть разницу, уменьшив сдачу, добавив входы или создав новый выход для сдачи. Если сдача опустится ниже порога, установленного правилами узла или экономической целесообразностью, она может исчезнуть. Расходование неподтверждённой сдачи создаёт дочернюю транзакцию, зависящую от исходной; замена исходной транзакции может сделать эту связь недействительной. Команда bumpfee откажет в замене, если кошелёк или mempool узла, то есть его набор неподтверждённых транзакций, уже содержит транзакцию, расходующую выход исходного платежа. CPFP (Child Pays for Parent) создаёт дочернюю транзакцию вместо замены исходной. Она тратит выход исходного платежа под контролем кошелька и платит более высокую комиссию. Это повышает общую ставку комиссии двух транзакций и побуждает майнеров подтвердить их вместе. Пока вопрос замен не решён, не считайте неподтверждённый txid или идентификатор выхода outpoint окончательными. [11] [15]
При восстановлении нужно найти адреса получения и сдачи. Для обычного кошелька с одной подписью обычно достаточно правильной Seed Phrase (слова восстановления), использованной passphrase, если она была, и совместимых настроек. Seed — секретное начальное значение для вывода ключей; passphrase — дополнительный пароль, если вы решили его использовать. Поэтому не каждому пользователю нужно вручную записывать дескрипторы. Но при собственных настройках или Multisig, где разрешение определяется несколькими ключами, одних слов может не хватить. Сохраните и описание кошелька: сеть, учётную запись, тип скрипта, правила вывода адресов, а для Multisig — расширенные публичные ключи xpub всех участников, их порядок и необходимое число подписей. Если нет ветви /1/*, восстановление может пропустить сдачу и показать меньший баланс. Проверяйте известные адреса и выходы обеих ветвей, диапазон вывода и начало сканирования истории. Тест должен также подтвердить, что можно подготовить и правильно подписать платёж. [2] [6] [7]
Для полной картины прочитайте эту статью вместе с Биткоин-адрес, UTXO, Coin Control, Кошелёк, Coin Selection, HD Wallet. На эту статью также ссылаются Биткоин-адрес, Coin Control, Приватность в Bitcoin, Псевдонимность.