При импорте закрытых ключей будет использоваться сжатый или несжатый формат?

Я изучаю реализацию поддержки сжатых открытых ключей в Vanity Pool . Однако у меня есть опасения по поводу импорта решений в желаемый тщеславный адрес в этом формате. Из того, что я вижу в объяснении того, как работает формат сжатого ключа , кажется, что один закрытый ключ может отображаться в два разных биткойн-адреса.

Есть ли способ указать в стандартном клиенте, какой формат следует использовать для импорта, или один из форматов всегда будет предпочтительным?

Ответы (1)

С криптографической точки зрения существует только один тип закрытых ключей и один тип открытых ключей. Закрытый ключ — это целое число в диапазоне от 1 до 1 15792089210356248762697446949407573529996955224135760342422259061068512044368, открытый ключ — это точка на эллиптической кривой secp256k1. Здесь нет магии.

Проблема в том, что Биткойн использует адреса, а адреса получаются из хэша открытого ключа. Поскольку вы не можете получить хэш математической концепции «точки», его необходимо сначала преобразовать в последовательность байтов. Стандартный биткойн следует следующим образом, однако определяет два способа преобразования открытого ключа в последовательность байтов: обычный (в результате получается 65 байтов) или сжатый (в результате получается 33 байта). Нет смысла использовать обычную, кроме конечно совместимости. Поскольку результирующая последовательность байтов отличается в обеих кодировках, адрес также будет другим. Если монеты были отправлены на один адрес, для их траты необходимо использовать кодировку открытого ключа, которая точно соответствует этому адресу.

Таким образом, чтобы поддерживать и то, и другое, мы должны помнить для каждой пары открытый/закрытый ключ, следует ли использовать обычное или сжатое кодирование. Как вы заметили, нам также нужна эта информация при импорте закрытого ключа. Для этого был расширен «Формат импорта кошелька» для закрытых ключей (форма base58, обычно начинающаяся с «5»). Если открытый ключ/адрес для определенного закрытого ключа должен быть получен из сжатого кодирования открытого ключа, закрытый ключ получает дополнительный байт 0x01 в конце, что приводит к форме base58, которая начинается с «K» или «L». '.

Итак, чтобы ответить на ваш вопрос: при импорте закрытого ключа в эталонный клиент он будет использовать обычную кодировку для открытых ключей, если для закрытого ключа использовался формат «5», и сжатую кодировку, если «K» / «L ' был использован формат. Нет смысла пытаться преобразовать одно в другое: клиент должен использовать ту же кодировку, которая использовалась при генерации адреса, иначе адрес не будет совпадать. К сожалению, довольно много программного обеспечения еще не поддерживает сжатые открытые ключи (что очень жаль, так как они экономят место в цепочке блоков).

Перечитывая ваш вопрос, я предполагаю, что вы уже знали большую часть моего ответа, но, возможно, это полезно для других.