Раздел 30 · Web3 на Rust

Идентичность: кошелёк, DID, удостоверения и имена

middle~35 мин

без входаВойди, чтобы отмечать прогресс, вести заметки и решать задачи в редакторе. войти

Идентичность: кошелёк, DID, удостоверения и имена

Адрес кошелька выглядит как удостоверение личности, но это не оно. Он не говорит, человек ты или скрипт, один ты или сто, есть ли тебе восемнадцать и не выдал ли ты себя за кого-то другого. Этот урок про то, из чего в этой среде собирают идентичность, и почему большинство задач вида «докажи, что тебе можно» решаются иначе, чем кажется.

Три разных вопроса, которые путают

Слово «идентичность» склеивает три задачи, и разбирать их надо по отдельности.

Идентификатор. Как тебя устойчиво называть. Адрес, DID, имя. Требование к нему одно: он должен принадлежать тебе и не подделываться.

Утверждения. Что про тебя правда: возраст, гражданство, диплом, право подписи от организации. Сам ты этого о себе доказать не можешь, нужен тот, кто ручается.

Репутация. Что ты делал раньше. Она накапливается по действиям и, в отличие от утверждений, никем не выдаётся.

Кошелёк закрывает только первую задачу. Причём хорошо: подпись доказывает контроль над ключом, и подделать её нельзя. Всё остальное надстраивается сверху.

Вход по кошельку: что он даёт и чего нет

Простейшее практическое применение идентификатора это вход на сайт. Сервер присылает текст с адресом, доменом, случайной строкой и сроком, пользователь подписывает, сервер проверяет подпись. Стандарт описывает формат такого текста, чтобы кошелёк показывал человеку читаемое сообщение, а не шестнадцатеричный мусор.

Что это даёт: аутентификацию без пароля и без базы паролей. Что не даёт: ничего про самого человека. Сервер узнаёт, что перед ним владелец ключа, и всё.

Три детали, без которых схема ломается, и все три ты уже видел в уроке про безопасность: случайная строка от сервера (иначе подпись переиспользуют), срок годности (иначе она вечна) и привязка к домену (иначе подпись, собранную на чужом сайте, предъявят у тебя).

И отдельная тонкость: если пользователь заходит смарт-контрактным кошельком, обычной проверки подписи недостаточно, у контракта нет приватного ключа. Для таких случаев есть стандартный способ спросить сам контракт, считает ли он подпись действительной.

DID: идентификатор, который не принадлежит платформе

Адрес кошелька привязан к конкретной цепи и к конкретной схеме подписи. Хочется чего-то более общего, и такой стандарт есть.

DID устроен просто: строка did:метод:значение разрешается в документ, где перечислены ключи субъекта и то, для чего каждый ключ годится.

Метод отвечает на вопрос, где искать документ:

  • did:key. Документ выводится прямо из ключа, никакой сети не нужно. Идентификатор нельзя обновить, но и инфраструктуры не требуется.
  • did:web. Документ лежит файлом на домене. Просто, понятно, и доверие ровно такое же, как к домену.
  • методы поверх цепи. Документ хранится или выводится из состояния блокчейна, что даёт обновляемость ключей без централизованного реестра.

Заметь, чего DID не делает: он не говорит, кто ты. Он лишь даёт устойчивое имя и способ проверить твою подпись. Смысл появляется, когда к идентификатору привязывают утверждения.

Верифицируемые удостоверения: треугольник ролей

Модель, вокруг которой сошлись стандарты, состоит из трёх ролей.

Издатель утверждает факт и подписывает его: университет о дипломе, государство о возрасте, работодатель о должности. Держатель хранит подписанное удостоверение у себя, в своём кошельке, а не на сервере издателя. Проверяющий принимает предъявленное удостоверение и проверяет подпись издателя.

Главное отличие от привычного входа через соцсеть: проверяющий не обращается к издателю. Университет не узнаёт, куда ты предъявлял диплом, а государство не видит, в каком баре ты подтверждал возраст. Это принципиальный сдвиг: в федеративной модели поставщик личности видит каждый твой вход, здесь нет.

Дальше начинается самое интересное для нас. Удостоверение о дате рождения содержит дату, а бару нужен только факт совершеннолетия. Показывать дату избыточно. Отсюда выборочное раскрытие: подпись устроена так, что можно предъявить часть полей, не раскрывая остальные. А в предельном варианте не раскрывается ничего: предъявляется доказательство утверждения «в моём подписанном государством удостоверении дата рождения такова, что мне больше восемнадцати». Проверяющий видит доказательство и подпись издателя, но не видит ни даты, ни имени.

Вот где нулевое разглашение работает по прямому назначению, в отличие от rollup-ов, где нужна была только краткость.

Отзыв: самая недооценённая часть

Удостоверение иногда надо отозвать: диплом аннулирован, сотрудник уволен, права изъяты. И вот тут схема начинает бороться сама с собой.

Наивное решение это список отозванных на сервере издателя. Но тогда проверяющий обращается к издателю при каждой проверке, и вся приватность, ради которой всё затевалось, теряется.

Практический компромисс: издатель публикует большой битовый список статусов, где каждому удостоверению соответствует один бит, а проверяющий скачивает список целиком и смотрит нужный бит локально. Издатель видит только факт скачивания списка, но не то, чей статус смотрели. Список сжимается в несколько килобайт на десятки тысяч записей.

Если в схеме отзыва не разобрался, считай, что схемы идентичности у тебя нет: именно на отзыве ломаются красивые прототипы.

премиум-урок

Продолжение в премиуме: 1 200 ₽ в месяц или 10 000 ₽ в год. Вместе с ним серверные проверки задач и школьные токены AI-коуча.

Оплата пока не подключена: премиум и курсы открываются промокодом.