Содержание статьи
- Транзакции: входы и выходы (UTXO)
- Откуда сеть узнает, какие монеты можно потратить?
- Адрес в Bitcoin
- Legacy-адреса: первый массовый формат
- SegWit: адреса нового поколения
- Taproot: новый подход к расходованию средств
- Почему перевод 10 долларов может стоить дороже перевода на миллион?
- Почему комиссия меняется со временем?
- Почему биткоины не приходят мгновенно?
- Вместо заключения
Деньги всегда кто‑то выпускал, учитывал и контролировал: государство, банк или платежная система. Так было до 2008 года, когда появился биткоин, который вполне можно рассматривать не только в качестве самой популярной на нашей планете криптовалюты, но еще и как смелый инженерный эксперимент, переживший многочисленные кризисы, запреты, взломы бирж и «похороны» в прессе. Биткоин традиционно считают своего рода эталоном в мире современной крипты — все остальные проекты, появившиеся позже, в той или иной степени ориентировались именно на него.
При этом вокруг биткоина существует немало заблуждений. Многие представляют его как некую виртуальную «монету» или набор счетов, подобных банковским, однако в действительности его устройство намного интереснее. Чтобы глубже понять принципы работы криптовалют в целом, давай посмотрим на биткоин, как на сложную, но интересную инженерную конструкцию.
info
Это четвертая статья из цикла, посвященного техническим основам устройства криптовалют. Предыдущая носит название «Крипта с нуля. Выясняем, как работает майнинг».
Транзакции: входы и выходы (UTXO)
Если ты живешь не на каком‑нибудь заброшенном острове посреди Тихого океана, ты постоянно пользуешься банковскими приложениями и прекрасно знаешь, как они работают: авторизовался в программе и видишь на экране смартфона баланс всех своих счетов и активных карт. Если нужно, переводишь часть денег другому человеку по номеру телефона или реквизитам карты, либо оплачиваешь какую‑то услугу, а может быть, купленный товар. Это называется «балансовой моделью», и именно на ней построено большинство банковских платежных систем: банк хранит информацию о том, сколько денег находится на каждом счете, а перевод сводится к изменению двух чисел в базе данных — у отправителя сумма уменьшается, у получателя увеличивается.
Криптовалютный кошелек с точки зрения пользователя устроен практически так же, вот только здесь есть один важный технический нюанс. Несмотря на то, что кошельки тоже показывают привычный баланс, сама сеть никаких балансов не хранит. В блокчейне нет записи вида «у Маши 3 BTC, у Васи 1 BTC», вместо этого система оперирует транзакциями и их результатами. Каждый полученный перевод создает новый фрагмент ценности, которым впоследствии можно распорядиться в другой транзакции.
Такой подход основан на модели UTXO (Unspent Transaction Output) — неизрасходованных выходов транзакций. На первый взгляд это выглядит как незначительная техническая деталь, но именно на ней построена вся экономика биткоина, и именно это отличает его от традиционных платежных систем. Когда кошелек показывает пользователю баланс, он фактически каждый раз вычисляет его самостоятельно, суммируя все UTXO, которыми владелец может распоряжаться в данный момент времени.
Каждая транзакция в Bitcoin состоит из двух основных частей: входов (inputs) и выходов (outputs). Входы указывают, какие ранее созданные UTXO будут потрачены, а выходы — кому будут принадлежать новые UTXO после завершения перевода. Допустим, некто получил два перевода: 0,3 BTC и 0,7 BTC. В блокчейне это будут два независимых UTXO. Если затем пользователь захочет отправить кому‑то 0,8 BTC, кошельку придется использовать оба этих выхода в качестве входов новой транзакции. После этого старые UTXO будут считаться потраченными и больше не смогут использоваться в качестве входов новых транзакций, а вместо них появятся новые.

Здесь возникает важная особенность. Транзакция должна потратить входы целиком, вернее, UTXO, включенные во входы, тратятся полностью. Если на вход подаются UTXO суммарной стоимостью 1 BTC, а другому пользователю сети нужно отправить только 0,8 BTC, оставшиеся средства нельзя просто оставить «на входе». Поэтому обычно создается дополнительный выход, возвращающий остаток отправителю. Его называют change output — выход со сдачей. В результате одна типичная транзакция в сети биткоин выглядит не как простой перевод денег от одного пользователя другому, а как операция по уничтожению старых UTXO и созданию новых. Именно поэтому в блокчейне невозможно найти баланс какого‑либо адреса в готовом виде: его приходится каждый раз вычислять по совокупности еще не потраченных выходов.
Эту технологию можно наглядно объяснить на простом примере: положим, кто‑то заплатил тебе за работу купюрой номиналом 1000 рублей, а тебе нужно отдать другому человеку долг в 700 рублей. Ты не можешь просто оторвать от тысячной купюры нужный кусок, вместо этого ты отдашь кредитору купюру целиком и попросишь сдачу 300 рублей. Таким образом, у тебя образуется две новых транзакции: 700 (долг) и 300 (сдача, change output), причем эти 300 рублей вернутся тебе обратно и затем могут быть использованы в следующей транзакции. То есть, сдача становится новым UTXO, принадлежащим отправителю 1000 рублей, и этот UTXO потом можно использовать в будущих денежных операциях.

