Начинаем с основ · урок 4

Кошелёк, адрес и цифровая подпись

Узнайте, как кошелёк подтверждает действие, не раскрывая закрытый ключ.

В прошлом уроке мы увидели, что пользователь отправляет транзакцию, а сеть проверяет её перед изменением состояния блокчейна.

Но возникает вопрос:

как сеть понимает, что транзакцию действительно разрешил владелец адреса?

Для этого используются криптографические ключи и цифровая подпись.

Что такое блокчейн-адрес

Адрес — это публичный идентификатор аккаунта в блокчейне.

Он выглядит примерно так:

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 мы увидим, как смарт-контракт может самостоятельно проверить такую подпись.

Задание

Соберите безопасную последовательность подтверждения действия через криптокошелёк.

Помните: закрытый ключ не должен передаваться приложению или сети.

Схема

Расположите шаги подтверждения и отправки подписанного запроса.

Добавьте первый блок
Доступные блоки

Войдите, чтобы сохранить прохождение.