Полнота Тьюринга: что это значит, зачем она была нужна Ethereum и почему Bitcoin решил её избежать.
Мой друг, работающий в сфере традиционных финансов, однажды спросил меня, почему Ethereum может запускать целые финансовые приложения на своем блокчейне, в то время как Bitcoin может, по сути, только отправлять деньги с одного адреса на другой. «Это оба блокчейна, — ответил он. — В чем же реальная разница?»
Я попытался объяснить ему полноту по Тьюрингу, и увидел, как у него потускнели глаза. Поэтому я попробовал ещё раз, используя аналогию. Биткойн — это торговый автомат. Вы вставляете деньги, нажимаете кнопку, получаете определённый товар. Он делает то, для чего был создан, и ничего больше. Эфириум — это кухня с поваром. Дайте повару любой рецепт и достаточно ингредиентов, и он сможет приготовить что угодно. Циклы («помешивать до загустения»), решения («если слишком солёно, добавить воды»), креативность («импровизировать десерт из того, что осталось»). Повар может следовать любой инструкции. Торговый автомат — нет.
Эта аналогия не совсем точна. Специалист по информатике указал бы на несколько моментов, которые я слишком упростил. Но она заставила моего друга задать правильный вопрос: «Так почему же кто-то захотел бы стать торговым автоматом?»
Этот вопрос — вся дискуссия о полноте по Тьюрингу в мире криптовалют. Безопасность против гибкости. Предсказуемость против мощности. Биткоин против Эфириума. И ответ, как ни странно, заключается в том, что правы обе стороны.
Откуда взялась эта идея и почему математическая статья 1936 года до сих пор имеет значение.
В 1936 году Алан Тьюринг опубликовал статью под названием «О вычислимых числах». Ему было 23 года. В ней он описал машину настолько простую, что она кажется игрушкой. Лента, разделённая на ячейки. Головка, которая считывает и записывает символы. Правила, которые указывают головке, что делать, исходя из того, что она считывает. Лента, головка, правила. Вот и вся машина.
Вот что до сих пор вызывает у меня мурашки по коже. Тьюринг доказал, что эта до смешного простая машина может вычислить всё, что когда-либо сможет вычислить любой компьютер. Не что-то одно. Всё что угодно. Ваш телефон прямо сейчас выполняет операции с магнитной лентой и головкой. То же самое делает сервер, на котором работает ChatGPT. То же самое делает чип в вашей машине. Он доказал всё это в 1936 году, ещё до того, как на Земле появился хотя бы один электронный компьютер. Написанной работе почти 90 лет, и её до сих пор преподают на первом семестре на каждом факультете информатики.
Когда говорят, что система «полная по Тьюрингу», имеют в виду, что она может имитировать ленточный генератор Тьюринга. Она может запускать циклы, принимать решения на основе данных, хранить информацию в памяти и выполнять любой алгоритм. Ваш ноутбук — полный по Тьюрингу. Карманный калькулятор — нет. И вот забавный факт, который я люблю рассказывать людям: схемы из красного камня в Minecraft технически полны по Тьюрингу. Люди создали работающие компьютеры внутри игры. Не полезные компьютеры, но работающие.

