Что такое проверка подписи?
Инструмент проверки подписи принимает сообщение, цифровую подпись и публичный идентификатор (адрес или публичный ключ) и сообщает, действительно ли этот идентификатор создал подпись именно над этим сообщением. В Ethereum проверка выполняется через восстановление: secp256k1 позволяет вычислить публичный ключ подписанта из подписи и хеша сообщения, получить из него адрес хешированием и сравнить. В Solana (ed25519) и для форматов сообщений Bitcoin (SegWit и legacy) действует та же идея, но с другими правилами хеширования. Эта страница реализует все четыре соглашения, которые сегодня используют кошельки, — в браузере и только по публичным данным.
Поддерживаемые типы подписей
| Тип | Стандарт | Подписываемый дайджест | Кривая | Результат |
|---|---|---|---|---|
| Ethereum personal_sign | EIP-191 (версия 0x45) | keccak256("\x19Ethereum Signed Message:\n" + length + message) | secp256k1 | Восстановленный адрес, отметка о совпадении, хеш сообщения |
| Типизированные данные Ethereum | EIP-712 (eth_signTypedData_v4) | keccak256(0x1901 ‖ domainSeparator ‖ hashStruct(message)) | secp256k1 | Domain separator, хеш структуры, дайджест, восстановленный подписант |
| Solana signMessage | RFC 8032 Ed25519 | SHA-512 внутри уравнения EdDSA, без префикса | ed25519 | Действительна / недействительна |
| Подписанное сообщение Bitcoin | BIP-137 (Bitcoin Core signmessage) | SHA-256d("\x18Bitcoin Signed Message:\n" + varint(len) + message) | secp256k1 | Восстановленный ключ, производный адрес, совпадение |
Как работает восстановление в Ethereum
Подпись ECDSA — это пара (r, s). Для 32-байтового дайджеста и идентификатора восстановления v существует не более двух возможных публичных ключей; v выбирает один из них. Инструмент вычисляет дайджест по выбранному стандарту, восстанавливает 64-байтовый публичный ключ, берёт последние 20 байт его хеша Keccak-256, получая адрес, и сравнивает его с ожидаемым адресом, если вы его указали. Поскольку адрес вычисляется, а не ищется, совпадение доказывает владение ключом в момент подписания; данные из блокчейна не нужны.
Разбор примера: EIP-712 Mail
Нажмите «EIP-712 Mail» выше. Типизированные данные — пример из спецификации EIP-712: домен Ether Mail версии 1 в сети 1 с проверяющим контрактом 0xcccc…cccc и структура Mail от Cow к Bob с содержимым «Hello, Bob!». Инструмент показывает domain separator 0xf2cee375…, хеш структуры 0xc52c0ee5… и итоговый дайджест 0xbe609aee… — ровно те значения, что выводит эталонная реализация из спецификации, — а затем восстанавливает подписанта приложенной подписи. Измените один символ в «Hello, Bob!», и восстановленный адрес изменится полностью: в этом и состоит смысл подписи структурированных данных.
Как читать подпись сообщения Bitcoin
Первый байт подписи в base64 кодирует и идентификатор восстановления, и тип адреса, который подразумевал подписант: 27–30 — P2PKH с несжатым ключом, 31–34 — P2PKH со сжатым ключом, 35–38 — SegWit, обёрнутый в P2SH, и 39–42 — нативный SegWit (bc1q). Инструмент восстанавливает ключ, выводит все четыре формы адреса и сообщает, какая из них совпадает с указанным вами адресом. Electrum и ряд других кошельков подписывают адреса bc1q с заголовком 31–34; такой случай принимается и помечается примечанием, а не отклоняется. Адреса testnet (m…, n…, 2…, tb1q…) распознаются по префиксу.
Типичные сценарии
- Sign-In with Ethereum / вход через кошелёк: убедитесь, что подпись, присланная клиентом, действительно принадлежит заявленному адресу, прежде чем принять её на бэкенде.
- Разрешения Permit и Permit2: вставьте типизированные данные, которые dApp попросило подписать, и посмотрите, какие домен, spender и deadline на самом деле закреплены подписью.
- Доказательство владения адресом: биржи и OTC-деск запрашивают подписанное сообщение с адреса депозита или вывода; проверьте его здесь, прежде чем доверять.
- Отладка: сравните хеши, показанные на этой странице, с вычисленными вашей библиотекой, чтобы найти ошибки в префиксе, кодировке или chainId.
Поддерживаемые форматы ввода
- Подписи Ethereum: 65 байт в hex с v = 0, 1, 27 или 28 либо 64-байтовые компактные подписи EIP-2098; с префиксом 0x или без.
- Сообщения: текст UTF-8 или hex-байты, если подписант хешировал сырые байты; для Solana также принимается base64.
- Подписи Solana: base58 (как возвращают Phantom и Solflare), base64 или hex; публичный ключ — base58-адрес или 32 байта в hex.
- Подписи Bitcoin: base64 в том виде, в каком их выдаёт signmessage, или те же 65 байт в hex.
См. также: вычислите Keccak-256 сообщения самостоятельно с помощью инструмента хеширования, исправьте контрольную сумму адреса в конвертере EIP-55 или декодируйте транзакцию, в которой использовалась подпись, в декодере транзакций Ethereum.