Lezioni online Bitcoin-only
This project is maintained by valerio-vaccaro
Officine Bitcoin Bitcoin-only урок Этот проект поддерживается valerio-vaccaro
🇨🇳 中文 🇬🇧 English 🇪🇸 Español 🇵🇹 Português 🇷🇺 Русский 🇫🇷 Français 🇩🇪 Deutsch 🇮🇹 Italiano 🇭🇺 Magyar 🏳️ Milanés 🏳️ Veneto
Темой этого урока будут цифровые подписи и их применение к Bitcoin.
Нам необходимо понять, что мы подразумеваем под цифровой подписью. Когда мы думаем об обычной подписи, мы обычно думаем о чем-то другом, поскольку мы говорим о цифровых документах, цифровая подпись связывает как личность автора, так и статус подписанного документа, поэтому, по сути, подпись также зависит от документа, который мы собираемся подписать.
В этом очень большая разница с физическим миром, где вместо этого мы размещаем подпись, практически не заботясь о том, на какой опоре мы это делаем. Конечно, мы не можем пойти и подписать чеки или другие документы, не беспокоясь об этом, но по сути подпись, которую мы собираемся поставить, не меняется.
С другой стороны, цифровые подписи — это немного другое: цифровые подписи обычно основаны на алгоритмах открытого и закрытого ключей. Это означает, что в нашем кошельке где-то в мире есть пара ключей, публичный и приватный, и наша (псевдо)личность связана с публичным ключом, который все знают или который мы всем сообщим.
Мы будем использовать наш закрытый ключ, который представляет собой число, и с помощью некоторой математической магии создадим подпись, которая представляет собой другое число и доказывает, что определенное состояние определенного документа принадлежит определенному идентификатору, связанному с открытым ключом, или известно под ним. То, что я собираюсь подписать, — это отпечаток пальца (или ХЭШ) определенного документа (или ПОЛЕЗНОЙ НАГРУЗКИ).
Мне также нужен какой-то генератор случайных чисел, я бросаю все эти данные в «черный ящик», который создает подпись, поэтому подпись является чем-то, что демонстрирует владение, поскольку я подписываюсь своим секретом, но также показывает, что то, что я подписываю, не было изменено.
Если я изменяю ПОЛЕЗНУЮ НАГРУЗКУ, я изменяю ХЭШ, и, очевидно, это делает подпись недействительной.
Итак, почему же эта более сложная подпись была введена в цифровой мир? Да потому, что в цифровом мире, в отличие от физического (а это, наверное, помнят те, кто прогуливал школу), скопировать подпись гораздо проще.
С другой стороны, цифровая подпись содержит информацию о документе и, следовательно, изменяется для каждого документа и не может быть вставлена и повторно использована в другом документе.
Таким образом, цифровая подпись используется для:
Эта технология используется в Bitcoin под аббревиатурой ECDSA (Алгоритм цифровой подписи с электронной кривой), который представляет собой алгоритм создания цифровых подписей на эллиптической кривой, другие схемы подписи пока мы рассматривать не будем.
Напоминаем, что в Bitcoin вы можете оформлять подписи для:
Но как эти подписи связаны с транзакцией? Каждый адрес имеет механизм расходования — сценарии, которые необходимо запустить, чтобы узнать, можно ли авторизовать расходы. Внутри этих скриптов есть команды (или OPCODE), предназначенные для проверки цифровых подписей, такие как OP_CHECKSIG, OP_CHECKSIGVERIFY, OP_CHECKMULTISIG, OP_CHECKMULTISIGVERIFY.
Напомним, что транзакция в Bitcoin состоит из:
По сути, в большинстве случаев мне придется предоставлять ДЛЯ КАЖДОГО ВХОДА подпись(и), необходимую для завершения сценария расходов.
Напомним, что это действие позволяет нам продемонстрировать, что эти входные данные принадлежат нам и что мы хотим их потратить (мы хотим передать имущество полностью, хотим разделить его или хотим объединить его с другими входными данными).
Очевидно, что транзакция действительна, если все входы правильно подписаны, а если хотя бы один из входов не подписан, транзакция не может считаться действительной.
Подпись может быть проверена каждым и не может быть отвергнута, но для гибкости Сатоши очень и очень умным способом ввел различные режимы подписи, то есть подпись всегда одна и та же, но ПОЛЕЗНАЯ НАГРУЗКА, то есть часть транзакции, подлежащая подписи, меняется, это позволяет, например, генерировать сложные схемы и протоколы, в которых части транзакций могут комбинироваться друг с другом, Сатоши назвал эти режимы (настоящие флаги на языке сценариев) SIGHASH.
Самый простой SIGHASH — это SIGHASH_ALL, что означает создание подписи со ВСЕМИ ВХОДАМИ и ВСЕМИ ВЫХОДАМИ. Это самый простой и наиболее используемый способ создания подписи.
Первое отличие может быть с SIGHASH_NONE, который подписывает ВСЕ ВХОДЫ, но НИ ОДИН ВЫХОД, что позволяет вам впоследствии добавлять выходы или изменять комиссии. ВНИМАНИЕ, что с помощью этой схемы, если она не защищена мультиподписью или другими функциями, майнер или любой другой, кто увидит транзакцию с этой схемой подписи, может заменить выходные данные, перенаправив средства на свой собственный адрес.
Более интересный флаг — SIGHASH_SINGLE, в котором подписывается пара входов и выходов, пока они вставлены в транзакцию на одном уровне (например, пятый вход и пятый выход), это позволит вам составлять более крупные транзакции на основе этих пар, но не дает возможности внесения изменений или требует общих затрат на вход.
В то же время все эти SIGHASH можно объединить с флагом ANYONECANPAY, который ограничивает подпись только тем входом, для которого создается подпись, тем самым давая любому возможность добавлять входные данные в транзакцию.
Все эти подписи являются действительными независимо от типа адреса и скриптов, что оставляет кошельку максимальную гибкость выражения. Обычно он использует SIGHASH_ALL, но может также следовать более сложным протоколам, требующим других схем подписи. В случае мультиподписи нет необходимости использовать один и тот же тип подписи, кошелек 2di2 может подписать некоторые из своих UTXO с помощью SIGHASH_NONE и ANYONECANPAY, чтобы предоставить полный контроль второй подписывающей стороне, которая сможет, например, собрать все эти входные данные в транзакции, которая будет подписана с помощью SIGHASH_ALL.
Для полноты картины те же подписи, которые используются для ввода транзакций, можно использовать и для подписи произвольного текста.
Bitcoin предлагает схему, в которой добавляется текст, чтобы предотвратить использование этой функции для отдельного подписания транзакций, поэтому, если у вас есть ядро Bitcoin или даже несколько кошельков, вы можете поискать функцию подписи текстовых сообщений на основе определенного вашего адреса.
Кошелек будет использовать закрытый ключ, связанный с открытым ключом, сгенерировавшим этот адрес, для создания подписей текстовых сообщений.
После проверки вы получаете открытый ключ, который затем можно использовать для регенерации адреса, поэтому, если у меня есть текст и подпись, я извлекаю подписанный открытый ключ и из открытого ключа могу пересчитать адрес и сверить его, например, с предоставленным.
Урок по подписям можно повторить, вот список уже проведенных:
| Дата | Заметки |
|---|---|