Неизразходван изход (UTXO)
UTXO в биткойн е неизразходван изход на трансакция. Вижте как UTXO множеството помага на нодовете да проверяват трансакции и да броят баланса на адрес.
От Dimitar Zurnov · Обновено на 4 ноември 2026
Адаптирано от Learn Me a Bitcoin на Greg Walker.
UTXO е неизразходван изход: изход, който никоя по-късна трансакция още не е похарчила. UTXO множеството е съвкупността от всички такива. Нодовете проверяват всяка нова трансакция спрямо това множество. Портфейлите и експлорърите събират UTXO-тата, заключени за даден адрес, за да покажат баланса му.
Какво прави един изход неизразходван?
Всяка трансакция създава изходи, а всеки изход може да се използва като вход в по-късна трансакция. Когато изходът се използва, той се харчи цял. Рестото се връща към изпращача като нов изход.
Ако си представите всички трансакции като един голям граф, UTXO-тата са свободните краища. Всеки от тях е част от биткойн, която още може да се похарчи.
Защо нодовете следят UTXO множеството?
Нодът се нуждае от множеството за две задачи: проверка на новите трансакции и броене на баланси. И двете зависят от това кои изходи още не са похарчени.
Как нодът проверява трансакция?
Когато пристигне трансакция, нодът чете всеки вход. Входът назовава изход чрез outpoint, който е идентификаторът на трансакцията, последван от индекса на изхода, vout. Изходът трябва да е в UTXO множеството. Ако го няма, трансакцията се отхвърля, защото изходът е бил похарчен или изобщо не е съществувал.
Наличието в множеството е само половината от проверката. Нодът проверява и дали данните за отключване на входа изпълняват заключването на изхода, например валиден подпис. UTXO множеството отговаря на въпроса „този изход налице ли е?“, а скриптовете отговарят на „този ли може да го похарчи?“.
Как се брои балансът на адрес?
Съберете UTXO-тата, заключени за адреса, и получавате баланса му. Монетите не стоят в адресите. Те са заключени в изходи, а адресът е заключването, сложено върху изхода. Два различни изхода могат да принадлежат на един и същ адрес, и всеки от тях се брои в баланса.
Адресната страница в нашия експлорър, на /address/<address>, показва неизразходваните му изходи. Балансът е тяхната сума. Всеки валиден адрес работи, включително адресите, които никога не са били използвани. Те показват празно множество.
Къде се пази UTXO множеството?
В Bitcoin Core множеството се пази в подпапката chainstate в папката с данни на нода. Базата е LevelDB, хранилище ключ-стойност. Всеки запис има:
- Ключ: outpoint-ът, тоест идентификаторът на трансакцията и индексът на изхода, който определя един изход еднозначно.
- Стойност: височината на блока, който е създал изхода, флаг, който казва дали той идва от coinbase трансакция, сумата в сатоши и заключващия скрипт.
Когато пристигне блок, нодът премахва всеки изход, който блокът харчи, и добавя всеки нов изход. Така множеството винаги отразява веригата в сегашния ѝ вид.
Каква е ролята на RAM?
Базата е на диск, но нодът държи част от нея в паметта като кеш. Опцията -dbcache задава колко памет може да заема този кеш, в MiB. От Bitcoin Core 31.0 стойността по подразбиране е 1,024 MiB на машини с поне 4 GiB RAM, а на по-малките е 450 MiB. По-големият кеш позволява на нода да проверява входящите трансакции, без да чете диска толкова често, и така валидирането е по-бързо.
Как се измерва UTXO множеството?
Командата gettxoutsetinfo чете цялото множество и показва обобщени стойности. Изпълнена на нод, тя показва:
txouts: броят неизразходвани изходи.transactions: броят трансакции, които още имат неизразходвани изходи.total_amount: стойността на всички неизразходвани изходи в BTC.disk_size: колко място на диска заема множеството.
Командата сканира цялото множество, така че може да отнеме няколко секунди или повече. Не е нещо, което да пускате в цикъл.
Стойността total_amount е близка до монетите в обръщение, но не е точна. Монетите, които са загубени завинаги, остават неизразходвани, така че остават в множеството. Изходите, които никога не могат да се похарчат, като тези, чийто скрипт започва с OP_RETURN, изобщо не се добавят в множеството.
Защо coinbase изходите чакат 100 блока?
Първата трансакция във всеки блок, coinbase, плаща наградата за блок и таксите на майнъра. Изходите ѝ не могат да се харчат, докато не са получили 100 потвърждения. Това правило задава COINBASE_MATURITY в кода за консенсус на Bitcoin Core.
Множеството UTXO записва флага за coinbase точно заради това. Така нодът може да види дали изходът е достатъчно стар, за да се харчи, без да търси блока, който го е създал.
Може ли изход да се похарчи преди потвърждение?
Да, но с уговорка. Трансакция може да харчи изход от трансакция, която още е в мемпула, чакалнята за непотвърдени трансакции. Нодът проверява такова харчене спрямо UTXO множеството и мемпула заедно. Така работи child pays for parent (CPFP): нова трансакция харчи непотвърден изход, за да вкара и предишната в блок.
Обобщение
UTXO е изход, който не е похарчен. Нодовете пазят всички UTXO-та в UTXO множеството, ползват го, за да отхвърлят двойните харчения, и събират UTXO-тата, заключени за адрес, за да получат баланса му. Множеството е на диск и е частично кеширано в паметта, така че нодът може бързо да проверява трансакции. Входовете на трансакцията харчат UTXO-та, а това, което изходите не претендират, става такса, за която разказва страницата за таксата.
Източници
- Консенсусните константи на Bitcoin Core, включително
COINBASE_MATURITY. - Настройките за кеша в kernel на Bitcoin Core, които определят размерите на кеша на базата.
- Бележките към версия 31.0 на Bitcoin Core повишават стойността по подразбиране на
-dbcacheдо 1,024 MiB на машини с поне 4 GiB RAM.
В този раздел: Трансакции
Целият курс „Биткойн от нулата“
Нещо не изглежда наред? Кажете ни