Средний Урок 1 4 мин чтения

Анатомия транзакции: входы, выходы и UTXO

Биткойн не имеет баланса. Есть неиспользованные куски, и каждый платеж осуществляется целыми кусками.

Откройте кошелек, и вы увидите баланс. Это число не существует в сети. Нигде в блокчейне не хранится информация о том, сколько у вас есть: существуют кусочки денег, каждый с владельцем и собственной стоимостью, а баланс — это сумма, которую ваше приложение вычисляет перед тем, как отобразить экран.

Каждый кусочек называется UTXO, что расшифровывается как невитрачений вихід транзакції. Когда кто-то вам платит, транзакция создает выход с определенной стоимостью и замком, который может открыть только ваш ключ. Пока никто его не потратит, он остается там, целым, ожидая. Сеть не умеет складывать ваши: она лишь знает, был ли каждый из них уже потрачен или нет.

Сеть не хранит баланс. Она хранит кусочки, и каждый из них целый.

Отсюда следует правило, которое объясняет почти все последующее: UTXO тратится целиком. Нельзя использовать половину, так же как нельзя заплатить десять половиной двадцатки. Если у вас есть кусочек на 0,05 и нужно заплатить 0,03, транзакция использует все 0,05 и создает два новых выхода: один на 0,03 для получателя и другой, с оставшейся суммой, обратно на ваш адрес. Это сдача, которую начальный курс обещал объяснить изнутри, и это не любезность программы: это единственный способ, чтобы счет сошелся.

Каждая транзакция, следовательно, представляет собой список входов и список выходов. Входы указывают на предыдущие выходы, сообщая, откуда пришли деньги, и каждый из них сопровождается подписью, подтверждающей право их потратить. Выходы указывают, куда они идут. Значения всегда выражаются целыми числами в сатоши — стомиллионной части биткоина — потому что целое число никогда не округляется неправильно.

И вот деталь, которая больше всего удивляет тех, кто видит это впервые: комиссия нигде не записывается. В транзакции нет поля для комиссии. Есть только разница: если сумма входов больше, чем сумма выходов, оставшаяся часть идет майнеру, который включит транзакцию в блок.

Комиссия не записана. Это то, что остается между тем, что вошло и вышло.

Этот проектный выбор элегантен и неумолим. 10 февраля 2023 года американская компания Paxos передала транзакцию, которая перемещала эквивалент нескольких долларов и заплатила 19,8 биткоинов в качестве комиссии — полмиллиона долларов на тот момент. Никто не вводил это значение. Кто-то собрал входы и забыл выход для сдачи, и сеть сделала именно то, что предписывает правило: что не пошло на выход, пошло майнеру. Обычный кошелек защищает вас от этого с помощью проверок; вручную собранная транзакция — нет.

С моделью в голове, две повседневные проблемы становятся очевидными. Первая — это пыль: кусочки настолько маленькие, что их трата стоит больше в виде комиссии, чем они сами стоят. Они остаются в кошельке навсегда и даже используются как техника отслеживания — отправка пыли на тысячи адресов и наблюдение за тем, кто тратит ее вместе с остальным.

Есть кусочки настолько маленькие, что их переноска стоит больше, чем они сами.

Вторая — это консолидация. Тот, кто получает много мелких платежей, накапливает десятки UTXO, и каждый из них занимает место при трате — транзакция с тридцатью входами в тридцать раз дороже, чем с одним. Консолидировать — значит объединить их в одну транзакцию, сделанную в момент низкой комиссии, чтобы заплатить дешево сегодня то, что завтра обойдется дорого. Взамен консолидация публично раскрывает, что все эти кусочки принадлежат одному человеку, что является темой урока о конфиденциальности, который будет позже в курсе.

Вот почему полный узел не хранит балансы никого: он хранит набор всех еще не потраченных выходов всей сети, несколько гигабайт, которые отвечают на единственный важный вопрос при валидации — существует ли еще этот кусочек?

Осталось открыть замок. Каждый выход содержит небольшую программу, которая определяет условие для его траты, написанную на собственном языке. В следующем уроке — Скрипт.