Smart contracts

Пропускная способность блокчейна Биткоина уже сейчас сильно ограничена, а смарт-контракты очень интенсивно используют ресурсы. Поэтому, несмотря на то, что биткоин всегда поддерживал основные функции смарт-контрактов, эти двое никогда не подходили друг другу.

Однако, решению этой проблемы может помочь последнее исследование математика Blockstream Эндрю Поэлстра (Andrew Poelstra), которое было презентовано им на конференции Scaling Bitcoin Stanford. Предложение под названием Scriptless Scripts имеет все шансы полностью переместить отдельные смарт-контракты из блокчейна Биткоина, сохранив при этом защищенность.

Биткоин и смарт-контракты

Смарт-контракты, впервые предложенные ветераном цифровой валюты Ником Сабо в 90-е годы, по сути, представляют собой самовыполняемые контракты. Обычно они отправляют деньги между участниками при выполнении определенных условий.

Хотя умные контракты часто ассоциируют со «вторым поколением» блокчейнов наподобие Эфириума, Биткоин также всегда поддерживал простые смарт-контракты. В какой-то степени технически любая транзакция Биткоина представляет собой смарт-контракт: средства обычно перемещаются при условии предоставления действующей криптографической подписи. Немного более продвинутые смарт-контракты, такие как multisig (мультиподпись) и timelocks (временные блокировки), используются для обеспечения протоколов второго слоя наподобие Lightning Network.

Однако у основанных на блокчейне смарт-контрактов имеются определенные проблемы. Например, по мере увеличения сложности, для их выполнения требуется большее количество ресурсов. Особенно проблематично это потому, что выполнять контракт обязаны все узлы сети, а не только участники контракта.

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

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

По мнению Поэлстра, все эти проблемы можно решить, переместив определенную группу контрактов за пределы блокчейна. В этом случае смарт-контракт будет выполняться не всеми узлами сети, а только его непосредственными участниками.

Задача состоит в том, чтобы вся остальная сеть правильно исполнила результат контракта: платеж осуществится только при выполнении заданных условий.

Подписи Шнорра

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

Суть решения Scriptless Scripts заключается в том, что постоянные криптографические подписи могут косвенно сообщать нечто, не являющееся частью содержащей подпись транзакции. Другими словами, когда кто-то подписывает подтверждение обычной транзакции биткоина, подразумевается, что смарт-контракт, находящийся за пределами блокчейна, верно его исполнит.

Это достигается благодаря подписям Шнорра (Schnorr signatures). Этот вид подписи пока не реализован в протоколе биткоина, однако возможно, что приблизительно через год он начнет использоваться.

Подписи Шнорра позволяют группирование подписей, то есть несколько подписей можно математически объединить в одну. И, что важно для такого сценария, эта математика является «линейной». По сути, это означает возможность выполнения в таких подписях относительно прямой, но очень выразительной математики.

В упрощенном виде это действует следующим образом:

Закрытые ключи и подписи являются просто числами, причем последнее получается из предыдущего. Поскольку это упрощенный пример, предположим, что один закрытый ключ выглядит как 10, а половина подписи Шнорра, полученной из закрытого ключа, выглядит как 10 000. Другой закрытый ключ – это 15, а вторая половина подписи Шнорра – 15 000. В этом упрощенном примере подпись Шнорра далее будет выглядеть как 25 000 (или 10 000 + 15 000).

Поскольку обе половины подписи – это просто числа, между ними появляется возможность осуществления расчетов. Так, в нашем упрощенном примере разница между половинами равна 5 000 (или 15 000 – 10 000).

Хотя в реальности все намного сложнее, линейность Шнорра обеспечивает некоторые из таких математических «трюков».

Смарт-контракт

Теперь предположим, что стример хочет прослушать песню некоего исполнителя. Исполнителю принадлежит право на эту песню, и она будет воспроизведена для стримера, только если подпись исполнителя будет предоставлена на сервер, где хранится песня. Предположим, что «подпись песни» выглядит как 7 000. Чтобы прослушать песню, стример хочет заплатить исполнителю за подпись песни 1 BTC (видимо, он очень сильно хочет ее послушать!).

В этом упрощенном примере стример и исполнитель могут автоматизировать сделку при помощи двух вещей. Во-первых, они создают обычную транзакцию биткоина, которая отправит один биткоин от стримера к исполнителю, если и стример, и исполнитель предоставят свои половины подписи Шнорра, воссоздав таким образом полную подпись. (В реальности этот шаг требует соблюдения дополнительных мер безопасности, защищающих от потери средств, но это относительно просто).

На следующем этапе все немного усложняется. Исполнителю известно, как выглядит его половина подписи Шнорра; предположим, это будет 8 000. Ему известно также как выглядит песня — 7 000. Таким образом, исполнитель может вычислить разницу между двумя значениями –1000. Эта разница называется переходной подписью. Затем исполнитель передает эту переходную подпись – 1000 – стримеру.

А здесь-то и начинается настоящая криптографическая магия.

Изменив обычный метод верификации подписи, стример фактически может подтвердить, что переходная подпись, которую он только что получил (1000), действительно представляет собой разницу между половиной подписи Шнорра исполнителя и подписи его песни — даже несмотря на то, что стример пока не имеет доступа ни к одной из этих подписей. (И благодаря криптографическим трюкам под названием «доказательства с нулевым разглашением» (zero-knowledge proofs), нечто подобное фактически можно осуществить в удивительно большом количестве сценариев, которое далеко не ограничивается подписями в представленном примере).

Теперь, после проверки подтверждения переходной подписи (1000), стример, в свою очередь, может отдать исполнителю свою половину подписи Шнорра, поскольку как только исполнитель использует половину стримера для создания полной подписи и передаст ее по сети биткоина, он также автоматически откроет свою половину подписи Шнорра (8000) стримеру.

Используя половину подписи Шнорра исполнителя, стример теперь может вычесть переходную подпись: 1000. Отняв переходную подпись из половины подписи Шнорра исполнителя (8000 – 1000), стример узнает подпись песни — 7000. Теперь, наконец, он может прослушать песню.

Другими словами, транслируя транзакцию, передающую ему один биткоин, исполнитель автоматически продает стримеру подпись – смарт-контракт.

С точки зрения блокчейна (или остального мира) транзакция является достаточно правильной. Информация о смарт-контракте (за исключением расчетной транзакции) не заносится в блокчейн. Никто не узнает, что контракт был исполнен (не важно, какую песню слушал стример), а относящуюся к контракту информацию не сможет узнать или сохранить никто, кроме участников контракта.