Utxo bitcoin что это
Что такое UTXO и зачем он нужен в Биткоине?
UTXO (Unspent Transaction Output) расшифровывается как вывод неизрасходованных транзакций. Простыми словами, это остатки криптовалюты, которые вы получаете с каждой транзакции. Для более подробного объяснения нужно разобраться в самом принципе совершения переводов монет. Для примера возьмем самый распространённый проект — Биткоин.
Пример UTXO
В своём Биткоин-кошельке вы видите баланс. К примеру, 100 BTC. И хотя в интерфейсе отображается один баланс, он на самом деле состоит сразу из нескольких UTXO. У вас может быть четыре UTXO по 25 биткоинов или десять UTXO по 10 биткоинов — разницы никакой.
В один прекрасный момент вы решаете потратить 35 биткоинов — купить новенькую машину, к примеру. Однако в вашем кошельке несколько UTXO эквивалентами 15, 17, 28 и 40 биткоинов. Что же делать?
Выводы неизрасходованных транзакций невозможно поделить сразу же. С вашего кошелька уходит UTXO в размере 40 биткоинов. Сеть формирует два новых вывода: один в размере 35 BTC (он отправляется дилеру в счёт платы за машину) и второй на 5 BTC (он отправляется вам обратно на кошелёк).
Можно было бы также потратить UTXO в размере 17 и 28 биткоинов, тогда вы получили бы в качестве «сдачи» 10 биткоинов. Транзакция может состоять из комбинации разных UTXO. Правда, пользователь не может контролировать, какие именно выводы будут отправлены.
Что насчёт комиссий?
При переводе монет также учитываются затраты на комиссии майнерам. Вот как это выглядит в виде формулы:
Новый UTXO = сумма UTXO в транзакции — размер транзакции — комиссия
Разберём по этому принципу последний пример. А для простоты расчётов комиссию приравняем к одному биткоину:
Новый UTXO = (17 + 18) — 35 — 1 = 9 BTC
Потенциальные проблемы
Применения принципа выводов значительно упрощает расчёты на блокчейне. Вместо того чтобы хранить в блоках информацию о каждой индивидуальной транзакции, мы просто отслеживаем монеты, которые не были потрачены (UTXO).
Напомним, каждый биткоин можно потратить всего один раз. Другими словами, вы не можете переслать одну монету на несколько разных адресов, бесконечно её копируя. Особую роль в этом играют UTXO, ведь именно по информации о выводах сеть криптовалюты отслеживает движение всех монет.
Правда, ноды Биткоина хранят информацию об UTXO в оперативной памяти, поэтому её размер не должен превышать определённых лимитов. С каждым годом стоимость обслуживания полной ноды BTC растёт, а объём информации об UTXO тоже увеличивается. Всё это может привести к централизации сети криптовалюты, ведь в обозримом будущем только богатые смогут себе позволить поддерживать один из узлов системы.
Решение проблемы простое — хранить в оперативной памяти лишь часть UTXO, а остальное отправлять на SSD. Конечно, это повлияет на скорость подтверждения транзакций, однако разработчики Биткоина постоянно ищут новые решения оптимизации процесса перевода монет. Наконец, огромную роль в оптимизации сыграла интеграция протокола SegWit: с его помощью программистам удалось уменьшить затраты на хранение UTXO на 75 процентов.
Ещё больше интересного ищите в нашем крипточате ходлеров!
Что такое UTXO?
UTXO (unspent transaction output) — выход неизрасходованных транзакций.. В основном, это сумма или оставшееся изменение криптовалюты, которое вы получаете от каждой транзакции. В качестве входных данных для транзакции могут использоваться только неизрасходованные выходные данные. При выполнении транзакции входные данные удаляются, а выходные данные создаются в виде новых UTXOs, которые затем могут быть использованы в будущих транзакциях.
Например, если у вас есть UTXO, который определяет, что у вас есть 10 монет, и вы хотите купить что-то, что стоит 2 монеты, вы сделаете транзакцию, которая потратит весь Ваш баланс UTXO, отправив 2 монеты другому человеку и 8 монет обратно себе. Как только эта транзакция будет завершена, UTXO будет создан как для отправителя, так и для получателя. В общем случае UTXO определяет, сколько пользователь получил обратно и сколько пользователь может потратить. Сумма, которую пользователь получит обратно, будет добавлена к его балансу счета. Таким образом, наиболее вероятно, что у каждого пользователя будет более одного UTXOs, и сумма всех неизрасходованных монет в каждом UTXO будет равна общему балансу счета пользователя.
· Простота. Благодаря UTXO, на которые имеются уникальные ссылки и которые полностью расходуются при затратах, не дает возможности для повторного воспроизведения транзакции.
· Транзакции могут быть проверены параллельно. Две транзакции не могут повлиять на один и тот же UTXO. Это связано с состоянием транзакций UTXO без сохранения состояния. Транзакции не относятся ни к какому входу за пределами потребляемых UTXO и соответствующих сигнатур.
· В модели UTXO поощряется сохранение конфиденциальности. Пользователям рекомендуется создавать новый адрес для каждой входящей транзакции, включая изменение адреса. Используя каждый раз новый адрес, трудно однозначно связать разные монеты с одним владельцем.
· Особенности UI/UX сложны. Пользователи, как правило, думают о счетах, когда они хранят свои деньги. Поставщик кошелька должен управлять потенциальным набором адресов и суммировать соответствующие остатки. Для выполнения этого способа сохранения конфиденциальности может потребоваться запуск локального узла.
· Возможности смарт-контрактов в модели UTXO весьма ограничены. Каждый UTXO имеет критерии расходов, которые диктуют условия расходов. Это может потребовать подписи от нескольких сторон, но существует мало возможностей ссылаться на внешние государства, такие как оракулы.
Что такое ошибка UTXO?
Пыль — это крошечное количество монет в дробных значениях и обычно меньше сетевого сбора/комисси за перевод. Протокол биткоина иногда генерирует крошечные суммы монет, когда пользователи отправляют и получают BTC. Другие блокчейны UTXO (Unspent Transaction Output), форки биткоина, например, Litecoin (LTC), Dogecoin (DOGE), Bitcoin Cash (BCH), также генерируют такую же крошечную сумму.
Пыль имеет 3 негативных последствия:
Пользователям невыгодно тратить средства, которые требуют большей сетевой комиссии для подтверждения транзакции
Она загрязняет экосистему, перегружая сеть нерентабельными транзакциями (с точки зрения хранения данных и времени транзакция малой стоимости требует хранения пространства данных, аналогичного транзакции большой стоимости)
Она снижает уровень конфиденциальности, если вы объединяете пыль из разных кошельков в один, это раскрывает ваши идентификаторы кошельков, и посторонние могут догадаться, что все кошельки принадлежат одному человеку.
При попытке отправить BTC/LTC/DOGE/BCH на De-Fi-кошелек Crypto.com может возникнуть ошибка пыли UTXO:
Транзакция отклоняется сетью, потому что она построена с использованием пыли UTXO, требуя большей комиссии, чтобы потратить фактическую сумму. Такой подход позволяет предотвратить спам сети транзакциями, замедляющими работу сети и создающими расходы для тех, кто управляет серверами BTC/LTC/DOGE/BCH.
Транзакция генерирует остатки пыли, что может затруднить их использование (см. предыдущий пункт)
Как можно разрешить ошибку пыли UTXO?
Не отправляйте транзакции с малой стоимостью с более высокой суммой комиссии. Поскольку сеть попытается создать UTXO из транзакции с маленькой суммой, транзакция будет неудачной.
Перед отправкой средств попробуйте добавить в кошелек больше средств. Более крупная сумма транзакции гарантирует приём транзакции сетью.
Выберите более низкий уровень комиссии на экране подтверждения отправки
Убедитесь в том, что в кошельке осталась значительная сумма, чтобы сеть не посчитала транзакцию пылью при следующей попытке расхода остатка баланса
Bitcoin in a nutshell — Transaction
Если говорить об уже существующей банковской системе, то транзакция внутри какого-нибудь Альфа-банка — это просто редактирование таблицы балансов, где уменьшается число напротив одного имени и увеличивается напротив другого. В случае с межбанковскими переводами подключаются некоторые сторонние организации, например SWIFT, но, по сути, все работает примерно так же.
Table of content
Introduction
Как я уже сказал выше, в Bitcoin не существует никакой единой структуры, в которой каждому адресу был бы сопоставлен его текущий баланс. Вместо этого используется тот самый пресловутый блокчейн, то есть хранятся вообще все транзакции. Для простоты пока что можете считать, что это сообщения вида
А значит, если пройтись по всему блокчейну, то можно посчитать, сколько монет «принадлежит» конкретному адресу.
Inputs & outputs
Реальная транзакция в сети Bitcoin, на самом деле, немного сложнее описанной выше. В действительности, это некоторая громоздкая структура, главными составляющими которой являются входы (inputs) и выходы (outputs).
Inputs — это транзакции, на которые вы «ссылаетесь». Представим, что на ваш адрес X когда-то было отправлено три транзакции:
Если вам нужно потратить, например, 45 BTC, то вы можете сослаться на транзакцию 888888, или сразу на две транзакции: 123456 и 6453795. При желании вы можете даже сослаться на все три транзакции, правда непонятно зачем.
Outputs — дословно «выходы». Пока что можете считать, что это адреса (хотя это не так), на которые в результате исполнения транзакции будут «отправлены» средства. Выходов также может быть несколько, и каждому из них указывается своя сумма.
На картинке ниже создается новая транзакция C, которая ссылается на два выхода — A и B. В результате на входе у транзакции получается 0.008 BTC, которые потом разделяются на два выхода — на первый адрес отправляется 0.003 BTC, а на второй 0.004 BTC.
Возможность указать сразу несколько выходов — это очень важная фича, потому что транзакцию (а если точнее — ее выход) можно использовать как вход только один раз и только целиком. То есть если у вас есть входящая транзакция на 10 BTC, а вам нужно потратить 8 из них в каком-нибудь Старбаксе, вы просто создаете транзакцию с одним входом и двумя выходами: на 8 BTC в магазин и на 2 BTC обратно на свой адрес. Если же вы создадите транзакцию, в которой сумма выходов меньше суммы входов (как на картинке), то разница отправляется на адрес майнера, записавшего вашу транзакцию в блок.
Именно эта разница между суммой входов и суммой выходов и называется transaction fee, то есть комиссия за транзакцию. Она является вторым по важности источником дохода для майнеров и именно от нее зависит время включения транзакции в блокчейн. Это связано с тем, что у каждого майнера существует некоторый пул непроверенных транзакций, которые претендуют на попадание в блок, и, как правило, майнер просто сортирует их по убыванию комиссии, тем самым максимизируя свою прибыль. Поэтому чем больше комиссия, тем выше вы окажетесь в очереди и тем быстрее пройдет ваш платеж.
На картинке ниже вы можете видеть фоторобот майнера, которому пришла транзакция с комиссией в 135.000$.
Как только новая транзакция занесена в блокчейн, ее выходы могут быть использованы в качестве входов. Для таких, пока еще непотраченных выходов, существует специальное название — UTXO (unspent transaction output). Как я уже говорил, каждый выход может быть использован в качестве входа только один раз, поэтому на практике интерес представляют именно непотраченные выходы, а уже использованные хранятся скорее как дань безопасности системы.
BTW под UTXO часто подразумевают весь массив непотраченных выходов, хотя воспитанные молодые люди должны писать UTXO pool ну или в крайнем случае UTXO set.
Возвращаясь к началу статьи, теперь вам должно быть понятно, что для подсчета баланса адреса не нужно перебирать весь блокчейн, а достаточно обойтись только перебором UTXO pool, что, очевидно, быстрее.
Structure
Общий вид транзакции описан в официальной спецификации протокола, здесь же я приведу живой пример, взятый из блога Ken Shirriff.
BTW хэш транзакции считается крайне просто — берете всю транзакцию в виде последовательности байт (в примере выше получается строка вида 010000000148. 00), два раза считаете от нее хэш SHA-256 и представляете результат в little endian форме.
previous output index — ссылаемся не на саму транзакцию, хэш которой указан в previous output hash, а на один из ее выходов. В этом параметре мы и указываем, какой конкретно выход нас интересует, нумерация начинается с нуля. Кстати, в тексте я часто буду говорить именно о «ссылке на транзакцию», но это только ради выразительности языка.
block lock time — этот параметр довольно редко используется на практике. Если он не равен 0 и меньше 500 млн, то это номер блока, начиная с которого данной транзакцией можно воспользоваться в качестве входа. Так как в среднем блоки появляются раз в 10 минут, то несложно прикинуть время, когда транзакция «откроется».
Если lock time больше 500 млн, то он означает UNIX timestamp, начиная с которого транзакция станет доступна. В нашем случае там стоит 0, то есть транзакция доступна сразу.
sequence — эта фича больше не используется, почитать про нее можно здесь.
Параметры со словом script в названии существенно сложнее, о них будет рассказано ниже.
Script
Скорее всего вы уже слышали, что в сети Bitcoin существует механизм, основанный на криптостойких алгоритмах + паре приватный / публичный ключ, позволяющий создать систему, в которой только владелец приватного ключа может воспользоваться монетами, ассоциированными с адресом, полученным из этого ключа. Сейчас я покажу, как это реализуется «под капотом».
Начнем с того, что внутри Bitcoin существует свой собственный язык программирования, названный Script. Вот что о нем пишет Bitcoin wiki:
Bitcoin uses a scripting system for transactions. Forth-like, Script is simple, stack-based, and processed from left to right. It is purposefully not Turing-complete, with no loops.
Суть в том, что язык прост как пробка, stack-based и Тьюринг-неполный. Вот пример типичной программы:
Каждая инструкция называется opcode — всего их порядка 80, так что язык действительно довольно примитивен. На картинке ниже изображен процесс исполнения программы 2 3 OP_ADD 5 OP_EQUAL :
Lock & unlock transaction
Вернемся к языку чуть позже, а сначала давайте разберемся, зачем он здесь вообще нужен.
Для этого вспоминаем структуру транзакции и два параметра: scriptSig и scriptPubKey. В отличие от других параметров, назначение этих двух вообще не очевидно, и имхо это самое сложное, что есть в Bitcoin.
Я видел много попыток объяснить (как правило неудачных), что же из себя представляют скрипты в Bitcoin и как нужно их воспринимать на интуитивном уровне. Тем не менее я рискну и попробую привести еще одну аналогию. Для этого давайте рассмотрим завещание, вроде такого:
1.000.000$ переходят к Алисе только после того, как ей исполнится 18 лет
В этом случае, сам текст завещания — это некоторое условие, при котором можно воспользоваться деньгами (читай можно воспользоваться транзакцией на 1.000.000$ как входом), а ксерокопия паспорта в 19 лет — это доказательство того, что условие выполнено и самое время получить деньги.
Именно для того, чтобы задать условие, при котором можно будет потратить выход, и для возможности подтвердить то, что условие выполнено и нужен SCRIPT, приватные / публичные ключи и прочие сложности.
В случае Bitcoin, завещание — это locking script, который указывается в транзакции внутри поля pk_script. Его еще часто называют scriptPubKey из-за того, что чаще всего это программа, содержащая публичный ключ или адрес, хотя, вообще говоря, он может не иметь ничего общего с криптографией.
Своего рода «доказательство» того, что условие из locking script выполнено, называется unlocking script, пишется в поле signature script и часто называется scriptSig, догадайтесь почему.
Multiplication-based script
Pay to Public Key Hash (P2PKH)
P2PKH используется, наверное, в 99 транзакциях из 100, так что стоит понимать, как он работает. Вот его общий вид:
Этот скрипт известен с самого появления Bitcoin и, возможно, придуман самим Сатоши. Именно он выполняет ту задачу, о которой я писал выше: сделать так, чтобы только владелец приватного ключа смог воспользоваться монетами, ассоциированными с адресом, полученным из этого ключа.
На пальцах это выглядит следующим образом: пусть вашему другу B принадлежит приватный ключ P. Он получает из него публичный ключ K, адрес A и сообщает адрес вам. Далее вы отправляете на адрес A 1 BTC и в поле locking script пишите примерно следующее:
Только тот, кто владеет приватным ключом для адреса A, сможет потратить эту транзакцию. В качестве доказательства запишите в unlocking script, во-первых, публичный ключ K, а во-вторых подпись свой транзакции приватным ключом P.
Когда B решит использовать вашу транзакцию в качестве входа, то он создаст свою, например, на 0.5 BTC, а в поле unlocking script вставит подпись своей транзакции приватным ключом P — и сам публичный ключ K —
P2P storage
Одно из самых интересных свойств Bitcoin, да и технологии блокчейн вообще, — это неизменяемость и гипотетическая «вечность» всего, что туда попадает. Неудивительно, что со временем нашлись люди, захотевшие использовать это в своих целях. И первое, что пришло им в голову — попытаться сохранить в блокчейн какие-нибудь сторонние данные и получить P2P дропбокс.
Я думаю вы уже поняли, как это делается. Берем строку Make America great again и просто записываем ее в locking script. Это все еще будет вполне корректный скрипт, другое дело, что к нему не получится придумать такой unlocking script, чтобы разблокировать средства. Но если вы отправите на выход с таким сриптом, условно говоря, 0.0000001 BTC, то в принципе и не жалко. Единственное ограничение — это размер вашей транзакции. Считайте, что она не может быть больше 100 КБ, хотя в реальности там все немного сложнее, можете почитать здесь.
Понятное дело, что такое положение дел по душе не всем. У Bitcoin и так большие проблемы с масштабируемостью, а тут еще и блокчейн, без того немаленький, начинает засоряться всякими левыми данными. Более того, помним, что такие транзакции нельзя потратить, а значит они навсегда останутся в UTXO pool, что ничуть не лучше.
OP_RETURN is a script opcode used to mark a transaction output as invalid. Since the data after OP_RETURN are irrelevant to Bitcoin payments, arbitrary data can be added into the output after an OP_RETURN — Bitcoin wiki
Спойлер — их нет, если вы конечно не убежденный альтруист.
Что такое UTXO (Unspent Transaction Output)?
UTXO расшифровывается как Unspent Transaction (TX) Output. Фактически, это означает количество оставшейся криптовалютной «мелочи», которую вы получаете в качестве сдачи с каждой транзакции. Не так давно мы разбирали что такое «селекция монет», но решили более детально рассмотреть этот момент. Для более подробного объяснения придется сначала рассмотреть, как происходит типичная крипто транзакция. Используем в качестве примера Bitcoin, так как это самая популярная криптовалюта, использующая UTXO.
Пример UTXO транзакции
Когда вы проверяете свой кошелек Bitcoin, вы видите свой баланс. Для примера давайте предположим, что у вас 100 Биткоинов. Хотя вы видите только сумму на счете, ваш баланс состоит из нескольких UTXO. У вас может быть четыре UTXO по 25 BTC, два UTXO по 50 или, например, сет UTXO из 37, 18, 40 и 5 Биткоинов. Стоимость каждого UTXO не имеет значения, но их сумма в нашем случае всегда будет составлять 100 BTC.
Продолжая наш пример, давайте предположим, что мы отправились покупать новый автомобиль. Отбросив стереотипный вариант Lamborghini, вы останавливаете свой выбор на Porche за 35 Биткоинов. Однако в вашем кошельке есть UTXO ценностью только в 15, 17, 28 и 40 BTC и нет «купюры» номиналом в 35 Биткоинов. UTXO невозможно разделить, поэтому вы просто не сможете отдать ровно 35 Биткоинов.
Вместо этого вы отдадите 40 BTC, на месте которых сеть создаст два новых UTXO ценностью в 35 и 5 Bitcoin. Автодилер получит 35 BTC, а вы получите свою сдачу в размере 5 BTC.
Также вы можете потратить свои UTXO в 17 и 28 Биткоинов, получив в качестве сдачи 10 Биткоинов. Транзакция может использовать любую комбинацию UTXO и у вас нет возможности повлиять на ее выбор.
Точно так же расплачиваясь, вы можете совместить несколько UTXO в более крупной транзакции, уменьшив их количество в сети.
А что насчет комиссии за транзакцию?
Комиссия также включается в транзакцию и вычитается из получаемого в качестве сдачи UTXO. Уравнение выглядит примерно так:
Новое UTXO = (сумма UTXO в транзакции) – (значение транзакции) – (комиссия за транзакцию)
Добавим в наш недавний пример комиссию в один Bitcoin:
Новое UTXO = (17+28) – (35) – (1) = 9 BTC
Важность UTXO и потенциальные проблемы
Введение UTXO сильно упрощает методы учета на блокчейне. Вместо того, чтобы вынужденно отслеживать и хранить каждую транзакцию, система отслеживает только неизрасходованные коины, известные нам как UTXO.
Таким образом, каждый коин в экосистеме Bitcoin может быть потрачен только единожды. Биткоины, в данный момент находящиеся на кошельках, еще не были использованы по двум причинам:
UTXO выполняют важную роль в предотвращении атаки двойного расходования, а также не позволяют пользователям тратить коины, которые не существуют. Ноды в сети записывают и поддерживают базу данных, содержащую каждое UTXO (т.е. неизрасходованный коин), доступное к расходованию. Если вы попытаетесь прислать транзакцию с коином, которого нет в базе, ноды отклонят эту транзакцию.
Потенциальные проблемы с хранением
Ноды хранят базу данных UTXO в RAM, поэтому важно соблюдать разумный объем данных. По мере того, как он растет, стоимость работы заполненной ноды тоже увеличивается. Если обслуживание заполненной ноды станет слишком дорогим, мы будем наблюдать дальнейшую централизацию сети Bitcoin в руках более состоятельного меньшинства, которое сможет себе позволить использовать эти ноды.
Риск централизации – один из главных аргументов против увеличения размера блока Bitcoin. Разработчик Bitcoin Гевин Андерсен хорошо описал это в своей статье «UTXO uh-oh…»:
«Один мегабайтовый блок содержит около 100 млн 500-байтовых транзакций в год. Если каждый блок увеличит UTXO на 500 байт, это прибавит около 50 гигабайт в год».
Размер блока в один мегабайт ограничивает верхний лимит, до которого каждый год может расти база данных UTXO. Гевин продолжил:
«Разрешив проводить больше транзакций без каких либо других изменений, мы, скорее всего, ускорим рост UTXO, делая весь процесс более затратным и ускоряя полное заполнение каждой ноды».
Дабы не вырывать из контекста слова Андерсена, стоит отметить: в своей статье он выступает все-таки за увеличение размера блока. Он утверждает, что влияние объема UTXO не такое существенное, как считают многие. А учитывая сложность масштабирования второго уровня, необходимо ввести увеличенные блоки в ближайшее время, пока эти решения еще будут актуальны в долгосрочной перспективе.
Решения
К счастью, существует несколько решений потенциальной проблемы с хранением. Во-первых, нодам не надо хранить всю базу данных UTXO в RAM. Часть данных можно хранить на более дешевом диске HDD или SSD. Хотя это замедлит время валидации каждой ноды, особых проблем не возникнет, если это время будет составлять меньше 10 минут.
Вдобавок, разработчики Bitcoin постоянно улучшают механизмы транзакций, для оптимизации базы данных UTXO.
Наконец, Segregated Witness (Segwit) и похожие решения масштабирования косвенно замедляют рост базы данных UTXO. Следующая информация взята напрямик из документации Bitcoin Core:
«Segwit улучшает ситуацию за счет создания подписных данных, которые не влияют на объем UTXO, и стоят на 75% меньше. Это, в свою очередь, побуждает пользователей отдавать предпочтение транзакциям, минимизирующим влияние на UTXO из-за меньшей комиссии на них. А разработчиков это заставляет работать над смарт-контрактами и новыми функциями, которые бы дальше минимизировали влияние на UTXO».
Заключение: альтернативы UTXO
Мы постоянно использовали Bitcoin в нашем сегодняшнем примере, однако существует немало других использующих UTXO криптовалют типа Bitcoin Cash, Litecoin, Komodo и тому подобных коинов.
Также существует много криптовалют, использующих другие механизмы учета. Например, Ethereum использует модель транзакции, основанную на учетной записи. В общих чертах, этот механизм обеспечивает лучшую экономию пространства и упрощает код, однако вместе с этим проигрывает в плане приватности транзакций и ведет к потенциальным проблемам с масштабируемостью.
Если десять крипторазработчиков спросить о самом лучшем методе учета, скорее всего, каждый из них даст разный ответ. Для всего криптосообщества это до сих пор горячо обсуждаемый вопрос, который все еще не имеет конкретного решения. И судя по сложности вопроса, идеального решения никогда и не будет.
Дисклеймер: не рассматривайте эту статью как рекомендацию по инвестиции. Проведите тщательный анализ, прежде чем инвестировать в какую-либо криптовалюту.
Для торговли на рынке криптовалют Хриплый Биток рекомендует биржу Exmo!