Тюрінгове завершення: що це означає, чому це було потрібно Ethereum і чому Bitcoin вирішив цього уникнути
Один друг, який працює у сфері традиційних фінансів, якось запитав мене, чому Ethereum може запускати цілі фінансові програми на своєму блокчейні, тоді як Bitcoin може по суті лише надсилати гроші з однієї адреси на іншу. «Вони обидва є блокчейнами», – сказав він. «У чому насправді різниця?»
Я спробував пояснити Тюрінгу повноту і спостерігав, як його очі заскляніли. Тож я спробував ще раз за допомогою аналогії. Біткойн — це торговельний автомат. Ви кладете гроші, натискаєте кнопку, дістаєте певний товар. Він робить те, для чого його створили, і нічого більше. Етереум — це кухня з шеф-кухарем. Дайте шеф-кухарю будь-який рецепт і достатньо інгредієнтів, і він може приготувати що завгодно. Цикли («перемішуйте до загустіння»), рішення («якщо занадто солоно, додайте води»), креативність («імпровізуйте десерт із того, що залишилося»). Шеф-кухар може виконати будь-яку інструкцію. Торговельний автомат — ні.
Ця аналогія не ідеальна. Комп'ютерний фахівець вказав би на кілька речей, які я надмірно спростив. Але це змусило мого друга поставити правильне запитання: «То чому хтось вирішив бути торговим автоматом?»
Це питання є основою всієї дискусії щодо повноти Тюрінга в криптовалюті. Безпека проти гнучкості. Передбачуваність проти потужності. Біткойн проти Етереуму. І відповідь, як не прикро, полягає в тому, що обидві сторони мають рацію.
Звідки взялася ця ідея та чому математична робота 1936 року досі важлива
Алан Тюрінг опублікував статтю під назвою «Про обчислювальні числа» у 1936 році. Йому було 23 роки. У ній він описав машину настільки просту, що вона звучить як іграшка. Смужка стрічки, розділена на комірки. Головка, яка зчитує та записує символи. Правила, які вказують головці, що робити на основі того, що вона читає. Стрічка, головка, правила. Ось і вся машина.
Ось та частина, яка досі викликає в мене мурашки по шкірі. Тюрінг довів, що ця сміховинно проста машина може обчислити все, що будь-який комп'ютер будь-коли обчислить. Не деякі речі. Будь-що. Ваш телефон зараз виконує операції з магнітофонною головкою. Так само, як і сервер, на якому працює ChatGPT. Так само, як і чіп у вашому автомобілі. Він довів усе це в 1936 році, ще до того, як на Землі існував хоч один електронний комп'ютер. Цій статті майже 90 років, і кожен факультет інформатики на планеті досі викладає її в першому семестрі.
Коли хтось каже, що система «повна за Тюрінгом», вони мають на увазі, що вона може імітувати магнітофонну стрічку Тюрінга. Вона може запускати цикли, приймати рішення на основі даних, зберігати речі в пам'яті та виконувати будь-який алгоритм. Ваш ноутбук є повним за Тюрінгом. Кишеньковий калькулятор — ні. А ось цікавий факт, про який я люблю розповідати людям: схеми Redstone у Minecraft технічно є повними за Тюрінгом. Люди будували функціонуючі комп'ютери всередині гри. Не корисні комп'ютери. Але робочі.

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

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