В прошлом уроке мы увидели, что пользователь отправляет транзакцию, а сеть проверяет её перед изменением состояния блокчейна.
Но возникает вопрос:
как сеть понимает, что транзакцию действительно разрешил владелец адреса?
Для этого используются криптографические ключи и цифровая подпись.
Что такое блокчейн-адрес
Адрес — это публичный идентификатор аккаунта в блокчейне.
Он выглядит примерно так:
10x71C...A92FАдрес можно безопасно сообщать другим людям. Например, на него можно получать ETH или токены.
В этом смысле адрес немного похож на номер счёта: знать его недостаточно, чтобы распоряжаться средствами.
Закрытый ключ
Контроль над адресом связан с закрытым ключом — секретным криптографическим значением.
Упрощённо можно представить:
1Закрытый ключ2 ↓3Публичные данные4 ↓5АдресЗакрытый ключ позволяет создавать цифровые подписи от имени соответствующего аккаунта.
Поэтому его нельзя:
- отправлять сайту;
- публиковать;
- вставлять в незнакомые приложения;
- передавать другим людям.
Кто получил закрытый ключ, тот потенциально получает возможность управлять связанным с ним аккаунтом.
Что делает кошелёк
MetaMask, Rabby и другие криптокошельки — это не просто приложения, которые «хранят монеты».
Сами ETH и токены существуют в состоянии блокчейна.
Кошелёк помогает:
- управлять аккаунтами и ключами;
- показывать баланс;
- подключаться к приложениям;
- показывать детали запрашиваемого действия;
- создавать цифровые подписи;
- отправлять подписанные транзакции в сеть.
Ключевая идея:
приложению не нужно получать ваш закрытый ключ.
Что такое цифровая подпись
Представим, что приложение хочет выполнить действие:
1Отправить 0.2 ETHПриложение передаёт данные кошельку.
Кошелёк показывает пользователю, что именно предлагается подтвердить. Если пользователь соглашается, кошелёк использует закрытый ключ для создания цифровой подписи.
Упрощённо:
1Запрос + закрытый ключ2 ↓3 Цифровая подписьПри этом сам закрытый ключ не нужно прикладывать к транзакции.
В сеть отправляются данные действия и подпись, а не секретный ключ.
Как сеть проверяет подпись
С помощью криптографии сеть может проверить, что подпись соответствует нужному аккаунту.
То есть можно подтвердить:
владелец соответствующего ключа действительно одобрил эти данные.
Но из самой подписи нельзя просто получить закрытый ключ.
Это позволяет доказать право на действие без передачи секрета.
Как выглядит весь процесс
Допустим, пользователь нажал в приложении кнопку:
«Отправить 0.2 ETH»
Упрощённый путь будет таким:
11. Приложение формирует запрос2 ↓32. Кошелёк показывает детали4 ↓53. Пользователь подтверждает действие6 ↓74. Кошелёк подписывает его закрытым ключом8 ↓95. Подписанный запрос отправляется в сеть10 ↓116. Сеть проверяет подписьЗакрытый ключ при этом остаётся у пользователя.
Почему важно читать окно кошелька
Цифровая подпись доказывает не то, что действие безопасно, а то, что пользователь его подтвердил.
Поэтому перед подтверждением стоит проверять:
- к какой сети подключён кошелёк;
- с каким адресом или контрактом происходит взаимодействие;
- какую сумму предлагается отправить;
- какие разрешения запрашивает приложение;
- действительно ли пользователь хотел выполнить это действие.
Если вредоносное приложение подготовило опасную операцию, кошелёк не всегда может определить намерение пользователя за него.
Транзакция и подпись — не одно и то же
Подписывать можно не только транзакции.
Кошелёк также может подписывать сообщения, например для:
- входа на сайт;
- подтверждения владения адресом;
- разрешения получить награду;
- голосования;
- некоторых операций без немедленной отправки транзакции.
Позже в Solidity мы увидим, как смарт-контракт может самостоятельно проверить такую подпись.
Задание
Соберите безопасную последовательность подтверждения действия через криптокошелёк.
Помните: закрытый ключ не должен передаваться приложению или сети.