Блокчейн

Bitcoin: модель UTXO

Перевести деньги в банке - это изменить одну строку в базе данных: минус у отправителя, плюс у получателя. Satoshi Nakamoto отверг эту модель. В Bitcoin нет строки «баланс», нет счёта, нет базы с остатками. Вместо этого - набор неделимых цифровых купюр, каждая из которых существует ровно до момента траты. Эта модель называется UTXO, и она определяет всё: от структуры транзакций до стоимости комиссий и приватности пользователей.

  • **Bitcoin Core** хранит UTXO Set из ~180M записей в RAM каждой полной ноды для мгновенной проверки транзакций на double spend
  • **Cardano** - третья по капитализации блокчейн-платформа - использует расширенную UTXO-модель (eUTXO), добавляя к выходам данные смарт-контрактов
  • **Lightning Network** - протокол мгновенных Bitcoin-платежей - строится поверх UTXO: каждый платёжный канал - это UTXO, заблокированный multisig-скриптом

Предварительные знания

  • What is Blockchain

UTXO Set: кошелёк - это набор купюр

Когда ты открываешь банковское приложение и видишь «Баланс: 50 000 руб.», за кулисами стоит простая запись в базе данных - одно число. Ethereum работает так же: у каждого адреса есть поле `balance`. Это **account model**.

Bitcoin устроен принципиально иначе. В сети Bitcoin **нет такого понятия, как «баланс»**. Нет строки в таблице с твоим адресом и числом. Вместо этого существуют **UTXO - Unspent Transaction Outputs** (непотраченные выходы транзакций).

Представь физический кошелёк. В нём не абстрактное число «5000 руб.», а конкретные купюры: одна по 2000, две по 1000 и две по 500. Каждая купюра - отдельный объект с номиналом. **UTXO - это такие цифровые «купюры»**. Твой «баланс» - сумма всех UTXO, которые ты можешь потратить.

**UTXO Set** - это полный набор всех непотраченных выходов во всей сети Bitcoin. Каждая полная нода хранит эту коллекцию в памяти, потому что именно она определяет, кто сколько может потратить прямо сейчас. На момент 2025 года UTXO Set содержит **порядка 180 миллионов записей** и занимает около **7-8 ГБ** в RAM.

**Ключевое свойство UTXO:** каждый UTXO можно потратить только **целиком** - как купюру. Нельзя «оторвать кусочек» от UTXO на 1.2 BTC и потратить 0.5. Весь UTXO уходит во вход транзакции, а если надо - создаётся сдача.

У Alice есть три UTXO: 0.3 BTC, 0.5 BTC и 1.2 BTC. Какой у неё «баланс» в Bitcoin?

Inputs и Outputs: анатомия транзакции

Транзакция Bitcoin - это не «перевод N монет от A к B». Это **уничтожение старых UTXO и создание новых**. Каждая транзакция имеет **inputs** (входы) и **outputs** (выходы).

**Input** - ссылка на существующий UTXO, который тратится. Содержит `tx_id` и `output_index` предыдущей транзакции, плюс подпись владельца, доказывающую право на трату. **Output** - новый UTXO, который создаётся. Содержит сумму и `scriptPubKey` (условия, при которых этот UTXO можно потратить - обычно привязка к адресу получателя).

Критическое правило: **сумма inputs >= сумма outputs**. Разница между суммой входов и суммой выходов - это **transaction fee** (комиссия), которая достаётся майнеру. Нет специального поля «fee» в транзакции - fee вычисляется неявно.

**Double spend:** если UTXO уже потрачен в другой транзакции - нода отклонит транзакцию. Именно UTXO Set позволяет нодам быстро проверить: «этот выход ещё существует или уже потрачен?» - за O(1) по хеш-таблице.

Транзакция имеет один input (UTXO на 5.0 BTC) и два output: 3.0 BTC и 1.5 BTC. Какова комиссия майнеру?

Change: сдача в Bitcoin

Ты покупаешь кофе за 250 рублей. В кармане - одна купюра в 1000. Отдаёшь 1000, получаешь 750 сдачи. В Bitcoin всё работает точно так же.

Допустим, у Alice есть один UTXO на **10 BTC**, и она хочет отправить Bob **3 BTC**. UTXO нельзя «разорвать» - он тратится целиком. Поэтому Alice создаёт транзакцию с **двумя output**: 1. **3 BTC → Bob** (платёж) 2. **6.99 BTC → Alice** (сдача - **change output**) 3. Разница 0.01 BTC → майнеру (fee)

**Change output** - это новый UTXO, отправленный **обратно себе** на свой же адрес. Кошелёк обычно генерирует **новый адрес для сдачи** (change address), чтобы сторонний наблюдатель не мог сразу определить, какой output - платёж, а какой - сдача.

**Частая ошибка новичков:** забыть создать change output. Если Alice отправит транзакцию с input 10 BTC и одним output 3 BTC - оставшиеся **7 BTC уйдут как fee майнеру**. В 2013 году пользователь случайно заплатил 200 BTC комиссии за транзакцию на 1 BTC именно по этой причине.

**Dust UTXO:** если change слишком мал (например, 546 сатоши - текущий dust limit), его дешевле отдать как дополнительную комиссию, чем создавать отдельный output. Создание и последующая трата такого мелкого UTXO обойдётся дороже, чем сам UTXO.

Alice имеет UTXO на 10 BTC и создаёт транзакцию с одним output: 3 BTC для Bob. Что произойдёт с оставшимися 7 BTC?

Coin Selection: какие UTXO тратить?

