DID and VC services
Проект содержит два REST сервиса:
DID service хранит DID Documents, историю версий и tombstone после деактивации.
VC service хранит Verifiable Credentials и проверяет их через DID service.
Связь сервисов сделана через внутренний gRPC API DID service. VC service при создании и проверке credential резолвит issuer DID и subject DID. Если DID не найден или деактивирован, credential не считается валидным.
Функционал
DID service
создать DID Document
получить DID Document
получить список DID с фильтром по deactivated
полностью заменить DID Document
частично обновить DID Document через JSON Merge Patch
деактивировать DID без физического удаления
получить историю версий
получить конкретную версию
parse DID и DID URL
resolve DID
dereference ключа или service по DID URL
VC service
создать Verifiable Credential
получить credential по id
получить список credentials по subject DID
получить статус credential
отозвать credential
проверить credential
проверить связь с DID service при создании и verify
VC принимаются подписанными издателем (Content-Type: application/vc+jwt, ключ из assertionMethod DID издателя) и перепроверяются в verify — cryptographicallyVerified: true. Режим задаёт VC_PROOF: off, optional (по умолчанию), required. Проверка цепочки сертификатов и ГОСТ — за PKI-сервисом. Подробно — сценарий подписанных VC.
Подписанные операции DID
публичные ключи в
verificationMethodпроверяются по существу: декодирование, длина, точка на кривой,x5cсоздание, изменение и деактивация DID подписываются контроллером или владельцем (
owner) документа — заголовокDID-Operation-Proofрежим задаёт
DID_OPERATION_PROOF:off,optional(по умолчанию),requiredревизии образуют хэш-цепочку,
GET /v1/dids/{did}/history/verifyперепроверяет историюутилита
cmd/didsignсоздаёт ключи и подписи для ручных проверок
Подробно — сценарий подписанных операций.
DID-метод did:ru
did:ru:<agent|device|org>:<id> — самосертифицируемый идентификатор (выводится из ключа), у агентов и устройств обязателен owner. Спецификация — docs/did-method-ru.md, черновик записи для реестра W3C — docs/did-method-registration.json (публикация спецификации по адресу из specification — до подачи). DID других методов (did:i:*, did:scada:*) принимаются как раньше.
Демо
http://localhost:8081/portal— портал участников: три компании (орган по сертификации, изготовитель, покупатель) выпускают сертификаты соответствия, приборы, паспорта, метки, передают и принимают приборы.http://localhost:8081/scan,/s/<DID>— проверка прибора по метке: камера, фото метки или ссылка.http://localhost:8081/console— сценарии DiCE и ИИ-агента по шагам.
Весь функционал по шагам — docs/demo.md. Контракт для партнёров (метка, скан, выпуск документов, поля, ошибки) — docs/partner/README.md и .
Запуск
Запустить оба сервиса и PostgreSQL:
docker compose up -d --build
Проверить контейнеры:
docker compose ps
DID Swagger:
http://localhost:8080/swagger
VC Swagger:
http://localhost:8081/swagger
Person VC demo form:
http://localhost:8081/person-demo
Health checks:
http://localhost:8080/api/health http://localhost:8081/api/health
Debug reset локальной базы доступен только при DEBUG=TRUE:
curl -X POST http://localhost:8081/api/debug/reset-db
Команда очищает данные DID, VC и Person, но не трогает таблицу миграций.
Build
Собрать локальные бинарники:
make build
Собрать Docker images:
make docker-build
Собрать и запустить контейнеры одной командой:
docker compose up -d --build
Очистка
Остановить контейнеры без удаления данных:
make docker-down
Остановить контейнеры и удалить локальные volume с данными PostgreSQL:
docker compose down -v
Удалить локальные бинарники:
make clean
Сценарии для Swagger
Что можно проверить:
Основные endpoints
DID service использует base path /api:
POST /v1/didsGET /v1/didsGET /v1/dids/{did}PUT /v1/dids/{did}PATCH /v1/dids/{did}POST /v1/dids/parseGET /v1/dids/resolveGET /v1/dids/dereferenceGET /v1/dids/{did}/historyGET /v1/dids/{did}/history/{versionId}GET /v1/dids/{did}/history/verify
VC service использует base path /api:
POST /v1/credentialsGET /v1/credentialsGET /v1/credentials/{id}GET /v1/credentials/{id}/statusPOST /v1/credentials/{id}/verifyPOST /v1/credentials/{id}/revokeGET /v1/scan— проверка прибора по метке одним вызовом (verdict,caveats, паспорт, сертификат, владелец)GET /v1/labels/{did},GET /v1/labels/{did}/qr.svg|png— метка прибораGET /v1/schemas,GET /v1/schemas/{type}— состав полей документов (JSON Schema)POST /v1/personsGET /v1/personsGET /v1/persons/{id}PATCH /v1/persons/{id}POST /v1/persons/{id}/credentialsGET /v1/persons/{id}/credentials
Переменные окружения
Для запуска без Docker Compose:
DATABASE_URL=postgres://did:did@localhost:5432/did?sslmode=disable BACKEND_ADDRESS=:8080 DID_GRPC_ADDRESS=:9090 VC_HTTP_ADDRESS=:8081 VC_DATABASE_URL=postgres://did:did@localhost:5432/did?sslmode=disable DID_GRPC_ADDR=localhost:9090 VC_PUBLIC_URL=http://localhost:8081 LOG_LEVEL=info DEBUG=FALSE
VC_PUBLIC_URL— адрес реестра в метках (<VC_PUBLIC_URL>/s/<DID>); фиксируется до печати меток.API_TOKENS(оба сервиса) — токены партнёровpartner=token,partner2=token2, не короче 16 символов. Пусто — API открыт (подписи сторон действуют всегда). С токенами закрыты выпуск, отзыв, изменения DID, списки, поиск и ленты; скан, метки, схемы, получение DID, чтение и проверка документов остаются публичными.DID_API_TOKEN— токен, с которым VC-сервис (identity) обращается к DID-сервису приAPI_TOKENS.VC_SCHEMAS_FILE— свой состав полей документов вместо встроенногоinternal/vc/credschema/default.json.
Журнал изменений
Дата | Перечень изменений | Автор |
2026-11-05 | Перенесён из архива DID-VC-итоги-2026-11-03 без изменения содержания. | Дис |