Биткойн был первой валютой, представившей модель UTXO - Unspent Transaction Output (Выходы/вывод неизрасходованных транзакции) для отслеживания состояния базы данных. Каждая Биткойн-транзакция потребляет (расходует) выходы предыдущих транзакций и производит новые выходы, которые будут употреблены будущими транзакциями. Каждый выход может быть использован только один раз. Эта структура обладает множеством очень полезных математических свойств, включающих также конструктивное доказательство того, что одни и те же токены никогда не могут быть потрачены дважды, если каждая транзакция доказывает, что сумма ее входов больше, чем сумма ее выходов.
Сегодня многие из лучших умов в таких организациях, как R3, Blockstream, BOSCoin и Qtum продолжают продвигать идею модели UTXO. В некоторых случаях они ставят этот подход превыше всех других подходов и выстраивают свой бизнес целиком вокруг этой модели. Основная причина, по которой UTXO преподносится как лучшая, это присущий ей естественный параллелизм, поскольку каждая транзакция может обрабатываться параллельно, так как все они относятся к независимым / неконфликтующим выходам. С точки зрения теоретической информатики, UTXO элегантна и легко доказуема. Однако в реальном мире все сильно иначе.
Ограниченность применения UTXO
Модель UTXO подходит только для тех приложений, где каждый выход имеет только одного владельца. Это прекрасно совместимо с моделью валюты, и поэтому работает в случае с Биткойном. Тем не менее, если хотя бы один выход может использоваться одновременно двумя или более людьми, то весь процесс ломается.
Ярким тому примером может служить биржевые лимит-ордера. В мире UTXO это будет представлено выходом, который может быть затребован при условии, что заявитель заплатил предыдущему владельцу цену, которую тот потребовал. Если за владение этим выходом не было конкуренции, то всё работает как надо; тем не менее, как только два человека хотят затребовать выход одновременно, возникает проблема.
Алиса и Вова оба создали транзакцию, которая должна израсходовать ордер; спустя несколько секунд Вова выяснил, что транзакция Алисы победила, а его - проиграла. Тогда Вова вновь создает транзакцию, чтобы занять следующий доступный ордер. К сожалению, эта попытка тоже неудачна, так как кто-то опять его опередил. Вова вынужден следовать строго прописанному сценарию, который будет производить и подписывать транзакции, пока одна из них не пройдет успешно.
Эта проблема становится еще сложнее на тех блокчейнах, где кратковременные реорганизации цепи - обычная процедура (proof of work - доказательство проделанной работы).
Эта проблема усложняется еще больше, если кто-либо хочет создать биржу, которая обеспечивает исполнение требования о том, чтобы ордера заполнялись от наивысшего к низшему по принципу «кто раньше пришел, того раньше обслуживают». Вместо реестра ордеров, представленного в виде сотен индивидуальных выходов, мы получим один гигантский выход, который содержит полное состояние реестра ордеров. Все транзакции используют текущий реестр ордеров в качестве своего входа и производят новый реестр ордеров в качестве своего выхода. Получается, что не только Алиса и Вова, но и все участники рынка сражаются за этот единственный выход.
С точки зрения информационной теории, этот чисто утилитарный подход к реестру ордеров крайне элегантен, но как только вы примете во внимание стоимость дублирования и проверки контента, снова и снова повторяющейся его трансляции, а также борьбу за замок, то становится ясно, что элегантной математической модели недостаточно.
Простейший пример
Представьте себе смарт-контракт, являющийся счетчиком, показатель которого может увеличивать кто угодно. Представьте, что существует некий экономический стимул, который побуждает человека увеличить этот показатель насколько возможно раньше других людей, и что есть 1000 человек, активно пытающиеся увеличить показатель счетчика как можно быстрее и чаще.
В модели UTXO это было бы представлено как выход с единственным числом, который может быть затребован при условии, что транзакция производит новый выход с тем же числом, увеличенным на 1. Как быстро бы увеличивался показатель счетчика?
Если мы предположим, что интервал между блоками составляет 3 секунды, то и показатель будет увеличиваться раз в 3 секунды. Если же предположить, что люди спекулятивно полагаются на на неподтвержденный UTXO, то он будет увеличиваться каждые 250 мс (глобальная задержка для пиров в разных точках мира).
Конечно, если позволить людям надстраивать на неподтверждённые UTXO, это создаст комбинаторный взрыв, поскольку каждый будет стараться построить цепочку за каждым неподтвержденным UTXO до тех пор, пока производитель блоков, в конце концов, не выберет некоторые из них и отвергнет все остальные.
Чтобы предотвратить спам в сети, пиры будут вынуждены блокировать транзакции, которые основываются на слишком большом количестве неподтвержденных транзакций.
UTXO требует введения точки синхронизации
Модель UTXO вынуждает строго одного человека заполучить контроль над выходом, произвести некую трансформацию и затем - новый выход. В информатике этот шаблон известен как Сравнение с обменом, который обычно используется в тесных циклах для синхронизации параллельного доступа к данным.
Разница между “Сравнением с обменом” на уровне CPU и UTXO заключается в том, сколько времени занимает операция. UTXO ограничена задержкой сети, и хорошо, если два пира, находящиеся в разных полушариях, смогут достичь показателя 5 успешных операций в секунду. Хорошо известно, что когда сразу несколько процессов борются за “Сравнение с обменом” на уровне CPU, это приводит к тому, что многопоточная производительность оказывается гораздо медленнее, чем однопоточная.
UTXO требует перехода Состояния в Транзакции
Каждая транзакция эксплицитно включает свое новое состояние выхода. Это состояние включает в себя всё, что должно быть модифицировано атомарным образом. Если бы UTXO была биржевым реестром ордеров, то состоянием была бы вся книга целиком. То, что работает для Биткойна (короткий скрипт и баланс), не работает для всего, что хоть немного более сложно или ссылается на большее количество данных.
Давайте опять представим себе счетчик, только в этот раз предположим, что счетчик прикреплен к буферу данных размером 1MB, значение которого детерминистически меняется каждый раз, как меняется показатель счетчика. Теперь сеть и блокчейн обрабатывают 1MB данных с каждой транзакцией. Это именно то, что получилось бы, если биржи, контент социальных сетей и другие приложения были бы построены на UTXO.
UTXO требует применения нелогичного дизайна
Из-за этих недостатков люди, занимающиеся разработкой приложений на UTXO, вынуждены ограничивать количество состояний, на которые воздействует каждый выход. Это означает появление бирж без правил о порядке исполнения ордеров. Это означает, что любая схема, построенная на результатах сбора входных данных из нескольких источников, скорее всего окажется нежизнеспособна.
Альтернативный подход, основанный на сообщениях
Steem и Bitshares используют подход, основанный на сообщениях. В таком случае блокчейн представляет собой консенсус о порядке сообщений, а его состояние детерминистически извлекается из этих сообщений.
Чтобы встроить счетчик, каждый пользователь просто должен подписать сообщение с запросом на увеличение показателя счетчика на 1. Сообщению не нужно будет знать текущее состояние счетчика, чтобы быть действительным сообщением. Это значит, что 1000 человек могут одновременно подать запрос, и производитель блоков сможет собрать все запросы в блок, а спустя 3 секунды показатель счетчика изменится с 0 на 1000.
Заключение
Из этой статьи можно заключить, что любой блокчейн, построенный на модели UTXO, по сути сильно ограничивает область своего применения требованием иметь только одного владельца выхода. Любой выход с несколькими владельцами будет ограничен задержкой из-за скорости света до нескольких транзакций в секунду. То, что отлично работает для такой валюты, как Биткойн, не работает для любых приложений общего назначения.
@rusteemitblog, Поздравляю!
Ваш пост был упомянут в моем хит-параде в следующей категории:
О, Дэн вернулся на Стим?
Это все хорошо и статья по делу, но перевод это пиздец, товарищи. У меня до сих пор глаза кровоточат.
Так читай на английском