Как проверяются транзакции только с биткойн-адресом, а не с открытым ключом?

Я понимаю, как работают асимметричные криптосистемы и цифровые подписи:

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

У вас есть набор функций:

  • зашифровать (открытый ключ, обычный текст) = зашифровать текст
  • расшифровать (закрытый ключ, зашифрованный текст) = обычный текст
  • знак (закрытый ключ, обычный текст) = подписанный текст
  • verify_signature (открытый ключ, подписанный текст) = is_signature_valid_bool

Однако в Биткойне адреса представляют собой хешированные версии открытого ключа. Невозможно «отменить» хеширование. Следовательно, я не уверен, как проверяются транзакции.

Я предполагаю, что тогда вопрос заключается в том, что на самом деле передается кому/хранится, когда я хочу совершить транзакцию. Я предположил:

  • Введите биткойн-адреса
  • Выходные биткойн-адреса
  • Подпись транзакции со всеми закрытыми ключами входного адреса (я думаю, в порядке ввода)

... но тогда я не вижу, как выполняется проверка. Итак, я предполагаю, что вы отправили свой открытый ключ (ключи) при создании транзакции. Это объясняет, почему вам не следует снова использовать какой-либо адрес после того, как вы потратили с него деньги. Меня смущает то, что я не вижу здесь открытых ключей

Следующее непонятное — это порядок. Существует ли неявный порядок применения подписей? Я предполагал, что это будет сделано с помощью Script , но я не вижу этого в обозревателе блоков.

Может ли кто-нибудь пролить свет на это?

Неответы

Ответы (2)

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

Ваша ссылка на блок, который сам не подписан. Однако давайте посмотрим на транзакцию из вашего блока: https://www.blockchain.com/btc/tx/b8f925d09c647904e428d902c8404fc91e5dbe53773b82d717cf13374785ca20 .

Прокрутите вниз до «входов», а в разделе Sigscript 3045022100c89735ddbb5e231044610590c086d41f1e871067987087ed48e041f8999314830220011deba08ad9a67ddafe51dc530f3f60c8974373bf2f25953a89c139d238216201— подпись ECDSA и 023aa5b3f24a2b8fc8f64b69ba383b148892deef94cf060288cc99e81be0f9722eоткрытый ключ, соответствующий адресу.

Биткойн-транзакция создаст выходные данные, которые впоследствии можно будет использовать в качестве входных данных для новой транзакции. Каждый вывод будет привязан к тому, что называется scriptpubkey, что в основном устанавливает криптографическую головоломку, которая должна быть решена (т.е. возвращена trueпри запуске), чтобы эти монеты были потрачены. Любая транзакция, тратящая эти монеты, должна будет предоставить scriptsig(скрипт разблокировки), который удовлетворяет этой головоломке.

Так, например, при создании транзакции, которая оплачивается на биткойн-адрес «плата за открытый ключ-хеш» (P2PKH), открытый ключ, связанный с адресом, не будет известен в сети. Но когда эти выходные данные позже используются в качестве входных данных для новой транзакции, scriptsig, который разблокирует эти монеты, будет включать публичный ключ наряду с действительной подписью, и, таким образом, сетевые узлы смогут проверить, что законный владелец этих монет делает транзакции. потратить (путем хеширования предоставленного публичного ключа и проверки того, что вывод хэша соответствует биткойн-адресу, к которому привязаны монеты).


Что касается порядка подписей, вот несколько вопросов/ответов с некоторыми полезными деталями:

Что именно хэшируется и подписывается в segwit-транзакции

Необходим пошаговый пример погашения необработанной транзакции

Как выкупить базовый Tx?

Как подписать транзакцию SegWit через NBitcoin?

Что такое дайджест подписи для выходов Segwit


Другие соответствующие вопросы, которые я нашел:

Как работают скрипты?

Какая связь между scriptSig и scriptPubKey?