Блокчейн
Bitcoin: модель UTXO
Перевести деньги в банке - это изменить одну строку в базе данных: минус у отправителя, плюс у получателя. Satoshi Nakamoto отверг эту модель. В Bitcoin нет строки «баланс», нет счёта, нет базы с остатками. Вместо этого - набор неделимых цифровых купюр, каждая из которых существует ровно до момента траты. Эта модель называется UTXO, и она определяет всё: от структуры транзакций до стоимости комиссий и приватности пользователей.
- **Bitcoin Core** хранит UTXO Set из ~180M записей в RAM каждой полной ноды для мгновенной проверки транзакций на double spend
- **Cardano** - третья по капитализации блокчейн-платформа - использует расширенную UTXO-модель (eUTXO), добавляя к выходам данные смарт-контрактов
- **Lightning Network** - протокол мгновенных Bitcoin-платежей - строится поверх UTXO: каждый платёжный канал - это UTXO, заблокированный multisig-скриптом
Предварительные знания
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 ты бы выбрал и почему? Как бы ты решал конфликт между экономией на комиссиях и приватностью?