5.Мультичейн-кошельки с "мульти-сидами". Algorand & Monero
Постановка текущей задачи: решение проблемы вычисления приватных ключей (сид-фраз) блокчейнов Algorand и Monero в мультичейновых кошельках.
skin spot olympic dice column permit diagram ugly traffic gentle trend angle
1.Пусть мы имеем файлы со списком сид-фраз, которые нужно проверить. Очень вероятно, что они относятся к мнемоникам, сгенерированными популярными мультичейновыми кошельками — Trust Wallet, Exodus, Guarda, Atomic и др. (млн юзеров).
2. Кошельки (и блокчейны) Monero и Algorand не поддерживают ни формат сид-фраз (см.п.4.1-4.2), ни BIP-39, BIP-32, BIP44
- Популярные криптокошельки показывают адреса, приватные ключи «нестандартных» блокчейнов, а некоторые кошельки генерируют и сид-фразы.
Результат работы программы (python):
BIP39 mnemonic: skin spot olympic dice column permit diagram ugly traffic gentle trend angle
Wallet:Exodus
Algorand private key: 7167c65cefaadb6e7777cd8b08c3f4c7297e4c1651c34d39537d84c1c86d82a5
Algorand mnemonic: until book purpose puzzle resemble sweet roof sniff badge around whip organ wisdom narrow master select claim erupt dirt blue muscle opinion clown absent nerve
Wallet:Atomic
Algorand private key: 67cb62c307b627a19937a3a8c7baf0c6aa9bfcf135a0f7cbcf61f29b13c6eb48
Algorand mnemonic: hollow menu ticket gather exhaust hair rubber permit vital twelve joke property dance left question parent leave dish couch sand cheese various elder able wing
Wallet:Coinomi, Trust Wallet
Algorand private key: 3080b44b9d1c3de2d9183c2af1893a8824eb33b5ef7c76ee3faf1cf929b915ef
Algorand mnemonic: alcohol spirit place six kick joy short despair census chief bubble embrace stone erupt laundry language solution zero fiscal mushroom fault hour judge abstract medal
Wallet:Leger
Algorand private key: b860fef09200fcae30745a33a0df433c530c78e78432d4776fd53763cc0bee5e
Algorand mnemonic: blade wet journey ankle way close pave foil all leader capable critic board task cheese crater whisper saddle turkey cricket occur load wash able parrot
Здесь 4 варианта мнемоник. И наверняка найдет и 5й, и 6й.
Во-первых, так проще разработчикам — использовать какой-то класс в коде, для KDF на базе криптографии конкретной эллиптической кривой (ECC) для всех случаев, где необязательно поддерживать классический BIP-44 (см.рис.6). Это истинно 100%.
А во-вторых (уже мое личное предположение), так проще привязать клиента( = =$). Что он сделает увидев нулевой баланс в другом кошельке, после переноса сид-фразы?...Останется где и был, от греха подальше - особенно если балансы раскинуты по многим токенам и отправлять их поштучно не хочется(%,$).
так как в каждом блокчейне вычисляются из хеш-функции, параметрами которой служат Key = chaincode (первый раз — правая половина master-seed), Data =паблик ключ, вычисляемый из приватного, и 32-битное число (индекс), включающее в себя как глубину в иерархии, так и индекс криптовалюты m/purpose'/coin_type'/account'/change/
Важно. Зная мастер-сид, 64 символа, программным образом можно получить приватники любой крипты кошелька, при этом не зная самой сид-фразы кошелька.
Вывод: библиотеке Алгоранда (открытой), включенной в состав мультичейнового кошелька, закрытый код кошелька может «скормить» в качестве приватного ключа любые 32 байта, полученные из общей исходной seed-фразы.
Практически все написанное об Алгоранде выше относится и к Monero (XMR) в мультивалютных кошельках.
Мне удалось подобрать кривые, получить код (питон) и потестировать его для нескольких популярных кошельков (Atomic, Coinomi, Exodus, Guarda) которые вычисляют из мнемоники BIP-39 соответствующую мнемонику (25 слов) Monero.
6. Получение новых сид-фраз путем анализа зависимостей
BIP39 mnemonic: skin spot olympic dice column permit diagram ugly traffic gentle trend angleи ниже ее seed (hex). Легко заметить, что приватный ключ Algorand — левая половина seed. То есть Master Priv_key всего нашего кошелька. И 25 слов — соответствующая приватному ключу мнемоника в Алгоранде.
Да, в отличие от BIP-39, здесь мнемоника получается из приватного ключа. Однако, верно и обратное. Вот так
import algosdk
import base64
from algosdk import encoding
from algosdk import mnemonic
import nacl
from nacl.signing import SigningKey
#генерируем случайное 32 байтное число (энтропия), считаем его приватным ключом
# Private key for producing digital signatures using the Ed25519 algorithm. - из подсказки-описания класса SigningKey
sk = SigningKey.generate()
print (bytes(sk).hex())
# вычисяем публичный ключ
vk = sk.verify_key
print (bytes(vk).hex())
# получаем адрес
addr = encoding.encode_address(vk.encode())
print (addr)
#формируем расширенный приватный ключ
print (bytes(sk.encode() + vk.encode()).hex())
private_key = base64.b64encode(sk.encode() + vk.encode()).decode()
print (private_key)
#Получаем мнемонику из приватного ключа
print (f"Mnemonika:{mnemonic.from_private_key(private_key)}")
Итак, речь о кошельке Atomic. Заходим в его настройки, смотрим приватные ключи всех coins и, удивляемся. Результат в схеме (подчеркну, не полный). Из нашего сида без какого-то бы ни было хеширования Атомик раздает приватный ключ встроенным библиотекам блокчейнов (как минимум, трем), напряму
priv_keypolkadot → (seed XMR; seed ALGO)
Где приватный ключ polkadot, вообще говоря, — любой.
Отмечу, что импортировать приватный ключ из Атомика в кошелек polkadot.js.org легко. Сид-фразы мы при этом не получим (ECC sr25519, поле мнемоники останется пустым), но доступ ко всем богатствам парачейнов обеспечен (солидная система крипто-пирамид, кстати).
Первый адрес на скриншоте — тот что получен из нашей seed-фразы (отличается, ибо это уже хеш sr25519), а второй — из приватника Атомика, и здесь уже адреса с Атомиком совпадают.
А вот с Монеро обратный ход так легко не получится. Скромная функция sc_reduce, частично преобразует исходный приватный ключ. В элемент заданного поля (условно — на кривой). При определенных условиях возможна обратимость (опускаю детали), но редко и требуются вычисления. Зато однозначно ломается анонимность XMR, если ее можно связать с другими криптовалютами холдера — виден вектор потенциального деанона.
Формально с сид-фразой Алгоранда можно сделать тоже самое
priv_keyALGOt → (seed XMR; priv_keypolkadot)
Юзеры кошельки меняют часто (хочется быстрее, надежнее, меньше %, у которых есть моб. версия и тд и тп), комиссию же платить не хочется, хочется импортировать секрет.
В интерфейсе Атомика в разделе приватных ключей пользователь видит сид кошелька — 64 символа ( hex) у токена алгоранда, т. е. мастер-сид кошелька целиком. Но не видит мнемонику алгоранда из 25 слов, как в Exodus (рис.9)
Тогда куда? Например, Трастваллет откажет в импорте, пока не удалишь половину (предполагаем, что холдер= обыватель, который не захочет разбираться в длине ключа).
Перебрав разные кошельки, нашелся красивый, рабочий путь — импорт 64-символьного приватника в Guarda (ну очень дружелюбного). Так формируется цепочка импорта, если моделировать возможные действия холдера:
Atomic (привкей) —> Guarda (привкей + мнемоника 25 слов) —> Pera Wallet (25 слов)
Таким образом, если удастся слить приватник или сид-фразу Pera Wallet, то есть смысл проверить балансы на зависимых в Атомике криптовалютах:
вероятность не самая маленькая, учитывая, что пользователей каждого из трех упомянутых кошельков — миллионы.
В сид-фразах это выглядит так:
- из-за нарушения безопасности криптокошельками создаются зависимости между сид-фразами разных блокчейнов и кошельков.
Например, слитая сид-фраза Алгоранда из 25 слов кошелька Pera Wallet может показать сид-фразу Монеро из 16 слов (или прив. Ключ), если их когда-то породил Атомик, а потом юзеры мигрировали в нативные или популярные кошельки блокчейнов.
Не удивлюсь, если большая часть отработки строится по такому принципу:
из вашей сид-фразы вычисляется только лишь 4 варианта мнемоник Алгоранда (по 25 слов). Добавить вычисление из приватного ключа мнемоники Алгоранда еще и вычисление сид-фраз Монеро(рис.18) или не добавить, окупится потеря своего и серверного времени - решать вам. Но в любом случае нужно знать что такие связи в принципе существуют и пренебрегать ими абсолютно всегда- чревато потерями.
7. Расширение базы за счет устаревших сид-фраз
Рассмотрим на примере старых фраз Монеро и Электрума.
Устаревшие ныне версии Монеро пользовались набором слов для сид-фраз от Электрума — также устаревшей (для Электрума) версии.
Соответственно, старая сид-фраза из 24 слов, невалидная для BIP-39, может относится либо к Электруму (поддерживает старый формат), либо к Монеро -либо одновременно к обоим.
Старые сид-фразы Монеро также поддерживаются кошельками Монеро.
На практике, сид-фраза монеро из 25 слов может быть конвертирована в старый формат 24 слова от Электрума, которые в свою очередь могут использоваться в Электруме и его клонах и по сей день (он их поддерживает).
Верно и обратное (электрум - монеро).
8. Дополнения сид-фраз в виде иерархических списков (BIP-85)
Одно из предложений по улучшению блокчейна - BIP-85 (https://github.com/bitcoin/bips/blob/master/bip-0085.mediawiki) развивает идею генерации индексированных дочерних сид-фраз из любой исходной. По некоторым правилам
Пусть master seed = "skin spot olympic dice column permit diagram ugly traffic gentle trend angle"
Тогда, если выбран параметр длина = 12 слов (а можно еще 18 и 24), язык = англ., то
seed(0) = "total adapt must job economy target bamboo force park guess pulp layer"
seed(1) = "ecology blur visit pen foam mention wrap rival crazy mango mouse similar"
........................
seed(1000) = "churn worry utility boil end maple trip flag post guess raven enrich"
.................... и тд
Все отсюда https://iancoleman.io/bip39/#english, c выставленной опцией BIP85
Логика такого изобретения оправдывается распределением по функционалу сид-фраз и контролем за всеми дочерними мнемониками (рис).
Иерархии нет, есть детерминированность, что означает восстановление дочерней фразы по индексу. И всего лишь. Ни мастер-сид, ни соседние фразы получить нельзя никак.
Кошельков, которые бы поддерживали идею очень мало, но они есть. Как и есть энтузиасты BIP-85, судя по тредам на reddit и др. площадках .
Еще одно преимущество - в силу экзотичности отработчики на BIP85 мнемонику обычно не проверяют. Вы будете в числе первых.
С "имплементацией" BIP85 в питон возникают проблемы, т.к. приходится опираться на чужие либы, подторможенные и проч. (решено)
9. ИТОГИ
Итак, у нас есть сид-фразы, из которых мы хотим извлечь как можно больше полезной информации
Что такое "стандартная проверка балансов"? Могу только предположить (я не знаю), что у профессиональных отработчиков софт должен опираться на зависимости, вроде таких:
где KDF - функция деривации ключей, применяемая для конкретного блокчейна, включающая в себя и путь деривации. То есть, скорее всего, у профессионалов речь идет уже о БД .
Как изъясняется товарищ с эксплойта, кодер, подаривший полупаблик с жирком ( за что отдельная благодарность) "я делаю просто: хуяк-хуяк, подставил сид в траст валлет, он все и показывает - и балансы токенов, и “стейкинг". Увы, метод работает не на 100%. Чтоб далеко (в Polkadot) не ходить, достаточно эфира - баланс с кошелька Атомика Траст Валлет не покажет (разный путь).
Что касается наших целей - вычислить дополнительные сид-фразы, связанные с полученными, то результат сведен в схему. В подзаголовках- примеры.
Остались никак не рассмотрены варианты зависимостей сайдчейнов и парачейнов, импортируемых кошельков, мнемоники для бэкапов и тд.
Некоторые пояснения к новым блокам схемы, кратенько
1.Немного о Tron. Можно представить ситуацию, когда формальная, простая проверка через API Trona покажет что на аккаунте нашей мнемоники — 0 (овнер), а на подчиненном кошельке (тоже сид у нас) — крипта есть, но ограничена каким-то овнером. Не знаю при проверке trx, все сопоставляют сид-фразы по зависимости аккаунтов или нет.
2.Пример сайдчейна NEO X: адрес EVM, но debank не увидит в принципе (токен GAS) и со стороны NEO N3 тоже проблемы чекинга.
3. 12+1=13
Видела советы как сгенерировать сид-фразу Монеро из BIP-39 по-своему. Записывайте рецепт (из социалки). Берем 12 слов (можно и 24) и начинаем в «калькуляторе» Монеро подставлять по очереди в качестве 13го (25-го) каждое из слов мнемоники, пока не получим валидную в Монеро сид-фразу (последнее контрольное слово всегда совпадает с каким-то из предыдущих слов мнемоники). Затем импортируем ее в MyMonero и радуемся. Впрочем, есть и автоматизация — попадались скрипты, написанные на эту тему.
Зачем так причудливо? Могу предположить, что 12 слов уже выбито..отчеканено, распечатано и попрятано по сейфам. А одно слово к 12 уже можно как-то и упомнить ...даже в уме. Чудаков в целом вроде немного. Но не так чтобы и мало. Для 12/24 слов с интересным балансом наверное есть смысл сгенерировать таким способом мнемонику из 13/25 слов и может быть пойти по цепочке дальше (рис.19).
Отмечу, что сид-фраза созданная вот так, «вручную», отличается от сгенерированной любыми другими распространенными методами (правила монеро из энтропии, криптокошельки).
То есть я показываю способ как из любой сид-фразы получить особым образом сид-фразу Монеро (12+1, 24+1) и точно знаю, что кто-то (небольшой %) им пользовался.
Общие выводы
- Итак, можно ли заработать на паблике новичку? Решать вам. Учитывая, что 99% этого материала отработчики знают и используют. А они ведь тоже этот самый паблик мониторят и... кстати, постоянно возмущаются, что выкладывается шлак. Парадокс?
- По чекингу сид-фраз, отданных сервисам, претензий на самом деле много. А подозрений, о проводках мимо кассы - еще больше.
Ну и также можно проверить эффективность сервисов на редких монетах (старых, блокчейнах и тд)
3. Для только начинающих - если хочется потренироваться, скачивайте архивы (не мои, из паблика):
- "супер-кошельки" - из тг канала (забыла какого, аккуратней: автовывод)
- файл с сид-фразами (как бы с транзакциями) - тг,
- этот же файл отчеканный ботом в тг ("бесплатный сервис", бгг... аккуратней!)
Онлайн инструменты
- https://iancoleman.io/bip39/#english
- https://coinomi.github.io/tools/bip39/
- https://algorand.oortnet.com/
- https://xmr.llcoins.net/addresstests.html
- https://monerotech.info/Home/Seed
- https://hdwallet.online/dumps/all/BTC
- https://tomeko.net/online_tools/base64.php?lang=en
- https://guggero.github.io/cryptography-toolkit/#!/aezeed
- https://secretscan.org/PrivateKey_wif_to_hex
- https://online.visual-paradigm.com/
LIMB