У Alice 50 UTXO разного номинала - от 0.001 BTC до 2.0 BTC. Ей надо отправить 1.5 BTC. Какие UTXO использовать как inputs? Это задача **coin selection** - и она влияет на размер комиссии, приватность и количество пыли (dust) в UTXO Set.

Почему это важно? Размер комиссии в Bitcoin зависит от **размера транзакции в байтах**, а не от суммы перевода. Каждый input добавляет ~68 байт (для P2WPKH). Чем больше inputs, тем дороже транзакция. Поэтому выбор UTXO напрямую влияет на стоимость.

АлгоритмСтратегияПлюсыМинусы
Largest FirstБерём самые крупные UTXOМинимум inputs → дешёвая txКрупные UTXO всегда тратятся первыми, мелочь накапливается
Smallest FirstБерём самые мелкие UTXOКонсолидация пылиМного inputs → дорогая tx
Branch and Bound (BnB)Ищем комбинацию без сдачиНет change output → экономия ~30 байт + лучше privacyНе всегда находит решение
RandomСлучайный выборЛучшая приватностьНепредсказуемый размер tx

**Branch and Bound (BnB)** - алгоритм, используемый в Bitcoin Core с версии 0.17 (2018). Он перебирает комбинации UTXO, пытаясь найти набор, сумма которого **точно равна** сумме платежа + fee. Если такая комбинация существует, change output не нужен - экономия ~30 байт и улучшение приватности (наблюдателю сложнее определить, какой output - платёж, а какой - сдача, если сдачи нет).

**UTXO Consolidation** - техника, при которой в периоды низких комиссий пользователь объединяет множество мелких UTXO в один крупный. Создаётся транзакция с большим количеством inputs и одним output на свой же адрес. Это «уборка» кошелька - потом, когда комиссии высокие, можно тратить один крупный UTXO вместо десятков мелких.

Влияние coin selection на приватность

Как выбор UTXO раскрывает информацию о владельце

Допустим, Alice делает две покупки: кофе (0.001 BTC) и ноутбук (0.5 BTC). Если оба платежа используют UTXO из одного кошелька - аналитик блокчейна (Chainalysis, Elliptic) может связать эти транзакции и определить, что их совершил один человек. Bitcoin Core использует стратегию: разные группы UTXO для разных целей (automatic coin grouping). Некоторые privacy-кошельки (Wasabi, Samourai) позволяют вручную выбирать UTXO - это называется **coin control**.

**Масштаб проблемы:** глобальный UTXO Set растёт с каждым блоком. Каждая нода хранит его в RAM для быстрой валидации. Если UTXO Set станет слишком большим - порог входа для запуска полной ноды возрастёт. Поэтому консолидация и эффективный coin selection важны для здоровья всей сети.

Итоги

  • **UTXO (Unspent Transaction Output)** - цифровые «купюры» Bitcoin. Баланса нет - есть набор непотраченных выходов. Satoshi отверг банковскую модель «одна строка = один баланс» в пользу модели, где каждая «купюра» существует до момента траты
  • **Транзакция = уничтожение старых UTXO + создание новых.** Input ссылается на предыдущий UTXO и тратит его целиком. Output создаёт новый UTXO. Разница sum(inputs) - sum(outputs) = fee майнеру
  • **Change output** - сдача. UTXO нельзя потратить частично. Если UTXO = 10 BTC, а надо отправить 3 - создаётся change output на 6.99 BTC обратно себе. Забыть change = отдать разницу майнеру
  • **Coin selection** определяет стоимость и приватность транзакции. Bitcoin Core использует **Branch and Bound** - алгоритм, который ищет комбинацию UTXO без сдачи, экономя байты и затрудняя анализ блокчейна

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

UTXO-модель - основа всей транзакционной механики Bitcoin:

  • Введение в блокчейн — Базовые понятия блокчейна, на которых строится понимание UTXO
  • Bitcoin Script — ScriptPubKey в каждом UTXO задаёт условия траты - от простого P2PKH до мультиподписей и таймлоков
  • Ethereum: account model — Альтернативный подход к хранению состояния - с глобальным балансом вместо UTXO, что упрощает смарт-контракты, но меняет модель параллелизма

Вопросы для размышления

  • Почему Satoshi Nakamoto выбрал UTXO-модель вместо привычной account-модели? Какие свойства (приватность, параллелизм, валидация) она обеспечивает лучше?
  • Если бы все пользователи Bitcoin перестали делать UTXO consolidation, а каждая транзакция создавала мелкую сдачу - как бы это повлияло на UTXO Set и стоимость запуска полной ноды?
  • Представь, что ты создаёшь privacy-кошелёк. Какую стратегию coin selection ты бы выбрал и почему? Как бы ты решал конфликт между экономией на комиссиях и приватностью?

Связанные уроки

  • db-03-acid
Bitcoin: модель UTXO

0

1

Войти

У каждого Bitcoin-адреса есть баланс, который обновляется при каждой транзакции, как в банковской базе данных

Bitcoin не хранит балансы. Существует только множество UTXO - непотраченных выходов транзакций. «Баланс» адреса - это сумма всех UTXO, scriptPubKey которых соответствует этому адресу. Когда кошелёк показывает «1.5 BTC», он суммирует все UTXO, которые ты можешь потратить своим приватным ключом.

Интерфейсы кошельков намеренно скрывают UTXO-модель и показывают привычный «баланс». Из-за этого возникает иллюзия, что Bitcoin работает как банковский счёт. На уровне протокола никакого «баланса» нет - есть только входы и выходы транзакций.

Почему Branch and Bound (BnB) предпочтительнее простого Largest First при coin selection?