Глоссарий / Адреса и ключи
Дочерний ключ
Другие названия: Дочерний публичный ключ, Дочерний приватный ключ, Child key.
- Что такое дочерний ключ?
- Дочерний ключ получается на шаге вывода, а не из генератора случайных чисел, и определяется индексом, который родительский ключ использовал для его создания.
Определено в BIP-32.
Ничто в дочернем ключе не слабее ключа, стоящего над ним. Дочерний ключ представляет собой полноценный приватный ключ на 256 бит со своим собственным кодом цепочки, способный подписывать транзакции и, в свою очередь, иметь дочерние ключи. Это слово описывает положение в дереве, и в стандартном кошельке ключи, которые фактически хранят ваши биткоины, находятся на пять уровней ниже корня.
Как это работает
Для получения дочернего ключа нужны один хеш и одно сложение. Код цепочки родителя становится ключом для HMAC-SHA512, данные представляют собой материал родительского ключа, за которым следует четырехбайтовый индекс, а результат из 64 байт делится пополам. Правые 32 байта становятся кодом цепочки дочернего ключа. Левые 32 байта прибавляются к приватному ключу родителя по модулю порядка кривой secp256k1, и сумма является приватным ключом дочернего ключа.
Именно из-за этого сложения публичный вывод вообще возможен. Прибавление числа к приватному ключу соответствует прибавлению точки к публичному ключу, поэтому программное обеспечение, располагающее только публичной частью, может вычислить тот же дочерний публичный ключ, ни разу не увидев секрета. BIP-32 также описывает случай, когда результат хеширования выходит за допустимый диапазон, вероятность чего он оценивает ниже 1 к 2 в степени 127, и предписывает пропустить этот индекс и перейти к следующему.
Соседние ключи ничего не выдают. Два дочерних ключа одного родителя не имеют ничего общего, что наблюдатель мог бы заметить по их адресам, и именно поэтому стоит использовать новый адрес для каждого платежа. Связь между ними может восстановить только тот, у кого есть расширенный публичный ключ родителя.
Где это видно
Кошелек фактически строится из дочерних ключей, поэтому вы встречаете их как номера индексов, а не как ключи.
Откройте экран управления монетами в Sparrow или Electrum, и у каждого адреса будет свой путь: m/84'/0'/0'/0/7 означает восьмой адрес получения первого счета, считая с нуля. Подтвердите вывод на Trezor или Ledger, и устройство покажет тот же путь рядом с адресом, и так вы проверяете, что адрес назначения принадлежит вашему собственному дереву, а не тому, кто скомпрометировал компьютер.
Стоит обращать внимание и на глубину. Мастер-ключ находится на глубине 0, а в пути в стиле BIP-44 ключ, подписывающий платеж, находится на глубине 5. Каждый уровень между ними является дочерним по отношению к уровню выше и родительским по отношению к уровню ниже, поэтому оба слова описывают отношение, а не ранг.
Отсюда следует одна привычка. Никогда не экспортируйте отдельный дочерний приватный ключ из HD-кошелька, если только вы не намерены полностью отказаться от этой ветви. Неупрочненный дочерний приватный ключ вместе с расширенным публичным ключом родителя раскрывает расширенный приватный ключ родителя, поэтому один неосторожный экспорт может отдать целый счет, а не один адрес.
Дочерний ключ vs родительский ключ
Дочерний ключ и родительский ключ представляют собой один и тот же вид объекта, рассматриваемый с противоположных концов одного шага вывода. Каждый ключ, кроме мастер-ключа, является чьим-то дочерним, и каждый ключ, из которого что-либо было выведено, является чьим-то родительским, поэтому узел на m/84'/0'/0' является и тем и другим одновременно. Асимметрия заключается в том, что именно способен вычислить каждый из них. Родитель бесконечно получает свои дочерние ключи, тогда как дочерний ключ сам по себе ничего не говорит о ключе над ним. Это одностороннее свойство составляет всю модель безопасности дерева, и именно упрочненный вывод обеспечивает ее односторонность.