Я читал о математике биткойнов в этой статье , и одна вещь, которую я не могу понять, это то, как указанный алгоритм используется для подписи «данных». Что это за "данные"? Это мой биткойн? Если да, то как именно биткойн представлен с точки зрения данных? Скажем, у меня есть 5 биткойнов в моем кошельке Coinbase, которые я хочу отправить своему другу. Как это отразится на всем процессе «получения закрытого ключа и подписания им ваших данных», как описано в статье?
Извините, если это слишком новый вопрос, я новичок в концепциях криптографии. Заранее спасибо!
Каждый биткойн, существующий сегодня, существует как неизрасходованный вывод транзакции (UTXO) в блокчейне биткойна. То есть выходные данные существующей подтвержденной транзакции, которые еще не были использованы в качестве входных данных какой-либо другой транзакции.
У Coinbase есть коллекция UTXO, которые представляют биткойны, которыми они владеют. Когда вы говорите Coinbase совершить платеж в биткойнах кому-либо из вашего кошелька, они выбирают один или несколько из этих UTXO для совершения платежа.
Затем они формируют блок данных, который утверждает эти UTXO, и создает новый UTXO, отдающий биткойны получателю, а другой возвращает им любые изменения. Это тот фрагмент данных, который они подписывают с помощью ключа для каждого UTXO, который они тратят с этим платежом.
Как только транзакция будет подтверждена, новый UTXO для получателя — это биткойны, которые вы ему отправили. Когда они увидят, что UTXO появляется в блокчейне, они узнают, что вы им заплатили. Затем они могут сформировать транзакцию, которая тратит этот UTXO для передачи этих биткойнов кому-то еще.
А coin
описывается тремя вещами.
txid
индекс вывода и в создающей транзакции. Явно идентифицирует потраченные монетыЧтобы потратить монету, вы создаете транзакцию, указав точку выхода в качестве входа. Вы указываете некоторые места назначения (известные как выходы). Часто scriptPubKey
требуется, чтобы вы предоставили подпись, удостоверяющую подлинность расходов.
ECDSA указывает взять h = H(m) mod n
, где H(m) — алгоритм хеширования, и использовать эти данные для вычисления подписи по закрытому ключу. Ваш вопрос, что такое m
?
m
(подписываемые данные) — это транзакция, сериализованная в соответствии с флагами 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 .