Как это проявляется в Биткоине: почему Сатоши выбрал ограничение
Сатоши создал Биткоин с помощью языка программирования Bitcoin Script, который намеренно сделан примитивным. Он проверяет подписи, обрабатывает кошельки с мультиподписью, блокирует средства с временными ограничениями, и на этом, пожалуй, всё. Никаких циклов. Никаких сложных ветвлений. Никакого состояния, которое бы сохранялось между транзакциями.
Впервые я понял, почему это важно, когда читал о взломе DAO на Ethereum (я к этому ещё вернусь). Рекурсивный вызов функции унивал 150 миллионов долларов из смарт-контракта, потому что код мог вызывать сам себя в бесконечном цикле, чего разработчики никак не предвидели. На Bitcoin такой взлом невозможен. Не невероятен. Невозможен. Bitcoin Script не может вызывать сам себя. Не может зацикливаться. Не может рекурсивно выполнять действия. Язык слишком ограничен, чтобы описать ошибку такого рода, которая обошлась Ethereum в 150 миллионов долларов.
Это ограничение — его особенность. Каждый скрипт Bitcoin завершается предсказуемо. Вы можете прочитать его и точно знать, что он сделает. Никаких сюрпризов. Никакого неожиданного поведения. Когда вы обеспечиваете безопасность сети стоимостью более триллиона долларов, «скучность и предсказуемость» — это не слабость. Это дизайнерское решение.
Что построил Виталик и почему это изменило всё.
Виталику Бутерину было 19 лет, когда он опубликовал технический документ Ethereum в 2013 году. Его вопрос был простым и радикальным: что, если сам блокчейн сможет запускать любую программу? Не просто «отправлять монеты из пункта А в пункт Б», а всё, что может сделать компьютер?
Я учился в колледже, когда вышел технический документ по Ethereum. Я прочитал его в формате PDF, которым кто-то поделился на форуме, посвященном биткоину. Половина ответов говорила, что Виталик — гений. Другая половина утверждала, что он создает систему, которую сразу же взломают. Оба были правы.
Ethereum был выпущен в 2015 году с двумя компонентами, которые сделали его полным по Тьюрингу. Solidity — это язык программирования для написания смарт-контрактов. Он включает циклы, условные операторы, хранилище состояния, вызовы функций. Всё, что нужно. Виртуальная машина Ethereum запускает эти контракты одновременно на каждом узле сети. Вместе они позволяют разработчикам развертывать любой написанный ими код.
Именно это решение объясняет существование DeFi. Почему существуют NFT. Почему существуют DAO. Почему миллиарды долларов проходят через программы, которые не контролируются ни одной компанией. Каждое интересное приложение в криптовалюте, от Uniswap до Aave и OpenSea, стало возможным только потому, что Ethereum может выполнять произвольный код.
Но Виталик сделал ставку. Он поставил на то, что сила гибкости перевесит риск сложности. Взлом DAO в 2016 году основательно проверил эту ставку. Эксплойты DeFi, ежегодно обходящиеся в миллиарды долларов, продолжают проверять её на прочность. А биткоин-сообщество продолжает указывать на эти потери и говорить: «Вот почему мы остались верны простоте». Обе стороны правы.
Проблема остановок и причины существования платы за газ.
Вот та часть, которая не давала мне спать по ночам, когда я впервые это понял.
В той же статье 1936 года Тьюринг доказал неудобную вещь: ни один алгоритм, взглянув на произвольную программу, не может с уверенностью определить, завершится ли её выполнение или она будет зацикливаться бесконечно. Это не технологическая проблема, которую мы ещё не решили. Это математическая невозможность. Доказано. Сделано. Ни один компьютер, каким бы продвинутым он ни был, не может решить проблему остановки для всех программ.
На моем ноутбуке бесконечный цикл раздражает. Я нажимаю Ctrl-C. Жизнь продолжается. Но в блокчейне бесконечный цикл — это катастрофа. Каждый узел запускает каждый смарт-контракт. Если один контракт никогда не останавливается, каждый узел на планете, работающий с этим блокчейном, зависает. Сеть мертва.
Решение Ethereum простое, но эффективное: газ. Каждое вычисление стоит газа. Вы добавляете газ к своей транзакции. Когда газ заканчивается, выполнение кода останавливается. Неважно, завершилось оно или нет. Неважно, было ли это в процессе перевода ваших денег. Если газ обнуляется, выполнение завершается. Именно поэтому комиссия за газ в ETH варьируется. Простой перевод: 21 000 газа. Сложный обмен в DeFi: 200 000. Создание NFT с изображением в блокчейне: полмиллиона. Вы платите за объем вычислений, которые должен выполнить каждый узел.
Биткоин посмотрел на эту проблему и сказал: «Нет». Нельзя написать цикл, нельзя в нём застрять. Любой скрипт завершается. Механизм газа не нужен. Язык слишком ограничен, чтобы выразить «навсегда».
Июнь 2016 года: когда теория воплотилась в реальность, принеся 150 миллионов долларов.
Любой разговор о полноте по Тьюрингу в криптографии рано или поздно сводится к этому моменту.
DAO представляла собой инвестиционный фонд в размере 150 миллионов долларов, работающий на Ethereum. Смарт-контракт. Управление сообществом. Деньги поступают, голоса определяют, куда они будут выведены. Код был сложным. В нём были циклы, условные операторы, вызовы между контрактами, состояние, изменяющееся в середине выполнения. Всё, что позволяет полнота Тьюринга.
Кто-то обнаружил уязвимость. Функция вывода средств сначала отправила ETH, а затем обновила баланс. Злоумышленник вызвал функцию вывода средств, получил оплату, и прежде чем баланс обновился, функция снова вызвала саму себя. И снова. И снова. Реентерабельность. Цикл, который разработчики никогда не предполагали, истощающий средства с каждым циклом.
Может ли такое произойти в Биткоине? Нет. Биткоин-скрипт не может вызывать сам себя. Не может вызывать другие скрипты. Не может зацикливаться. То, что делает Биткоин скучным, делает эту конкретную атаку невозможной.
Сообщество Ethereum проголосовало за хардфорк блокчейна и отмену кражи. В результате этого раскола появился Ethereum Classic. Разработчики извлекли уроки. Защита от повторного входа стала стандартом. Шаблон «проверки-эффекты-взаимодействия» стал непреложной истиной. Но фундаментальная истина не изменилась: в коде, полном по Тьюрингу, всегда могут содержаться ошибки, которые его создатели не предвидели. Это не недостаток Ethereum. Это следствие математических расчетов.

