ЧТЗ_ротация_каналов_4.2.4_v01_draft
4.2.4 Создание функций маршрутизации запросов в распределённых реестрах
Работы выполняются в соответствии с пунктом ___/4.2.4/АКК Заявки № ___ «Создание функций маршрутизации запросов в распределённых реестрах».
Назначение работ. В высокодинамичных средах, характеризующихся частым созданием записей об активах, со временем происходит деградация производительности реестров; подсистема ИС ГУЦ «Распределённые реестры объектов инфраструктуры открытых ключей» (далее — Реестры PKI) относится к таковым. В связи с этим возникает объективная необходимость внедрения механизма ротации каналов, под которым понимается периодическое создание нового канала, миграция на него актуальной бизнес-логики и участников с сохранением возможности доступа к данным старых каналов. Межканальная маршрутизация запросов к объектам и разрешение возможных коллизий между объектами обеспечиваются сервисным чейнкодом, размещаемым в канале ГУЦ. Выполнение работ предусмотрено п. 4.2.4 ТЗ.
Целевая модель. В рамках данной заявки необходимо обеспечить возможность ротации каналов распределённого реестра (по мере наполнения канала и периодически), ведение данных о действующих и ротированных каналах в сервисной базе данных сервисного чейнкода, маршрутизацию запросов к объектам каналов по идентификатору объекта, а также разрешение коллизий между владельцами реестров и между объектами реестров.
Границы требования. В рамках реализации требования не предусмотрено:
перенос данных активов из ранее созданного канала в новый канал — доступ к данным ранее созданных каналов сохраняется без переноса;
переход на 256-битовую структуру идентификатора объекта (увеличение количества ротаций канала до 228) — подход не является стандартизированным и требует более глубокой проработки;
ведение сведений об активах реестров (реестровая бизнес-логика) — сервисный чейнкод обеспечивает маршрутизацию запросов и хранение данных о каналах;
автоматическая ротация каналов — событие ротации каналов и исполнение этой функции выполняется вручную;
определение фактического времени эксплуатации канала до ротации — устанавливается в рамках нагрузочного тестирования.
Требования к функциям. В рамках данного требования необходимо:
Реализовать функцию регистрации реестра в сервисном чейнкоде, обеспечивающую: приём всех полей сервисной базы данных, кроме идентификатора реестра; присвоение идентификатора реестра (0 — при регистрации нового издателя актива; значение, увеличенное на 1, — при ротации канала, но не более 31); фиксацию момента ввода канала в эксплуатацию.
Реализовать функцию ротации канала, обеспечивающую: создание нового канала с миграцией на него актуальной бизнес-логики и участников с сохранением возможности доступа к данным ранее созданных каналов; задействование ротации по мере наполнения канала и периодической ротации; вывод канала из эксплуатации по истечении времени жизни всех активов с фиксацией момента вывода канала из эксплуатации; перевод выведенного из эксплуатации канала в «холодный» режим.
Обеспечить расчётные сроки эксплуатации каналов до ротации (таблица 1).
Таблица 1. Расчётное время эксплуатации каналов до ротации
Канал | Время эксплуатации до следующей ротации | Основание определения |
Канал ГУЦ | 15 лет | по времени действия сертификатов, выпускаемых для данного канала, и по наполняемости канала — в течение 15 лет объём данных составит ~15 МБ |
Приватный / публичный канал квалифицированных / неквалифицированных сертификатов | 1 год | по времени действия сертификатов, выпускаемых для данного канала |
Канал электронных подписей | 1 год | по времени действия сертификатов подписантов |
Обеспечить ведение сервисной базы данных сервисного чейнкода, содержащей сведения о реестрах (действующих и ротированных), с составом полей согласно таблице 2.
Обеспечить формирование идентификатора объекта по данным актива: по значению ОГРН УЦ — для сведений об аккредитации удостоверяющего центра; по значению хэша серийного номера и Issuer.OGRN (или хэша от поля Issuer) — для сведений о сертификате; по значению электронной подписи и ОГРН издателя сертификата подписи (или хэша от поля Issuer издателя) — для сведений об электронной подписи.
Обеспечить структуру идентификатора объекта — 128-битовый вектор (RFC 9562) с составом полей согласно таблице 3 и соответствием типов актива согласно таблице 4.
Реализовать функцию маршрутизации запроса к объекту канала по идентификатору объекта: определение типа и ключевой даты искомого актива, версии сервисного чейнкода; вычисление издателя актива; поиск реестра актива для данного издателя; возврат пары значений «наименование канала + наименование чейнкода».
Реализовать функцию определения реестра по данным актива (формирование идентификатора объекта и его маршрутизация) и функцию подбора всех возможных (по версиям сервисного чейнкода) реестров для данного актива и его издателя.
Реализовать функцию определения типа актива по данным актива — возврат числового значения в соответствии с версией сервисного чейнкода.
Реализовать функцию определения ключевой даты актива по данным актива.
Реализовать функцию определения версии сервисного чейнкода — текущей либо актуальной на заданный момент времени.
Обеспечить разрешение коллизий между владельцами реестров (issuerID, issuerIDAddon, roundsNum): при обнаружении коллизии создаётся дополнительная запись в сервисной базе данных; при маршрутизации проверяется наличие записи о коллизии, данные о записи уточняются по точному значению идентификатора.
Обеспечить разрешение коллизий между объектами реестра (collisionID, uniqueIDForCollision): при обнаружении коллизии создаётся дополнительная запись в сервисной базе данных; при маршрутизации проверяется наличие записи о коллизии, данные о записи уточняются по точному значению идентификатора.
4.2.4.1 Требования к функции ротации каналов
Ротация канала выполняется вручную следующей последовательностью действий (таблица 6).
Таблица 6. Последовательность действий при ротации канала
Шаг | Роль | Описание действия |
1 | Оператор сети | Запросить MSP-конфигурации у организаций — участников каналов |
2 | Оператор сети | Создать конфигурацию канала configtx.yaml |
3 | Оператор сети | Сгенерировать genesis-блок |
4 | Оператор сети | Создать канал |
5 | Администратор узла | Получить генезис-блок канала |
6 | Администратор узла | Присоединить конкретный peer к каналу |
7 | Все | Проверка присоединения пиров к каналу, видимость пиров участников в канале |
8 | Оператор сети | Регистрация канала в сервисном чейнкоде |
9 | Оператор сети | По наступлении времени вывода канала из эксплуатации — создание нового канала (начиная с шага 1) и поддержка старого канала для внесения информации о жизненном цикле действующих активов |
10 | Оператор сети | Перевод старого канала в «холодный» режим по истечении времени жизни всех активов |
Ротация канала для активов отражается изменением значения идентификатора реестра: для нового создаваемого канала идентификатор увеличивается на 1. Момент ввода канала в эксплуатацию фиксируется в сервисной базе данных и выступает временем начала периода вносимых в канал активов; момент вывода канала из эксплуатации фиксирует начало работы канала в «холодном» режиме.
Каждому поколению каналов соответствует индекс ротации (0 … N+1): канал ГУЦ (mcc), приватные каналы сертификатов ГУЦ, публичные и приватные каналы квалифицированных и неквалифицированных сертификатов УЦ, канал электронных подписей; системные имена каналов и чейнкодов включают индекс поколения. Сервисный чейнкод (service_cc) развёрнут у каждого участника (ГУЦ, УЦ) и при переходе к очередному поколению каналов переводится на новое поколение.
4.2.4.2 Требования к ведению сервисной базы данных сервисного чейнкода
Таблица 2. Состав сервисной базы данных сервисного чейнкода
Поле | Значение |
serviceCCVersion | Версия сервисного чейнкода (s_cc) |
MSPID | Идентификатор участника сети |
issuerID | Идентификатор издателя актива (владельца реестра) |
issuerIDAddon | Хэш от идентификатора владельца актива |
roundsNum | Количество раундов взятия хэша в issuerID для решения коллизии |
assetType | Тип актива реестра/канала (1 = УЦ, 2 = КСКПЭП, 3 = НСКПЭП, 4 = ЭП) |
channelName | Системное имя канала |
chaincodeName | Системное имя чейнкода данного канала для данного актива |
registryID | Идентификатор реестра, пара «канал + чейнкод» для ключа «s_cc + владелец + тип реестра» |
collisionID | UUID объекта, имеющего коллизию |
uniqueIDForCollision | Уникальное значение, разрешающее коллизию для объекта |
roundsNumHashActiveID | Количество раундов взятия хэша от serialNumber для решения коллизии uniqueIDForCollision |
dateTimeOpened | Момент ввода канала в эксплуатацию (или дата первого актива, выпущенного в текущей логике s_cc, то есть до создания канала) |
dateTimeClosed | Момент вывода канала из эксплуатации или NULL (не может быть позднее, чем dateTimeOpened следующей записи registryID) |
Информация о созданном (затем ротируемом) канале указывается в поле registryID с указанием даты dateTimeOpened, выступающей в качестве времени начала периода вносимых активов в канал. Поле dateTimeClosed указывает на время вывода канала из эксплуатации: с этого времени канал принимает только информацию об изменении жизненного цикла активов (до истечения времени их действия), а также работает в «холодном» режиме.
4.2.4.3 Требования к структуре идентификатора объекта и типам актива
Таблица 3. Структура идентификатора объекта
№ | Разрядность | Назначение |
1 | 3 бита | Версия чейнкода |
2 | 3 бита | Контрольная сумма (вычисляется как побитовая сумма последующих триад для последующих 42 бит) |
3 | 1 бит | Глобальность адреса |
4 | 1 бит | Область действия |
5 | 3 бита | Тип актива |
6 | 5 бит | Идентификатор реестра (начинается с 00000) |
7 | 32 бита | Идентификатор владельца реестра |
8 | 6 бит | Версия uuid + служебные биты |
9 | 74 бита | Идентификатор актива |
Таблица 4. Соответствие типов актива
Версия s_cc (десятичное) | Версия s_cc (битовое) | Тип актива | Значение типа актива (десятичное) | Значение типа актива (битовое) |
1 | 001 | УЦ | 1 | 001 |
1 | 001 | КСКПЭП | 2 | 010 |
1 | 001 | НСКПЭП | 3 | 011 |
1 | 001 | ЭП | 4 | 100 |
Совокупность типа актива, идентификатора реестра и идентификатора владельца реестра однозначно определяют конкретный реестр и тип актива. Исключением является канал аккредитованных УЦ, в котором содержатся активы двух типов (УЦ и КСКПЭП).
В рамках текущей модели идентификатора объекта возможно 32 ротации канала. Увеличение количества ротаций возможно за счёт перераспределения битов идентификатора владельца реестра с переходом на новую версию сервисного чейнкода, что приводит к большему количеству записей в сервисной базе данных, разрешающих возникающие коллизии между идентификаторами владельцев реестра. Количество ротаций в зависимости от распределения битов указано в таблице 5.
Таблица 5. Количество ротаций канала в случае перераспределения битов
Идентификатор реестра: количество бит | Идентификатор реестра: количество ротаций канала | Идентификатор владельца реестра: количество бит | Вероятность отсутствия хотя бы одной коллизии* |
5 | 32 | 32 | 2,598·10⁻⁵⁰⁶ |
7 | 128 | 30 | 4,56·10⁻²⁰²³ |
9 | 512 | 28 | 4,31·10⁻⁸⁰⁹⁰ |
11 | 2048 | 26 | 3,46·10⁻³²³⁵⁸ |
13 | 8192 | 24 | 1,44·10⁻¹²⁹⁴³⁰ |
* вероятность отсутствия коллизии определяется согласно схеме «парадокса дней рождений».
Настоящим требованием переход на 256-битовый идентификатор объекта не предусматривается; примерный состав идентификатора объекта увеличенной разрядности приведён в таблице 6 (справочно, вне объёма работ).
Таблица 6. Примерный формат идентификатора объекта увеличенной разрядности (справочно)
№ | Разрядность | Назначение |
1 | 8 бит | Версия чейнкода |
2 | 8 бит | Контрольная сумма |
3 | 1 бит | Глобальность адреса |
4 | 1 бит | Область действия |
5 | 8 бит | Тип актива |
6 | 28 бит | Идентификатор реестра |
7 | 60 бит | Идентификатор владельца реестра |
8 | 14 бит | Версия uuid + служебные биты |
9 | 128 бит | Идентификатор актива |
4.2.4.4 Требования к методам сервисного чейнкода
Для обеспечения работы с активами в каналах реализуются методы сервисного чейнкода согласно таблице 7 (входные данные — аргументы методов, выходные данные — результаты методов).
Таблица 7. Методы сервисного чейнкода
№ | Метод | Аргументы | Результат | Описание |
1 | SetRegistry | Все поля сервисной базы данных (кроме registryID) | registryID | Регистрирует нового издателя в служебной базе данных (возвращая 0) либо ротирует канал, возвращая registryID + 1 (не более 31) |
2 | GetAssetType | Данные актива (JSON) | assetType | В соответствии с версией сервисного чейнкода возвращает числовое значение типа актива |
3 | GetKeyDateTime | Данные актива (JSON) | dateTime | Определяет ключевую дату для актива |
4 | GetServiceCCVersion | dateTime = Now() | serviceCCVersion | Возвращает текущую версию сервисного чейнкода либо актуальную на заданный момент времени |
5 | ResolveUUID (GetRegisterByUUID) | UUID | { channelName, chaincodeName } | Определяет тип и ключевую дату для искомого актива, версию s_cc, вычисляет издателя, находит его реестр для актива и возвращает пару значений «канал + чейнкод» |
6 | GetRegisterByAsset | Данные актива (JSON) | { channelName, chaincodeName } | Выполняет формирование идентификатора объекта и его маршрутизацию |
7 | GetRegistersByIssue | Данные актива (JSON) | [ { channelName, chaincodeName, RecordID } ] | Подыскивает по сервисной базе данных все возможные (по версиям s_cc) реестры для данного актива и его издателя |
8 | ResolveCollision | Данные актива (JSON) | IssuerIDAddon | Определяет требуемую добавку к issuerID в виде issuerIDAddon |
Разрешение возможных коллизий между владельцами реестров обеспечивается полями issuerID, issuerIDAddon, roundsNum: при обнаружении коллизии создаётся дополнительная запись в сервисную базу данных; при обеспечении маршрутизации производится проверка наличия записи о коллизии в сервисном чейнкоде, после чего данные о записи уточняются по точному значению идентификатора.
Разрешение возможных коллизий между объектами реестра обеспечивается полями collisionID, uniqueIDForCollision: при обнаружении коллизии создаётся дополнительная запись в сервисную базу данных; при обеспечении маршрутизации производится проверка наличия записи о коллизии в сервисном чейнкоде, после чего данные о записи уточняются по точному значению идентификатора.
Сервисный чейнкод содержится в канале ГУЦ.
4.2.4.5 Требования к методам формирования идентификатора объекта по данным актива
Для работы с активами реализуются методы получения идентификатора объекта по данным актива согласно таблице 8.
Таблица 8. Методы формирования идентификатора объекта по данным актива
№ | Метод | Аргументы | Результат | Описание |
1 | getUUIDFromCenterOfAuthority | Структура сведений об аккредитации | UUID | По значению ОГРН УЦ формирует значение UUID |
2 | getUUIDFromCertificate | Структура сведений о сертификате | UUID | По значению хэша серийного номера, Issuer.OGRN (или хэша от поля Issuer) формирует значение UUID |
3 | getUUIDFromDigitalSignature | Структура сведений об электронной подписи | UUID | По значению электронной подписи, ОГРН издателя сертификата подписи (или хэша от поля Issuer издателя) формирует значение UUID |