В этом посте по
пожеланию одного из пользователей форума я напишу инструкцию, как можно хранить резервную копию сид-фразы в блокчейне биткоина. Это не перевод и не пересказ (такая тема мне не встречалась), а только моя версия, как это можно сделать, поэтому конструктивная критика приветствуется. Ничего интересного и нового здесь не будет, просто собраны описания нескольких известных приемов для решения данной задачи. Дисклеймер: так как я не могу гарантировать 100% безопасность и работоспособность этого метода в будущем, я не могу советовать вам его использовать. Короче говоря, если что - я не виноват ). Сам я этот способ буду использовать как резервный и со страховкой. Страховкой служит надежная парольная фраза к сиду (известная как passphrase или 13-е (25-е) слово), которая, естественно, хранится отдельно в офлайне (и в голове). С хорошей парольной фразой даже при компрометации 12 (24) слов, взломать весь сид практически нереально.
Сид-фразу мы поместим в блокчейн транзакцией с опкодом OP_RETURN, который позволяет отправить до 80 байт произвольной информации.
1. Шифруем сид и получаем 16-ричную строку.
Так как работаем с сидом, нужно обезопаситься и использовать "холодный" компьютер. Допустим, что у меня такого нет, поэтому я физически отключил интернет и загрузился с флешки
Tails (это такая анонимная и безопасная операционная система (linux) на флешке, если кто не знает).
Создаем текстовый файл seed.txt с сид-фразой (возьмем такую - runway exist coconut cinnamon attack laptop oil wild yellow drink lawn cattle), чтобы сократить строку, оставляю по 4 первые буквы каждого слова (этого достаточно для однозначной идентификации) и убираю пробелы (получилось runwexiscococinnattalaptoil_wildyelldrinlawncatt), сохраняем файл. Из этой папки запускаем терминал и даем команду:
openssl enc -aes-256-cbc -in seed.txt -out enc.txt -nosalt -k bitcointalk -iter 21000000
Тут я поставил плохой пароль bitcointalk для примера, в реальности нужно выбрать хороший пароль, длинный (символов 12 хотя бы),
уникальный, но желательно легко запоминающийся. 21000000 - это число итераций функции pbkdf2, такое огромное поставил, потому что я его легко вспомню, а главное - это сильно замедляет кодирование/декодирование (мой старенький комп почти 2 минуты шифровал/расшифровывал), что делает нереальным брутфорс и позволяет использовать не очень сложный пароль. Так, получили файл с шифрованным сидом, теперь нужно получить последовательность байтов (дамп). Даем команду:
xxd -ps -c 1000 enc.txt enc_hex.txt
-c 1000 здесь - число колонок, поставил от фонаря побольше (можно было 80 поставить), без этого ключа будет разбивать по 32 байта на строку, а нам нужно одной строкой. Сохраняем файл enc_hex.txt на флешку или жесткий диск компа, выключаем, вынимаем флешку, включаем интернет и загружаем обычную систему.
2. Нам нужно озаботиться тем, чтобы транзакцию с шифровкой потом нетрудно было найти. Можно, наверное, придумать разные варианты, можно ее просто записать, но я стремился ничего не записывать и поэтому выбрал вариант с созданием адреса из хеша любимого слова/фразы и последующим поиском адреса в блок-эксплорере. Для этого я использовал
этот brainwallet (можно любой другой), там в поле "Brain Wallet Input" вводим незабываемое слово-ключ, например имя любимой тещи, собаки итп, здесь секьюрность не важна, если украдут этот ключ, то и на здоровье. Для примера я ввел слово bitcointalk, получаем приватник L1AHAuRLxZ14PspT4UjooZa3Jx2Y9hcKfuQpC19b4AqHq8V12u9o, импортируем его в Electrum (созданием нового кошелька из приватника, я предпочитаю bech32-адрес, поэтому импортирую с соответствующим префиксом p2wpkh:L1AHAuRLxZ14PspT4UjooZa3Jx2Y9hcKfuQpC19b4AqHq8V12u9o, в принципе, можно и легаси - особой разницы нет). Получили адрес bc1qc0kwr8clxgj63dp77sr4ql9zhexq2a6aw85ltw, перевели на него 300 сатоши (для сегвит-адреса и записи одного сида этого хватит, даже с запасом) ). С этого адреса сейчас будем отправлять транзакцию с OP_RETURN. Можно было и сразу это сделать, но я разбил на две транзакции для наглядности.
3. Копируем шестнадцатеричную строку из сохраненного в 1-м пунуте файла enc_hex.txt и в Electrum формируем транзакцию, поле "Pay to" заполняем так:
(запятую с нулем в конце не забываем).
Отправляем. Вот моя транзакция:
https://www.blockchain.com/ru/btc/tx/0e0546d004f3373822178ceddb3084247912e400b75e5971e66522f6b398f123
Теперь - как восстановить исходный сид?
4. Вспоминаем ключевое слово (bitсointalk в моем примере) и получаем адрес (как во 2-м пункте). Адрес вставляем в блок-эксплорер и легко находим нашу транзакцию. Жмем на нее, открываются детали, и внизу страницы видим наш зашифрованный сид 3222e79b5c94efcea7b8e1704e1bdd8fb9257baf7bbecf1a9bb5b5a5b8da094ad570dddc7754220
c2e2359081956d238ba24429639c90b2348f15f052617aab8. Сохраняемем эту строчку в текстовый файл (у меня enc_hex.txt) и переносим его на флешку.
5. Выключаем интернет, перезагружаемся в Tails. Там копируем с флешки файл с шифровкой, запускаем из папки с файлом терминал и даем команду:
xxd -ps -r enc_hex.txt enc.txt
Затем такую:
openssl enc -aes-256-cbc -d -in enc.txt -out seed.txt -nosalt -k bitcointalk -iter 21000000
(значение параметра -iter обязательно должно совпадать с тем, которое использовали при шифровании, поэтому важно его не забыть, лучше записать где-нибудь).
Всё, открываем файл seed.txt и переписываем на бумажку сид-фразу (разделяя слова по четыре буквы).
И последнее. Если вам необходимо сохранить сид-фразу из 24-слов, то они так просто не влезут в 80 байт. В этом случае шестнадцатеричную строку шифровки следует разбить на две части и создать два выхода OP_RETURN. Либо взять не мнемонику сид-фразы, а энтропию в iancoleman-конвертере, тогда получится ровно 80 байт.
p.s. Если кто-то хочет повторить, потренируйтесь сначала в тестнете, старайтесь не захламлять блокчейн бесполезным мусором.