Files
DLE/backend/docs/MODULE_IDS.md

6.1 KiB
Raw Blame History

ID Модулей DLE

Обзор

В системе DLE каждый модуль имеет уникальный идентификатор (ID), который используется для:

  • Идентификации модуля в смарт-контракте
  • Создания governance предложений
  • Проверки статуса модуля

Формат ID

ID модулей представляют собой 32-байтные хеши в формате:

0x[32 байта в hex формате]

Стандартные модули

Стандартные модули используют ASCII-коды названий, дополненные нулями до 32 байт:

Модуль ID Описание
Treasury 0x7472656173757279000000000000000000000000000000000000000000000000 Модуль управления казной
Timelock 0x74696d656c6f636b000000000000000000000000000000000000000000000000 Модуль задержки выполнения
Reader 0x7265616465720000000000000000000000000000000000000000000000000000 Модуль чтения данных

Дополнительные модули

Дополнительные модули могут использовать другие форматы ID:

Модуль ID Описание
Multisig 0x6d756c7469736967000000000000000000000000000000000000000000000000 Мультиподписный модуль
Deactivation 0x646561637469766174696f6e0000000000000000000000000000000000000000 Модуль деактивации
Analytics 0x616e616c79746963730000000000000000000000000000000000000000000000 Модуль аналитики
Notifications 0x6e6f74696669636174696f6e7300000000000000000000000000000000000000 Модуль уведомлений

Использование в коде

Константы

Все ID модулей определены в файле backend/constants/moduleIds.js:

const { MODULE_IDS, MODULE_TYPE_TO_ID, MODULE_ID_TO_TYPE } = require('../constants/moduleIds');

// Использование
const treasuryId = MODULE_IDS.TREASURY;
const moduleType = MODULE_ID_TO_TYPE[moduleId];
const moduleId = MODULE_TYPE_TO_ID['treasury'];

API Endpoints

ID модулей используются в следующих API endpoints:

  • POST /api/dle-modules/initialize-modules - инициализация модулей
  • POST /api/dle-modules/deploy-module - деплой модуля
  • GET /api/dle-modules/check-module-status - проверка статуса модуля
  • POST /api/dle-history/get-extended-history - получение истории

Смарт-контракт

В смарт-контракте DLE ID модулей используются в:

// Добавление модуля
function createAddModuleProposal(
    string memory _description,
    uint256 _duration,
    bytes32 _moduleId,  // <-- ID модуля
    address _moduleAddress,
    uint256 _chainId
) external returns (uint256);

// Проверка модуля
function isModuleActive(bytes32 _moduleId) external view returns (bool);
function getModuleAddress(bytes32 _moduleId) external view returns (address);

Добавление новых модулей

1. Определить ID модуля

// В backend/constants/moduleIds.js
const MODULE_IDS = {
  // ... существующие модули
  NEW_MODULE: '0x6e65776d6f64756c650000000000000000000000000000000000000000000000'
};

2. Обновить маппинги

const MODULE_TYPE_TO_ID = {
  // ... существующие модули
  newModule: MODULE_IDS.NEW_MODULE
};

const MODULE_ID_TO_TYPE = {
  // ... существующие модули
  [MODULE_IDS.NEW_MODULE]: 'newModule'
};

const MODULE_NAMES = {
  // ... существующие модули
  newModule: 'New Module'
};

3. Обновить функцию getModuleName

// В backend/routes/dleHistory.js
function getModuleName(moduleId) {
  if (MODULE_ID_TO_TYPE[moduleId]) {
    const moduleType = MODULE_ID_TO_TYPE[moduleId];
    return MODULE_NAMES[moduleType] || moduleType;
  }
  
  const additionalModuleNames = {
    // ... существующие модули
    '0x6e65776d6f64756c650000000000000000000000000000000000000000000000': 'New Module'
  };
  
  return additionalModuleNames[moduleId] || `Module ${moduleId}`;
}

Безопасность

  • ID модулей должны быть уникальными
  • Не используйте предсказуемые ID для критических модулей
  • Все изменения ID должны проходить через governance

Миграция

При изменении ID модуля:

  1. Создать governance предложение для удаления старого модуля
  2. Создать governance предложение для добавления нового модуля с новым ID
  3. Обновить константы в коде
  4. Обновить базу данных (если необходимо)

Примеры

Создание предложения для добавления модуля

const moduleId = MODULE_TYPE_TO_ID['treasury'];
const moduleAddress = '0x1234567890123456789012345678901234567890';

// Создание предложения через governance
const proposalId = await dleContract.createAddModuleProposal(
  'Добавить Treasury модуль',
  86400, // 1 день
  moduleId,
  moduleAddress,
  1 // Ethereum mainnet
);

Проверка статуса модуля

const moduleId = MODULE_TYPE_TO_ID['treasury'];
const isActive = await dleContract.isModuleActive(moduleId);
const moduleAddress = await dleContract.getModuleAddress(moduleId);

console.log(`Treasury модуль: ${isActive ? 'активен' : 'неактивен'}`);
console.log(`Адрес: ${moduleAddress}`);