В последнем обновлении Bitcoin Core пользователи получат возможность воспользоваться преимуществами технологии под названием Taproot. Впервые предложенная разработчиком Bitcoin Core и бывшим тех. директором Blockstream Грегори Максвеллом, Taproot призвана увеличить гибкость смарт-контрактов Биткойна, вместе с тем повысив их конфиденциальность. Это сделает даже самые сложные смарт-контракты в блокчейне в общем случае неотличимыми от обычных транзакций.

При всей амбициозности, это задача не из области чистой теории. Несколько наиболее продуктивных разработчиков Bitcoin Core, включая Питера Вуйле, Энтони Таунса, Джонсона Лау, Йонаса Ника, Эндрю Поэлстра, Тима Раффинга и, конечно, Грегори Максвелла, работают над предложением о введении поддержки подписей Шнорра, включающем также поддержку Taproot – все в рамках одного обновления протокола.

Что же такое Taproot и как это работает?

P2SH

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

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

С 2012 года скрипты (условия расходования) первоначально часто бывают скрыты; только новый владелец монет знает, как они могут быть потрачены. Это делается с помощью трюка под названием P2SH (pay to script hash), когда изначально в блокчейн записывается только хеш скрипта. Это на вид случайное число блокирует монеты. При расходовании этих монет владелец раскрывает одновременно и весь скрипт, и его «решение». После этого любой желающий может использовать первоначальный хеш для проверки того, что предоставленный скрипт действительно является оригинальным скриптом, блокировавшим монеты, и убедиться, что требования скрипта были выполнены.

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

MAST

MAST (Merkelized Abstract Syntax Tree) – это предлагаемый способ обхода этих двух недостатков через использование деревьев Меркла, компактной структуры данных, изобретенной десятилетия назад криптографом Ральфом Мерклом. Вкратце, все различные условия, при которых средства могут быть потрачены, хешируются по отдельности (вместо того чтобы объединяться в один хеш) и организуются в дерево Меркла, которое в итоге производит один хеш: корневой хеш дерева Меркла. Этот корневой хеш «блокирует» монеты.

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

То есть с MAST можно раскрывать только то условие расходования, что было выполнено. Если в примере выше Элис потратит средства через неделю одна, она раскроет только это активированное условие (плюс путь в дереве). Никто не узнает, что эти средства могли быть потрачены Элис и Бобом вместе либо Бобом в одиночку при условии предоставления секретного кода. Это делает MAST более эффективным в отношении данных, чем сложные P2SH смарт-контракты, и повышает конфиденциальность.

Однако при использовании Taproot и подписей Шнорра можно добиться еще лучшего результата: скрыть сам факт существования MAST-структуры.

Шнорр

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

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

Причем схему подписи можно использовать и еще более интересными способами. Например, можно использовать данные для модификации и закрытого, и открытого ключей. В качестве упрощенного примера, секретный и соответствующий ему открытый ключ можно модифицировать, умножив каждый из них на два. Умноженные на два, эти ключи по-прежнему будут соответствовать друг другу, и «секретный ключ x2» по-прежнему сможет подписывать сообщения, которые можно будет проверить с помощью «открытого ключа x2». Любой, кто не знает, что оригинальная пара ключей была изменена, даже не заметит разницы; модифицированные ключи выглядят как любая другая пара ключей.

Это открывает возможности для использования Taproot.

Taproot

Taproot основывается на интересной реализации: независимо от сложности, практически любая MAST-конструкция может (или должна) включать условие, которое позволяет всем участникам согласиться с результатом и просто совместно подписать расчетную транзакцию. В приведенном выше примере, если Боб знает, что Элис может самостоятельно распорядиться средствами через неделю, то он может скооперироваться с ней сейчас и вместе подписать транзакцию. (Во многих схемах смарт-контрактов он даже будет оштрафован, если этого не сделает. Сложность на самом деле просто обеспечивает честность участников.)

Taproot напоминает MAST и всегда включает условие, при котором все участники могут согласиться с тем, чтобы потратить средства: исполнить «совместное закрытие».

При использовании подписей Шнорра это становится по-настоящему интересным.

Во-первых, при совместном закрытии можно использовать трюк с «пороговыми» подписями Шнорра, чтобы сделать транзакцию неотличимой от обычной отправки биткойнов от одного пользователя другому. В этом сценарии открытые ключи всех участников складываются вместе, в результате чего получается «пороговый открытый ключ». Соответствующая этому пороговому открытому ключу комбинация подписей всех участников — «пороговая подпись» – позволяет им расходовать средства.

Пока все неплохо, но тратить средства так, будто это обычная транзакция – это единственное, что они могут сделать; структуры, подобные MAST, пока что оказываются исключены. Здесь пригодится еще одна особенность подписей Шнорра.

Все альтернативные способы расходования средств, помимо совместного закрытия, теперь объединяются в отдельный скрипт. Этот скрипт затем хешируется и используется для модификации порогового открытого ключа. То есть вместо «открытого ключа x2», как в примере выше, это дает в результате «пороговый открытый ключ x скрипт». (Мы все еще несколько упрощаем.) И этот «пороговый открытый ключ, помноженный на скрипт», конечно, соответствует «пороговой подписи, помноженной на скрипт».

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

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

В этом случае раскрываются как исходный пороговый открытый ключ, так и скрипт. Это доказывает, что «пороговый открытый ключ x скрипт» был модифицирован с помощью именно этого скрипта. Таким образом, как и при использовании P2SH, сеть получает доказательство того, что средства могут быть потрачены при выполнении альтернативных условий, обозначенных в этом скрипте. (И, как и в случае P2SH, эти условия, конечно же, немедленно выполняются для расходования средств.)

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

Таким образом, Taproot предлагает все преимущества MAST, притом что в нормальных обстоятельствах никто никогда не узнает, что за простой транзакцией скрывался сложный смарт-контракт.