Глоссарий / Кошельки и хранение
Деривация сида
- Что такое деривация сида?
- Деривация сида представляет собой одностороннюю функцию, которая преобразует мнемоническую фразу вместе с необязательной кодовой фразой (passphrase) в сид размером 512 бит, из которого кошелек фактически строит ключи.
Определено в BIP-39.
Эта функция представляет собой PBKDF2 с HMAC-SHA512, которая выполняется над самими словами, а не над случайностью, лежащей в их основе. BIP-39 фиксирует число итераций на значении 2048 и размер выходных данных в 64 байта, а ваша кодовая фраза дописывается к фиксированному слову "mnemonic", образуя соль. На этом шаге ничто не проверяет, были ли слова когда-либо корректными, поэтому фраза с опечаткой все равно дает корректно сформированный сид и пустой кошелек.
Как это работает
Деривация сида принимает два входа и возвращает один выход, за один вызов, без состояния и без памяти о том, что породило слова. Мнемоническая фраза служит паролем. Солью является текст "mnemonic" с любой кодовой фразой, дописанной в конец, а при отсутствии кодовой фразы ее место занимает пустая строка. Оба входа сначала проходят нормализацию Unicode NFKD, поэтому символы с диакритическими знаками во французской или испанской фразе хешируются одинаково, какая бы клавиатура их ни набирала.
BIP-39 указывает, что эта половина стандарта является "completely independent" (полностью независимой) от половины, которая генерирует фразу, и говорит об этом одобрительно: ограничений на структуру фразы нет, и клиенты могут писать собственные списки слов или даже целые генераторы фраз. Практическое прочтение более прямое. Подайте функции двенадцать бессмысленных слов, и она вернет 64 вполне пригодных байта. BIP-39 требует, чтобы программное обеспечение вычисляло контрольную сумму вне этого шага и "issue a warning if it is invalid", то есть предупреждало, а не отказывало, поэтому некоторые инструменты восстановят фразу, которую они только что назвали неверной.
Из хеширования фразы, а не лежащей за ней энтропии, следуют два последствия. Пословный перевод фразы на другой язык дает совершенно иной сид, потому что входные байты изменились, хотя лежащая в основе случайность осталась прежней. И обратное направление никогда не работает: произвольный сид BIP-32 нельзя записать обратно в виде фразы BIP-39, поэтому «экспортировать сид» и «экспортировать слова» являются разными запросами.
Где это видно
Деривация сида выходит на поверхность в тот момент, когда две программы расходятся в том, какую функцию запускать. Резервная копия с разделением на части на Trezor Safe 3 и Safe 5, оба устройства рассмотрены на этом сайте, использует SLIP-39, а не BIP-39: список из 1024 слов читается по 10 бит за раз, что дает 20 слов на часть для секрета размером 128 бит и 33 слова для секрета размером 256 бит. Эти части никогда не проходят шаг PBKDF2 из BIP-39. SLIP-39 был опубликован самими авторами BIP-39 в качестве замены и винит "the overly coupled design of BIP-0039 and its use of a one-way derivation function" в том, что части нельзя преобразовать обратно; преобразование в обратном направлении работает, но требует, чтобы каждая полученная часть состояла из 59 слов, с какой бы длины вы ни начинали.
Обзор Coldcard на этом сайте показывает, чего деривация сида не может сделать для вас. Миграция прошивки в марте 2021 года привела к тому, что генерация сида брала данные из программного генератора псевдослучайных чисел, а не из аппаратного, и Coinkite обновила свое предупреждение 1 августа 2026 года. Сам процесс деривации сида ни разу не дал сбоя. Он превратил слабый секрет в корректно сформированный сид из 64 байт с действительной контрольной суммой, и ни один кошелек дальше по цепочке не имел способа это заметить.
BIP-39 публикует тестовые векторы, которые позволяют увидеть, как работает функция, ничем не рискуя: они сопоставляют энтропию, мнемоническую фразу и полученный сид, причем в каждом векторе используется кодовая фраза "TREZOR".
Деривация сида vs путь деривации
Деривация сида происходит один раз, до того как существует хотя бы один ключ; путь деривации запрашивается после, каждый раз, когда нужен адрес. Эта разница решает, насколько серьезным окажется восстановление, выглядящее пустым. Неверный путь является настройкой: измените тип скрипта, запустите повторное сканирование, и баланс появится. Неверная кодовая фраза меняет сид, а это меняет все дерево под ним, и никакая настройка нигде не вернет прежний сид.