Подписание данных с помощью ECDSA

Я читал о математике биткойнов в этой статье , и одна вещь, которую я не могу понять, это то, как указанный алгоритм используется для подписи «данных». Что это за "данные"? Это мой биткойн? Если да, то как именно биткойн представлен с точки зрения данных? Скажем, у меня есть 5 биткойнов в моем кошельке Coinbase, которые я хочу отправить своему другу. Как это отразится на всем процессе «получения закрытого ключа и подписания им ваших данных», как описано в статье?

Извините, если это слишком новый вопрос, я новичок в концепциях криптографии. Заранее спасибо!

Ответы (2)

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

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

Затем они формируют блок данных, который утверждает эти UTXO, и создает новый UTXO, отдающий биткойны получателю, а другой возвращает им любые изменения. Это тот фрагмент данных, который они подписывают с помощью ключа для каждого UTXO, который они тратят с этим платежом.

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

А coinописывается тремя вещами.

  • Минус: txidиндекс вывода и в создающей транзакции. Явно идентифицирует потраченные монеты
  • Количество
  • СкриптPubKey

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

ECDSA указывает взять h = H(m) mod n, где H(m) — алгоритм хеширования, и использовать эти данные для вычисления подписи по закрытому ключу. Ваш вопрос, что такое m?

m(подписываемые данные) — это транзакция, сериализованная в соответствии с флагами SIGHASH, которые определяют, какие части фиксируются в подписи.

  • SIGHASH_ALL фиксирует всю транзакцию как «данные», поэтому, если какие-либо из этих данных изменяются (кто-то добавляет ввод или изменяет место назначения), подпись становится недействительной.
  • SIGHASH_NONE фиксирует все , кроме выходных данных (индекс выходных данных обнуляется). Это гарантирует, что подпись действительна до тех пор, пока входные данные остаются прежними. Выходы могут быть изменены по желанию.
  • SIGHASH_SINGLE захватывает ввод и вывод. Все остальное можно изменить, не делая подпись недействительной.
  • SIGHASH_ANYONECANPAY можно применять поверх других типов sighash. Подписан только один вход (ваш), а выходы.

К подписи добавляются флаги SIGHASH, что позволяет другим повторить процедуру, выполняемую при подписании.

Есть и другие модификации: - входные скрипты обнуляются, т.к. подписи не могут подписывать сами себя. - txout.scriptPubKeyдобавляется как txin.scriptSigдля этого vin (часть, начиная с последнего OP_CODESEPARATOR) - в самом конце hashTypeCodeдобавляется (4-байтный флаг sighash)

Подробнее об этом процессе читайте на этой странице и изображении: https://en.bitcoin.it/wiki/OP_CHECKSIG .

Раздельный свидетель включает модификацию способа mполучения. См. BIP 143: https://github.com/bitcoin/bips/blob/master/bip-0143.mediawiki .