Биткоин становится менее ограниченным: Taproot и BitVM
Граница между полнотой и неполнотой по Тьюрингу уже не так четка, как раньше в случае с Биткоином.
Taproot был выпущен в ноябре 2021 года и расширил возможности Bitcoin Script. Более сложные механизмы условного расходования средств, улучшенная конфиденциальность благодаря подписям Шнорра, абстрактные синтаксические деревья Меркеля, скрывающие условия транзакции до их выполнения. Он всё ещё не является полным по Тьюрингу, но стал более выразительным, чем раньше.
Предложенная в 2023 году концепция BitVM идёт ещё дальше. Она описывает систему для выполнения произвольных вычислений вне блокчейна с последующей проверкой результата в Bitcoin. Представьте себе это так: фактические вычисления происходят в другом месте, а Bitcoin вмешивается только в том случае, если кто-то оспаривает результат. Теоретически это делает Bitcoin практически полным по Тьюрингу для определённых сценариев использования без изменения самого языка программирования.
Я общался с разработчиками Bitcoin по поводу BitVM, и их реакция оказалась интересной. Они в восторге от новых возможностей, но в то же время напуганы рисками. Один из них сказал мне: «Мы не будем торопиться. Люди хранят в этой системе триллионы долларов. Если мы сломаем её, пытаясь сделать её ещё более сложной, никто нам не простит». Такая осторожность раздражает, если вы хотите внедрить Bitcoin DeFi завтра. Но она вселяет уверенность, если вы тот человек, у которого в системе триллион долларов.
В любом случае, направление движется в сторону большей выразительности. Taproot уже расширил границы возможного. BitVM расширит их ещё больше. Но не стоит ожидать, что Биткойн станет Эфириумом. Культуры слишком разные для этого.
Почему вообще каждый новый блокчейн выбирает полноту по Тьюрингу?
Вот что разрешило спор на практике: никто больше не создает блокчейны, не являющиеся полными по Тьюрингу. Solana, Cardano, Polkadot, Avalanche, BNB Chain — все полные по Тьюрингу. Все они способны запускать произвольные программы. Рынок решил, что программируемость побеждает, и теперь единственный вопрос — как сделать системы, полные по Тьюрингу, быстрее, дешевле и безопаснее.
Каждая блокчейн-сеть пошла на разные компромиссы. Ethereum выбрала EVM и Solidity (крупнейшая экосистема, самые высокие комиссии на уровне L1). Solana разработала Sealevel для параллельного выполнения с использованием Rust (быстро, но сложнее в разработке). Cardano выбрала Haskell и формальную верификацию (математически строго, медленнее внедряется). Но все они согласились на полноту по Тьюрингу, потому что хотели запускать смарт-контракты, DeFi, NFT, DAO и все остальное, что требует собственной логики.
Проблемы безопасности реальны. Уязвимости в DeFi обходятся в миллиарды долларов каждый год. Взлом DAO был только началом. Но индустрия пришла к выводу, что преимущества программируемости перевешивают риски. Даже Биткоин, первоначальная цепочка с преднамеренно ограниченными возможностями, движется в сторону большей выразительности с помощью Taproot и BitVM.
Я достаточно долго работаю в сфере криптовалют, чтобы extensively использовать оба типа блокчейнов. Я отправлял транзакции в биткоинах, которые подтверждались точно так, как и ожидалось, каждый раз. Я также развертывал смарт-контракты на Ethereum, которые делали то, чего я не предвидел, потому что Solidity позволяет писать достаточно сложный код, чтобы удивлять самого себя. Оба опыта сформировали мое мировоззрение.
Дискуссия ведется не столько о том, хороша или плоха полнота по Тьюрингу, сколько о том, что вам нужно. Если вам нужна максимально безопасная и предсказуемая система цифровых платежей, то дизайн Биткойна имеет смысл. Если вы хотите создавать финансовые приложения, игры, системы идентификации или что-либо еще, требующее собственной логики, вам нужна полнота по Тьюрингу. Большая часть того, что делает криптовалюту интересной сейчас, стала возможной только благодаря тому, что 19-летний юноша решил, что риск оправдан.
Я думаю об этом каждый раз, когда использую Uniswap, Aave или любой другой протокол DeFi. Каждая моя транзакция — это выполнение кода на виртуальной машине, полной по Тьюрингу. Каждая транзакция несёт в себе теоретический риск того, что какая-то ошибка, которую никто не предвидел, может уничтожить весь контракт. Я всё равно использую эти протоколы, потому что для меня полезность оправдывает риск. Но я никогда не забываю о существовании этого риска. И я никогда не забываю, что Биткоин выбрал другой путь, и этот путь обладает своей собственной мудростью. Торговый автомат никогда не украдет ваши деньги. А вот повар может сжечь кухню.