Глоссарий / Адреса и ключи
Деривация 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, поэтому не говорит, откуда восстанавливать, и именно поэтому путь счета должен быть записан рядом с резервной копией сид-фразы.