Как я могу проверить, сжат биткойн-адрес или нет?

У меня есть два биткойн-адреса:

1D8VSXHFAWNhAbruwUMbNp4hsXAnRNkYvX
12T15tvMGaymMX97X9KxVzyLF323r8v6Hg

Один сжат, другой нет.

Как я могу проверить, что есть что? (Желательно использовать Python 2.7)

Заранее спасибо :)

Ответы (4)

Вы не можете определить (только по адресу base58check), сжат ли соответствующий открытый ключ.

«Обычный» хэш с оплатой по открытому ключу (P2PKH) — это криптографический хэш либо сжатого, либо несжатого открытого ключа. Поскольку хэши невозможно реверсировать, вы не можете сказать, был ли открытый ключ перед хэшированием сжатым или несжатым.

В частности, открытый ключ в биткойне представляет собой пару целых чисел (x, y). Для несжатых открытых ключей эти целые числа кодируются как 256-битные целые числа без знака с обратным порядком байтов , объединяются вместе, а затем добавляются к одному байту 0x04. Результат имеет длину 65 байт.

Для сжатых открытых ключей кодируется только координата x (как и выше, как 256-битное целое число без знака с обратным порядком байтов). Оказывается, координата y может принимать только одно из двух значений: одно четное и одно нечетное. Вместо одного байта 0x04 добавляется один байт 0x02 или 0x03 в зависимости от значения y (0x02 для четных, 0x03 для нечетных). Результат имеет длину 33 байта.

Наконец, эти байты (из одного из двух абзацев выше) проходят процесс преобразования адресов, описанный здесь, в Руководстве разработчика bitcoin.org , который включает в себя взятие необратимого криптографического хэша (фактически, двух хэшей).

Обратите внимание, что для погашения UTXO, связанного с адресом P2PKH, искупитель должен создать транзакцию, включающую несжатый открытый ключ, сжатый или несжатый. Если такой tx существует в блокчейне, его можно подключить к его «обычному» адресу base58check. Это одна из причин, по которой повторное использование адресов не рекомендуется: как только вы активируете UTXO, вы «раскрываете» свой открытый ключ, который немного более чувствителен, чем ваш биткойн-адрес.

Справочная информация:

Учитывая только сам адрес, нет, нет способа определить, был ли он сгенерирован из сжатого или несжатого открытого ключа. Это вычисляется из кодировки base58 RIPEMD (SHA256 (public_key_bytes)). Поскольку хэш необратим, без открытого ключа вы не сможете получить больше информации.

Просто посмотрите на декодированные данные base58:

$ decodeBase58 12T15tvMGaymMX97X9KxVzyLF323r8v6Hg
000FE302E0D96D9F9AA71738A426A9696EB49AD458679BAFD3

$ decodeBase58 1D8VSXHFAWNhAbruwUMbNp4hsXAnRNkYvX
00850C296420DC9B02CE237ED630B89815E0803EA3BED0F344

Байт версии равен 0x00 в обоих случаях, затем идут 20 байт хэша и 4 байта контрольной суммы. Ничто из этого не раскрывает никакой информации о том, какая информация была хеширована.

Адрес — это хэш публичного ключа (плюс контрольная сумма и версия). Хэши необратимы и распределяются случайным образом, поэтому невозможно определить публичный ключ по публичному хэшу.

Как уже упоминалось, короткий ответ - нет, но с помощью ключа WIF ( формат импорта кошелька ) вы можете определить, сжат ли адрес или нет, проверив последний байт, если он есть 0x01.