Создание разных сетевых адресов из одного и того же открытого ключа?

У меня есть пробел в понимании генерации биткойн-адресов посредством хеширования. (Ниже я цитирую Антоноплюса для удобства, но я проконсультировался с несколькими другими источниками.)

По словам Антонполуса:

«Адрес биткойн получается из открытого ключа с помощью одностороннего криптографического хэширования (Antonpolous, 2014: 71)».

Я понимаю открытые ключи так, что они не меняются после создания из закрытого ключа (через умножение ECDSA):

«Поскольку точка генерации всегда одинакова для всех пользователей биткойнов, закрытый ключ k, умноженный на G, всегда будет давать один и тот же открытый ключ K» (Antonpolous, 2014: 68)».

Передовая практика в отношении биткойн-адресов рекомендует следующее:

«Для каждой транзакции следует использовать уникальный адрес. Большинство программного обеспечения и веб-сайтов Биткойн помогут в этом, генерируя новый адрес каждый раз, когда вы создаете счет или запрос на оплату» (Antonpolous, 2014: 188)».

Я понимаю, что выполнение хеш-функции для одних и тех же данных всегда будет давать один и тот же результат (дайджест):

«Для любого конкретного ввода результирующий хэш всегда будет одним и тем же, и его может легко вычислить и проверить любой, кто реализует тот же алгоритм хеширования». (Антонполус, 2014: 188).

Учитывая все вышеизложенное, у меня возникает вопрос, как можно сгенерировать разные адреса из одного и того же неизменного ввода, а именно открытого ключа?

Это двойное хэширование (SHA256 + RIPEMD160)? Это пул адресов? Это из-за детерминированных кошельков? Ответ, вероятно, прост и смотрит мне прямо в лицо, но я его не вижу. Спасибо за любые разъяснения.

Когда вы хотите сгенерировать новый уникальный адрес, вы начинаете с создания нового закрытого ключа, затем используете его для создания соответствующего открытого ключа, а затем хэшируете его для получения адреса. Вы не создаете новый адрес из открытого ключа, который у вас уже есть.
Обычно существует два подхода к получению нескольких адресов: 1) иметь несколько закрытых ключей 2) использовать BIP32.
@NateEldredge Спасибо! Я много видел о создании новых адресов для каждой транзакции, но не помню (или очистил), видя, что для каждой транзакции требуется новый закрытый/открытый ключ. Теперь очевидно, но не хочу делать никаких предположений.
@ColmanMcMahon: использование нового адреса рекомендуется, но не обязательно; если вы хотите, вы можете повторно использовать адрес, который вы использовали ранее (таким образом, повторно используя соответствующий закрытый/открытый ключ).
@NickODell: Читая вопрос, я задавался вопросом: действительно ли возможно сгенерировать два разных адреса, соответствующих одному и тому же открытому ключу, путем хэширования либо сжатой версии открытого ключа, либо несжатой?
@disckjet Да, верно.

Ответы (3)

Вы почему-то пришли к выводу, что можно просто получить несколько адресов из одного открытого ключа, но в цитируемом тексте об этом не сказано. В нем говорится, что открытый ключ однозначно генерируется из закрытого ключа (путем умножения генератора кривой G на случайное 256-битное число, которое является закрытым ключом). В нем также говорится, что адрес получен из открытого ключа путем его хеширования (RIPEMD160 и SHA256). Наконец, он говорит, что рекомендуется каждый раз использовать другой адрес.

Это не означает, что вы генерируете несколько адресов из одного и того же открытого ключа. Каждый раз вам нужно генерировать новый закрытый ключ, затем открытый ключ из этого закрытого ключа и, наконец, адрес из открытого ключа.

Спасибо. Это и было источником моего замешательства (мой «разрыв»). Я ценю разъяснение этого фундаментального шага. Каждая транзакция требует своего собственного уникального закрытого ключа, открытого ключа, адреса и подписи.

Чтобы подкрепить хорошие ответы, уже данные о парах ключей...

«В качестве дополнительного брандмауэра для каждой транзакции следует использовать новую пару ключей, чтобы предотвратить их привязку к общему владельцу».

Сатоши Накамото, технический документ Биткойн, 2009 г., стр. 6:

Что с минусом? Это хорошая ссылка.
действительно, наложил вето;)

Что касается дальнейшего уточнения вопроса, принимая во внимание, что абзац, указанный в вопросе, просто подразумевает, что для каждого запроса должны создаваться разные частные/общедоступные пары:

«Для каждой транзакции следует использовать уникальный адрес. Большинство программного обеспечения и веб-сайтов Биткойн помогут в этом, генерируя новый адрес каждый раз, когда вы создаете счет или запрос на оплату» (Antonpolous, 2014: 188)».

на самом деле всегда можно сгенерировать как минимум три разных действительных биткойн-адреса из одного и того же открытого ключа, поскольку всегда существует гибридная , сжатая и несжатая форма одной и той же пары открытых/закрытых ключей .
Так, например, открытый ключ (x, y):

(50863ad64a87ae8a2fe83c1af1a8403cb53f53e486d8511dad8a04887e5b2352, 
 2cd470243453a299fa9e77237716103abc11a1df38855ed6f2ee187e9c582ba6)

с соответствующим уникальным закрытым ключом, может быть выражен с помощью этих трех разных адресов:

16UwLL9Risc3QfPqBUvKofHmBQ7wMtjvM
1PMycacnJaSqwwJqjawXBErnLsZ7RkXUAs
1DcuACZPCeAEmvSPzKiF8pAaZAEY1XPyue

которые на самом деле соответствуют совершенно разным биткойн-адресам, но ко всем из которых, в принципе, можно получить доступ с одной и той же парой закрытых/открытых ключей.