Ввод ECDSA при переводе биткойнов от владельца A к владельцу B

Я хочу правильно оформить свои условия и понять, как работают транзакции в сети Биткойн.

Проще говоря, когда Алиса хочет перевести 1 BTC Бобу, Алиса подписывает сообщение своим закрытым ключом. Это сообщение передается функции кодирования ECDSA и подготавливается как Sig. У Алисы также есть публичный адрес Боба.

Я думаю, происходит следующее: подготавливается транзакция (запись? — можно ли ее так назвать?), состоящая из обратной ссылки на Tx ID Алисы, открытого ключа получателя (Боба), ввода/вывода для монеты и возможно другие данные. Хэш всех данных записи транзакции Боба используется в качестве нового Tx ID. Затем эта запись перемещается как неподтвержденная транзакция в пуле транзакций.

После проверки Sig in неподтвержденная транзакция Боба проверяется с помощью открытого ключа Алисы путем передачи Sig неподтвержденной транзакции, сообщения и открытого ключа Алисы алгоритму проверки ECDSA и проверки результата true/false (истина означает, что сообщение действительно было подписано пользователем). Алиса).

Мои вопросы (все краткие ответы, я думаю):

0) Можно ли ссылаться на структуру данных транзакции как на «запись транзакции»?

1) Я не вижу, где именно используется публичный адрес Боба, кроме как для заполнения новой записи транзакции. Означает ли это, что как только транзакция будет подтверждена, Боб может просто увидеть ее в своем кошельке, и только он может потратить монету в этой транзакции, потому что только у него есть ее закрытый ключ?

2) Какие конкретно элементы данных содержатся в сообщении (выделено выше)?

3) Публичный адрес Боба на самом деле закодирован в Base58. Означает ли это, что когда создается новая транзакция для Боба, биткойн-клиент сначала декодирует публичный адрес в кодировке Base58 обратно в публичный ключ, чтобы именно публичный ключ сохранялся в новой записи транзакции, а не публичный адрес?

Спасибо.

Ответы (2)

1) Я не вижу, где именно используется публичный адрес Боба, кроме как для заполнения новой записи транзакции. Означает ли это, что как только транзакция будет подтверждена, Боб может просто увидеть ее в своем кошельке, и только он может потратить монету в этой транзакции, потому что только у него есть ее закрытый ключ?

Адреса — это человеческая абстракция, и они нигде не появляются в транзакции. Транзакции представляют собой комбинацию входов и выходов.

Выходные данные содержат переданную сумму и некоторые условия, связанные с выкупом монет (известные как scriptPubKey). Входные данные компенсируют предыдущие выходные данные, предоставляя входные данные, необходимые для проверки условий отправителя (известных как scriptSig).

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

2) Какие конкретно элементы данных содержатся в сообщении (выделено выше)?

То, что именно подписывается, является разновидностью самой транзакции. Какой вариант зависит от флага, называемого sighash , который прикреплен к подписи.

3) Публичный адрес Боба на самом деле закодирован в Base58. Означает ли это, что когда создается новая транзакция для Боба, биткойн-клиент сначала декодирует публичный адрес в кодировке Base58 обратно в публичный ключ, чтобы именно публичный ключ сохранялся в новой записи транзакции, а не публичный адрес?

Нет, открытый ключ хэшируется перед кодированием в адрес. Хэширование — это односторонняя операция, поэтому вы не можете получить открытый ключ, зная адрес. Клиент, который хочет проверить транзакцию, просто запускает сценарий с условиями, которые отправитель прикрепил (открытый ключ), используя входные данные, предоставленные лицом, которое пытается выкупить (подпись). Если сценарий оценивается как true, транзакция действительна. Скрипты содержат открытые ключи, а не адреса.

Хотя я отметил ваш ответ, я не понимаю, как открытый ключ получателя сохраняется в новой записи транзакции, если он хэшируется. Если он хеширован, как его можно использовать для проверки подписи, когда этот пользователь тратит BTC?
@Mike D scriptpubkey содержит хеш160 открытого ключа. это всего в нескольких шагах от адреса. scriptsig содержит открытый ключ.
Я подхожу к этому с другой стороны. Скрипты для меня ничего не значат (извините). Все, что я хочу знать, это то, хранится ли открытый ключ получателя в записи транзакции (или может быть каким-то образом получен). Если этот ответ да, то я могу взять его оттуда. Мне нужно знать, что открытый ключ получателя доступен для проверяющих узлов, чтобы подписи для транзакций могли быть проверены с использованием этого открытого ключа... Разве не так это в конечном итоге работает в биткойнах?
@Jazimov открытый ключ доступен узлам, когда кто-то пытается выкупить ввод, потому что он отправляет его как часть своего scriptSig. До тех пор все, что могут видеть другие, — это хэш открытого ключа.

основываясь на предыдущем ответе/комментариях, я хотел бы помочь немного глубже: глядя на стандартную транзакцию P2PKH, есть механизм блокировки и разблокировки. Механизм блокировки находится в сценарии публичного ключа (в разделе вывода) предыдущей транзакции (некоторые называют его также условием траты). Разблокировка находится в части транзакции сигскрипта (здесь вы найдете «ваш» сиг и публичный ключ). В сценарии публичного ключа автор предыдущего tx определяет цель (кому должна быть отправлена ​​tx), которая представлена ​​в виде хэша публичного ключа. Когда затем получатель tx хочет потратить tx, он должен выполнить условие (показав нехэшированный открытый ключ), а также подписать tx своим закрытым ключом.

Связь между ними такова:

Сценарий P2PKH в разделе сценария открытого ключа предыдущей транзакции говорит s.th. нравиться:

"if your pubkey hashes to the same value as I have presented here, you have met the condition to process the tx further"

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

Подробнее о проверке скриптов на страницах разработчиков биткойнов и в книге Андреаса «Освоение биткойнов» в разделе 6 «Транзакции». Настоятельно рекомендуется. Его можно найти в сети, а также здесь .

Надеюсь, это поможет лучше понять.