Перейти к содержимому
buybitcoinsmart

Глоссарий / Адреса и ключи

Деривация BIP-49

Что такое Деривация BIP-49?
Деривация BIP-49 помещает счета с вложенным SegWit на отдельную ветвь m/49'/0'/0', поэтому кошелек, который не умеет их читать, показывает пустой экран, а не неверный баланс.

Определено в BIP-49.

BIP-49 закрепляет первый усиленный уровень дерева ключей, 49', за счетами, адреса которых представляют собой P2WPKH, вложенный в P2SH. Он был назначен 19 мая 2016 года и позже получил собственные байты версии расширенных ключей: 0x049d7cb2 для ypub и 0x049d7878 для yprv. Если ваш кошелек экспортирует ключ счета, начинающийся с ypub, именно по этой ветви и должен идти поиск при восстановлении.

Как это работает

BIP-49 решает два вопроса: какая ветвь дерева BIP-32 хранит ключи вложенного SegWit и как из ключа на этой ветви строится адрес.

Ветвь заимствует шаблон из пяти уровней, который уже использовал BIP-44, m / purpose' / coin_type' / account' / change / address_index, и меняет ровно одно число. Назначение становится 49' вместо 44'. Тип монеты, счет, цепочка и индекс сохраняют значения, которые им дал BIP-44.

Часть с адресом механическая: хешируется сжатый публичный ключ, результат из 20 байт оборачивается в скрипт погашения из 22 байт, затем хешируется этот скрипт, чтобы получить то, на что ссылается выход. Спецификация записывает две части как scriptSig: 0x160014{20-byte-key-hash} и scriptPubKey: 0xA914{20-byte-script-hash}87.

Интересна здесь опция, которую автор отверг. Weigl перечисляет два подхода: сохранить уже имеющийся счет и привязать адреса вложенного SegWit к тем же публичным ключам либо создать отдельные счета под новое назначение. Первый удобнее, пока что-то не пойдет не так, и тогда, по словам спецификации, счет "might show up but also it might miss some UTXOs". BIP-49 выбрал отдельные счета именно потому, что эта опция "fails in a more visible way". Пустой экран сообщает об ошибке лучше, чем правдоподобное неверное число.

Сериализация со временем получила то же решение: расширенные публичные ключи на этой ветви используют байты версии 0x049d7cb2, кодирование base58 дает префикс ypub, для yprv используется 0x049d7878, а в тестовой сети upub и uprv.

Где это видно

BIP-49 проявляется как расширенный ключ, начинающийся с ypub, а не с xpub, и как счет вложенного SegWit, который кошелек показывает рядом с нативным. Mycelium, которому этот сайт дает оценку 3,7, содержит счета нативного и вложенного SegWit в одном приложении, это две схемы, которые SLIP-0132 регистрирует под zpub и ypub.

Префикс ypub был добавлен позже, и эта история до сих пор заметна. BIP-43, который ввел уровень назначения в 2014 году, указал разработчикам сохранять 0x0488B21E и префикс xpub для любого назначения. BIP-49 поначалу вышел именно так, а SLIP-0132, созданный 8 февраля 2018 года для надлежащей регистрации байтов версии, прямо описывает результат: неизмененный префикс привел к "unsustainable user confusion", поскольку либо пользователь должен был помнить, из какой ветви пришел xpub, либо принимающий инструмент должен был сканировать оба пространства адресов. Префикс является подсказкой, а не гарантией. Если вставить расширенный ключ в обозреватель блоков и он выведет адреса, начинающиеся с 1, тогда как кошелек показывает адреса, начинающиеся с 3, у вас ключ BIP-49 со старым префиксом, и инструменту нужно указать путь вручную.

Спецификация содержит тестовый вектор в тестовой сети, по которому стоит проверять инструмент: фраза abandon, повторенная одиннадцать раз, затем about, корень счета m/49'/1'/0', первый адрес для получения 2Mww8dCYPUpKHofjgcXcBCEGmniw9CoaiD2.

Деривация BIP-49 vs вложенный SegWit

Деривация BIP-49 является правилом о ключах, а вложенный SegWit представляет собой шаблон, который видит цепочка; обычно они идут вместе, но ни один не подразумевает другой. Выход является вложенным SegWit из-за скрипта, на который он ссылается, и ничто в нем не записывает, какой путь породил ключ. Кошелек может построить такой выход из импортированного приватного ключа или с помощью подхода, который BIP-49 отверг, когда из публичных ключей, уже находящихся в счете BIP-44, выводился второй адрес P2SH. Знание того, что ваши биткоины находятся на адресах, начинающихся с 3, поэтому не говорит, откуда восстанавливать, и именно поэтому путь счета должен быть записан рядом с резервной копией сид-фразы.

Не путать с

Часто задаваемые вопросы

Почему мой расширенный публичный ключ начинается с ypub, а не с xpub?

Потому что он сериализован с байтами версии, которые BIP-49 назначает этой ветви, 0x049d7cb2, и в base58 они кодируются как ypub. Префикс является обозначением схемы деривации, а не другим типом ключа, и SLIP-0132 регистрирует его наряду с xpub и zpub.

Устарел ли BIP-49?

Нет. В заголовке самого BIP по-прежнему указано Deployed, и кошельки, создавшие счета на ветви 49', продолжают выводить их обычным образом. Ничто в спецификации не отозвало эту ветвь, и биткоины, находящиеся на ней, не требуют спасения.

Можно ли по адресу определить, получен ли он по BIP-49?

Нет. Выход P2SH записывает только хеш скрипта, на который он ссылается, поэтому адрес, начинающийся с 3, ничего не говорит о стоящем за ним пути. Запишите путь счета вместе с резервной копией, а не пытайтесь вывести его позже.

Читайте далее

Связанные термины

Еще в разделе «Адреса и ключи»

Читать эту страницу на английском