Разумеется, реальные транзакции в сети биткоин часто оказываются сложнее нашего примера. Одна транзакция может использовать сразу несколько входов и создавать несколько выходов для разных получателей. Однако базовый принцип остается неизменным: старые UTXO расходуются целиком, а взамен появляются новые. Кроме того, в примере с тысячерублевой купюрой мы не учли еще один важный элемент любой транзакции — комиссию сети.
На практике сумма всех выходов обычно оказывается немного меньше суммы входов, а разница между ними и образует комиссию за перевод. Пользователи банковских систем привыкли воспринимать комиссию, как некий дискретный платеж, который пользователь отправляет непосредственно банку или платежной системе за выполнение транзакции. В биткоине механика немного другая.
Когда ты формируешь транзакцию, ты не указываешь комиссию как отдельное поле или отдельный выход майнеру. Ты просто создаешь на выходе сумму немного меньше, чем сумма входа, а разница между входами и выходами нигде явно не записана как "комиссия". Майнер же при сборке блока сам считает эти «невостребованные» разницы по всем транзакциям и присваивает их себе через специальную транзакцию, которая называется coinbase. Иными словами, комиссия — это эмерджентное свойство, возникающее из разницы сумм, а не направленный платёж какой‑то конкретной величины.
Безусловно, ты можешь потребовать вернуть тебе всю сдачу целиком до последнего цента, тогда разница между входами и выходами будет равна нулю. Это абсолютно легальная с точки зрения протокола транзакция. Но в этом случае узлы сети (nodes) могут отказаться её принимать в мемпул (очередь неподтвержденных транзакций). У большинства реализаций блокчейна есть настройка минимальной relay fee — по умолчанию транзакции с нулевой или крайне низкой комиссией за байт многие ноды просто не будут пересылать дальше по сети. Кроме того, майнеры не обязаны включать такую транзакцию в блок. Майнер выбирает, какие транзакции из мемпула положить в блок, и делает это, как правило, ориентируясь на комиссию за байт (sat/vByte). Транзакция с нулевой комиссией невыгодна, и при заполненных блоках она будет вытеснена более "вкусными" транзакциями. В конечном итоге такая транзакция может зависнуть в мемпуле надолго — иногда на дни, недели или вообще не попасть в блок, если её просто вычистят из мемпула по тайм‑ауту.
Вот как может, например, выглядеть транзакция в блокчейне биткоин — мы получили два входящих перевода на суммы 0.3 и 0.7 BTC, перевели другому пользователю 0.8 BTC, получили сдачу 0.1998 BTC и заплатили за всю эту историю комиссию в размере 0.0002 BTC. Фактически, мы получили 1 BTC и потратили 1 BTC, при этом у нас образовался неизрасходованный остаток в размере 0.1998 BTC, который можно потратить в следующий раз.
Inputs:
0.3 BTC (UTXO #1)
0.7 BTC (UTXO #2)
Outputs:
0.8 BTC -> получатель
0.1998 BTC -> сдача отправителю
Комиссия:
0.0002 BTC
Откуда сеть узнает, какие монеты можно потратить?
Как ты уже понял, вход транзакции не содержит сами монеты и даже не хранит полную информацию о предыдущем переводе. Он лишь ссылается на конкретный выход более ранней транзакции, который нужно потратить. Такая ссылка состоит из идентификатора предыдущей транзакции (txid) и номера выхода внутри нее (vout). Здесь возникает главный вопрос: откуда сеть знает, что человек, создающий новую транзакцию, действительно имеет право потратить этот выход?
Ответ спрятан в самом устройстве UTXO. Каждый выход транзакции создается не просто с указанием суммы, а с определенным условием расходования. В простейшем случае это условие выглядит так: «этот выход может потратить только тот, кто предъявит цифровую подпись, соответствующую определенному открытому ключу».
Когда владелец средств создает новую транзакцию, он не просто указывает ссылку на старый выход. Он добавляет данные, которые позволяют проверить выполнение этого условия: цифровую подпись, созданную с помощью своего собственного закрытого ключа. Получается своеобразная пара: предыдущий выход содержит правило, а новый вход содержит доказательство того, что это правило выполнено. За это отвечает специальный Locking script (скрипт блокировки, также называемый scriptPubKey) —фрагмент кода в выходе (output) транзакции, который задает условия, при которых эти средства можно потратить. Если условия не выполнены — средства остаются недоступными.

Если подпись корректна, сеть принимает этот вход и считает выход потраченным. Если подпись не подходит или указанный выход уже был использован ранее, транзакция будет отклонена. Важно понимать: сама ссылка на UTXO не дает право распоряжаться средствами. Она лишь указывает, какой именно выход пытается потратить пользователь. Право на расходование подтверждается только корректной цифровой подписью, которая в классических транзакциях хранится в специальном поле scriptSig, а в транзакциях SegWit (это обновление протокола Bitcoin, внедренное в августе 2017 года) вынесена в отдельную структуру witness.
Проще говоря, каждый вход говорит сети: «я хочу использовать вот этот конкретный выход, созданный вот такой транзакцией». Узлы сети находят указанную запись в блокчейне, проверяют, что этот выход действительно существует и еще не был потрачен ранее, а затем проверяют, имеет ли отправитель право им распоряжаться.
Именно поэтому в Bitcoin фактически передаются не сами монеты, а право потратить ранее созданный выход. Новая транзакция закрывает старые обязательства и создает новые — уже для следующих владельцев. При этом существует несколько вариантов условий, при которых можно потратить выход, и они определяются адресом получателя каждого конкретного выхода, вернее, типом адреса, на который отправлены средства.
Адрес в Bitcoin
Адрес в сети Bitcoin — это не привычный нам номер счета, а удобный способ передать условия, при которых созданный выход можно будет потратить. Разные форматы адресов фактически определяют разные типы таких условий. Когда ты запускаешь на смартфоне или компьютере программу, управляющую твоим криптовалютным кошельком, ты видишь свой текущий баланс и один или несколько адресов, на которые можно получать переводы. Визуально это действительно напоминает банковский счет — достаточно передать другому человеку этот адрес, представляющий собой строку символов, и он сможет отправить тебе средства.
Однако внутри сети адрес — это не идентификатор счета, на котором лежат монеты, и не запись в базе данных вида «этому адресу принадлежит столько‑то биткоинов» (таких записей в блокчейне вообще нет). Как я уже упоминал чуть раньше, когда пользователь отправляет кому‑то биткоины, в блокчейн попадает не сам адрес получателя, а выход транзакции (output) с определенным сценарием проверки. Вместо того чтобы передавать друг другу длинный набор технических данных, пользователь отправляет короткую строку определенного формата. Кошелек преобразует ее в соответствующий сценарий блокировки под названием locking script, который затем записывается в транзакцию. Вот адреса как раз и соответствуют разным типам сценариев расходования средств.
Legacy-адреса: первый массовый формат
Самыми ранними и до сих пор узнаваемыми являются адреса формата Legacy. Они начинаются с цифры 1. Вот, например, адрес первого блока Bitcoin, так называемый «генезис‑адрес», содержащий награду за блок, созданный самим Сатоши Накамото:
1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa
На техническом уровне такие адреса соответствуют схеме P2PKH (Pay-to-Public-Key-Hash). При создании платежа средства блокируются с условием: потратить их сможет тот, кто предъявит цифровую подпись для соответствующего публичного ключа.
Схема работает следующим образом: из открытого ключа с помощью криптографических операций получается хеш, этот хеш кодируется в удобный для пользователя формат и становится адресом. Когда другой человек отправляет биткоины на этот адрес, он фактически создает UTXO, связанный с этим хешем. При последующей трате получатель предоставляет открытый ключ и подпись. Сеть проверяет, соответствует ли открытый ключ адресу и действительно ли подпись создана владельцем закрытого ключа.
Недостаток Legacy-адресов заключается в том, что они используют старый формат транзакций, где подобные подписи занимают заметное место внутри самой транзакции. Это увеличивает размер переводов и, соответственно, комиссию при высокой нагрузке сети.
SegWit: адреса нового поколения
В 2017 году в сети биткоин было активировано крупное обновление протокола Segregated Witness (SegWit). Одной из его целей было изменение структуры транзакций: данные подписей были отделены от основной части транзакции и вынесены в специальную область witness.
Для пользователей это, среди прочего, проявилось в виде нового формата адресов, начинающихся с bc1:
bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kygt080
Такие адреса обычно соответствуют схемам P2WPKH (Pay-to-Witness-Public-Key-Hash). Они позволяют уменьшить размер транзакций по сравнению с Legacy и тем самым снизить комиссию. Притом сама логика проверки права на расходование UTXO принципиально не изменилась. Изменилось место, где хранятся данные для проверки и то, как они учитываются при расчете размера транзакции.
Когда кто‑то отправляет биткоины на адрес bc1q.., в блокчейн попадает не сам адрес, а выход транзакции с условием примерно такого вида: «Этот UTXO может потратить только тот, кто предъявит открытый ключ, хеш которого равен указанному значению, и корректную подпись, созданную соответствующим закрытым ключом».
Продолжение доступно только участникам
Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».
Присоединяйся к сообществу «Xakep.ru»!
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
