Практическая демонстрация функционала Taproot

Аннотация:  В этой статье мы вновь обращаемся к обновлению Taproot. Мы объясняем механику работы Taproot на примере двух транзакций Taproot в сети биткоина. Это транзакции расходования биткоина, отправленного на один и тот же адрес двумя разными способами: i) с использованием подписи Шнорра и ii) с использованием Tapleaf и так называемого «неподправленного» (untweaked) открытого ключа.

Общая информация

Taproot — это обновление протокола биткоина (в результате софтфорка), о котором мы впервые писали в мае 2019 года. Taproot был окончательно активирован в блокчейне ВТС 14 ноября 2021 года на уровне блока 709 632. Принятие Taproot после активации было минимальным. По данным TXStats.com, совместного сайта BitMEX Research и CoinMetrics, лишь около 0,05% биткоина хранится в выходах Taproot. Несмотря на низкий уровень принятия в абсолютном выражении, использование Taproot постоянно растет. Такое постепенное внедрение было свойственно и предыдущим софтфоркам (например, SegWit). Именно этого стремятся достичь многие разработчики при введении новых функций — медленного, плавного и постепенного внедрения, которое не вызывает сбоев в работе системы.

Источник: TXStats.com

Пример практического применения Taproot

Мы решили попробовать использовать Taproot в последней версии Bitcoin Core (23.0). Мы хотели не только использовать Taproot в самом базовом варианте (с использованием подписи Шнорра), но и продемонстрировать его главную новую функцию — расходование биткоина с помощью метода Tapleaf. Сделать это оказалось сложнее, чем мы ожидали; этот процесс занял несколько часов, но в конце концов, нам это удалось. Ниже приводится пошаговое руководство, объясняющее, как это сделать.

Создание адреса Taproot и условий расходования Taproot

Мы начали с создания нового кошелька, что можно сделать с помощью интерфейса в Bitcoin Core. Далее мы перешли на консоль, на  которой можно вводить команды удаленных процедур (RPC). Мы выполнили следующую команду:

listdescriptors

Это привело к открытию списка из 8 расширенных открытых ключей (xpub). Хpub
— это своего рода главный открытый ключ для иерархического
детерминированного кошелька, который можно использовать для генерации
серии открытых ключей. Наш список содержал 8 ключей xpub, пути их получения
и другие данные, которые используются для указания того, как будет
генерироваться каждая серия открытых ключей. Наш список содержит 8 ключей
xpub потому, что Bitcoin Core поддерживает 4 схемы иерархических
детерминированных (HD) кошельков, и каждая из них имеет версию для получения и версию для изменения. Например, хэш открытого ключа, хэш
открытого ключа свидетеля или хэш, который нас интересует сегодня, — Taproot.
Открытый ключ xpub для Taproot можно найти, задав tr(). В нашем случае xpub
был следующим:

tr([becb3bf1/86'/0'/0']xpub6DSxK6Vxk8tidDT6rLuGXNShzV9SS7HruXif56dU23WoSvejTdTN2UNY6gRhXreRYpRrwLN2mduyGqBLfxMyGFMDPdNJGmkjPik56qVSArA/0/*)

Для выполнения поставленной задачи нам также нужны закрытые мастер-ключи; для просмотра закрытых ключей можно использовать следующую команду:

listdescriptors true

Закрытый мастер-ключ, соответствующий нашему открытому ключу xpub для Taproot, показан ниже:

tr(xprv9s21ZrQH143K2VuTba4fXmpA6yjZjaTGh5q2oaGerWMeCozTKAQXRQAkMEAYnKL8Bw6geeFW4EsLNaEYacbVWe6zB4MtnXSFmoAEMh6nSk8/86'/0'/0'/0/*)

Для того чтобы использовать «продвинутую» функцию Taproot (расходование биткоина с помощью Tapleaf), нам также нужно получить еще одну пару мастер-ключей HD. Ниже показаны ключи, которые мы использовали:

[becb3bf1/44'/0'/0']xpub6DQq1Noe9suZnf6jaaqT8EQp2HeETEXDy972dkcpFyDBCigsECSd3vaQynmGfPo4xz9WE9SXhFkTbkQVd61HKYfJopRNBgfEcESKJWpBxCL/0/*

xprv9s21ZrQH143K2VuTba4fXmpA6yjZjaTGh5q2oaGerWMeCozTKAQXRQAkMEAYnKL8Bw6geeFW4EsLNaEYacbVWe6zB4MtnXSFmoAEMh6nSk8/44'/0'/0'/0/*

Имея эту информацию, мы можем использовать ключи xpub для создания условий расходования Taproot и адреса Taproot. Ниже показано, как это сделать с помощью двух ключей xpub:

deriveaddresses "tr([becb3bf1/86'/0'/0']xpub6DSxK6Vxk8tidDT6rLuGXNShzV9SS7HruXif56dU23WoSvejTdTN2UNY6gRhXreRYpRrwLN2mduyGqBLfxMyGFMDPdNJGmkjPik56qVSArA/0/*,pk([becb3bf1/44'/0'/0']xpub6DQq1Noe9suZnf6jaaqT8EQp2HeETEXDy972dkcpFyDBCigsECSd3vaQynmGfPo4xz9WE9SXhFkTbkQVd61HKYfJopRNBgfEcESKJWpBxCL/0/*))#8gn2q5qp" "[0,1]"

В результате мы создали следующий адрес Bech32m:

bc1pdqrcrxa8vx6gy75mfdfj84puhxffh4fq46h3gkp6jxdd0vjcsdyspfxcv6

Расходование биткоина с адреса Taproot

Напоминаю: мы предусмотрели два способа расходования средств с адреса Taproot.

  1. «Стандартный» сценарий расходования, в котором для вывода нам нужно предоставить только подпись Шнорра.
  2. Так называемый «нестандартный» сценарий, в котором нам нужно предоставить неподправленный открытый ключ, сценарий расходования и, конечно же, подпись.

В нашем примере на дереве всего одна ветвь, чтобы не усложнять ситуацию. Чтобы протестировать расходование средств, мы отправили 0,001 BTC на наш адрес Taproot. Затем, чтобы лучше контролировать расходование средств, мы создали совершенно новый кошелек Bitcoin Core. После этого мы импортировали закрытый ключ нашего первого xpub Taproot и xpub из второй пары мастер-ключей HD следующим образом:

Сценарий расходования 1: «стандартное» расходование – импортирование ключей

importdescriptors '[{ "desc": "tr(xprv9s21ZrQH143K2VuTba4fXmpA6yjZjaTGh5q2oaGerWMeCozTKAQXRQAkMEAYnKL8Bw6geeFW4EsLNaEYacbVWe6zB4MtnXSFmoAEMh6nSk8/86h/0h/0h/0/*,pk([becb3bf1/44h/0h/0h]xpub6DQq1Noe9suZnf6jaaqT8EQp2HeETEXDy972dkcpFyDBCigsECSd3vaQynmGfPo4xz9WE9SXhFkTbkQVd61HKYfJopRNBgfEcESKJWpBxCL/0/*))#z6cqpzlk", "timestamp":1655925204, "internal": false, "active": true, "range": [0,2] }]'

Импортировать эти данные в кошелек Bitcoin Core было непросто, и сложность этого процесса, скорее всего, будет возрастать вместе со сложностью условий расходования средств. Сервис Miniscript призван потенциально решить эту проблему, так как помогает скомпилировать эти скрипты в нужный формат.

После импорта ключей и схемы Taproot мы увидели входящую транзакцию в размере 0,001 BTC в интерфейсе Bitcoin Core (для этого пришлось его перезапустить). Затем мы смогли расходовать эти средства в графическом интерфейсе, данные транзакции показаны ниже.

Стандартный сценарий расходования средств

Источник: https://mempool.space/tx/d8d482f4f6416dc58afc8e1ab7681cffa9fe47c1083c716a28b2063c73315ffb

Подтверждение (свидетель) транзакции весит около 64 байт и представляет собой просто подпись Шнорра. Никаких других данных для проведения транзакции не требуется. Также на экране можно увидеть «подправленный» (tweaked) открытый ключ, который начинается с6807....

После того как средства были отправлены, мы отправили еще 0,001 BTC на тот же адрес. Затем мы создали еще один совершенно новый пустой кошелек Bitcoin Core, после чего импортировали другой набор ключей, используя ту же команду RPC. Мы поменяли ключи местами, чтобы попробовать альтернативную методику расходования. Сначала мы импортировали ключ xpub для первой пары мастер-ключей Taproot, а затем закрытый ключ для второй пары мастер-ключей, как показано ниже:

Сценарий расходования 2: «нестандартное» расходование

importdescriptors '[{ "desc": "tr([becb3bf1/86h/0h/0h]xpub6DSxK6Vxk8tidDT6rLuGXNShzV9SS7HruXif56dU23WoSvejTdTN2UNY6gRhXreRYpRrwLN2mduyGqBLfxMyGFMDPdNJGmkjPik56qVSArA/0/*,pk(xprv9s21ZrQH143K2VuTba4fXmpA6yjZjaTGh5q2oaGerWMeCozTKAQXRQAkMEAYnKL8Bw6geeFW4EsLNaEYacbVWe6zB4MtnXSFmoAEMh6nSk8/44h/0h/0h/0/*))#4erxc8tf", "timestamp":1655925204, "internal": false, "active": true, "range": [0,2] }]'

Как и раньше, мы увидели входящую транзакцию на сумму 0,001 BTC и смогли расходовать эти средства, но на этот раз с помощью метода Tapleaf.

Источник: https://mempool.space/tx/977b937e7ab7ca52d87ec25a50e36ff164dacb00165ef30dbb13f63c0e7bf7eb

Эта транзакция больше и сложнее, чем первая. Подтверждение содержит три элемента:

Подпись

2af2556843856b25d1978d5440f3e851b670efacbac08f863ac2135c9c66e60faad501920a029b400fcb1ef609add276c46cfa70d9d53b46c4df5db81c0e5c34

Скрипт

20c1d58db5e33fb78f8aef613c54b5af72061faa6809d6dc849bb6c512f5fe56bcac 



Неподправленный открытый ключ

c13c741a3fd4742305451b8295cea32d0da52de23420e2e839d87b7c1e68be881e

Мы можем проверить подправленные и неподправленные открытые ключи, вызвав в Bitcoin Core команду getaddressinfo в кошельке, в котором есть два соответствующих ключа xpub. Эта операция показана ниже. Подправленный открытый ключ называется «scriptPubKey», неподправленный открытый ключ указан в поле «desc».

Источник: Bitcoin Core

Сводка условий расходования средств

Сводка наших двух примеров транзакций Taproot по расходованию средств показана на схеме ниже. Слева показано «стандартное» расходование средств, а справа — расходование с использованием Tapleaf и неподправленного открытого ключа.

Заключение

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

Мы благодарим Сьорса Провоста за участие в написании этой статьи.