ваше сообщение коммита
This commit is contained in:
105
backend/docs/AUTO_VERIFICATION.md
Normal file
105
backend/docs/AUTO_VERIFICATION.md
Normal file
@@ -0,0 +1,105 @@
|
||||
# Автоматическая верификация контрактов
|
||||
|
||||
## Обзор
|
||||
|
||||
Автоматическая верификация контрактов интегрирована в процесс деплоя DLE. После успешного деплоя контрактов во всех выбранных сетях, система автоматически запускает процесс верификации на соответствующих блокчейн-эксплорерах.
|
||||
|
||||
## Как это работает
|
||||
|
||||
1. **Настройка в форме деплоя**: В форме деплоя DLE есть чекбокс "Авто-верификация после деплоя" (по умолчанию включен)
|
||||
2. **Деплой контрактов**: Система разворачивает DLE контракты во всех выбранных сетях
|
||||
3. **Автоматическая верификация**: Если `autoVerifyAfterDeploy = true`, система автоматически запускает верификацию
|
||||
4. **Результаты**: Статус верификации отображается в логах деплоя
|
||||
|
||||
## Поддерживаемые сети
|
||||
|
||||
Автоматическая верификация работает для всех сетей, настроенных в `hardhat.config.js`:
|
||||
|
||||
- **Sepolia** (Ethereum testnet)
|
||||
- **Holesky** (Ethereum testnet)
|
||||
- **Arbitrum Sepolia**
|
||||
- **Base Sepolia**
|
||||
- **И другие сети** (настраиваются в конфиге)
|
||||
|
||||
## Требования
|
||||
|
||||
1. **Etherscan API ключ**: Должен быть указан в форме деплоя
|
||||
2. **Права на запись**: Приватный ключ должен иметь права на деплой контрактов
|
||||
3. **Сеть доступна**: RPC провайдеры для всех выбранных сетей должны быть доступны
|
||||
|
||||
## Логи и мониторинг
|
||||
|
||||
### В логах деплоя вы увидите:
|
||||
|
||||
```
|
||||
[MULTI_DBG] autoVerifyAfterDeploy: true
|
||||
[MULTI_DBG] Starting automatic contract verification...
|
||||
🔍 Верификация в сети sepolia (chainId: 11155111)
|
||||
✅ Верификация успешна: https://sepolia.etherscan.io/address/0x...
|
||||
[MULTI_DBG] ✅ Automatic verification completed successfully
|
||||
```
|
||||
|
||||
### Статусы верификации:
|
||||
|
||||
- `verified` - контракт успешно верифицирован
|
||||
- `verification_failed` - ошибка верификации
|
||||
- `disabled` - верификация отключена
|
||||
- `already_verified` - контракт уже был верифицирован ранее
|
||||
|
||||
## Отключение автоматической верификации
|
||||
|
||||
Если вы хотите отключить автоматическую верификацию:
|
||||
|
||||
1. В форме деплоя снимите галочку "Авто-верификация после деплоя"
|
||||
2. Или установите `autoVerifyAfterDeploy: false` в настройках
|
||||
|
||||
## Ручная верификация
|
||||
|
||||
Если автоматическая верификация не сработала, вы можете запустить верификацию вручную:
|
||||
|
||||
```bash
|
||||
# В Docker контейнере
|
||||
docker exec dapp-backend node scripts/verify-with-hardhat-v2.js
|
||||
|
||||
# Или через npm скрипт
|
||||
docker exec dapp-backend npm run verify:contracts
|
||||
```
|
||||
|
||||
## Техническая реализация
|
||||
|
||||
Автоматическая верификация интегрирована в `backend/scripts/deploy/deploy-multichain.js`:
|
||||
|
||||
```javascript
|
||||
if (params.autoVerifyAfterDeploy) {
|
||||
console.log('[MULTI_DBG] Starting automatic contract verification...');
|
||||
|
||||
try {
|
||||
const { verifyContracts } = require('../verify-with-hardhat-v2');
|
||||
await verifyContracts();
|
||||
verificationResults = networks.map(() => 'verified');
|
||||
console.log('[MULTI_DBG] ✅ Automatic verification completed successfully');
|
||||
} catch (verificationError) {
|
||||
console.error('[MULTI_DBG] ❌ Automatic verification failed:', verificationError.message);
|
||||
verificationResults = networks.map(() => 'verification_failed');
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Устранение проблем
|
||||
|
||||
### Ошибка "Contract already verified"
|
||||
Это нормально - контракт уже был верифицирован ранее.
|
||||
|
||||
### Ошибка "Rate limit exceeded"
|
||||
Система автоматически добавляет задержки между запросами к разным сетям.
|
||||
|
||||
### Ошибка "Network not supported"
|
||||
Убедитесь, что сеть настроена в `hardhat.config.js` и имеет правильный Etherscan API URL.
|
||||
|
||||
## Преимущества
|
||||
|
||||
1. **Автоматизация**: Не нужно запускать верификацию вручную
|
||||
2. **Надежность**: Верификация происходит сразу после деплоя
|
||||
3. **Мультисеть**: Верификация во всех развернутых сетях одновременно
|
||||
4. **Мониторинг**: Полная видимость процесса через логи
|
||||
5. **Интеграция**: Единый процесс деплоя и верификации
|
||||
@@ -1,173 +0,0 @@
|
||||
# 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`:
|
||||
|
||||
```javascript
|
||||
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 модулей используются в:
|
||||
|
||||
```solidity
|
||||
// Добавление модуля
|
||||
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 модуля
|
||||
|
||||
```javascript
|
||||
// В backend/constants/moduleIds.js
|
||||
const MODULE_IDS = {
|
||||
// ... существующие модули
|
||||
NEW_MODULE: '0x6e65776d6f64756c650000000000000000000000000000000000000000000000'
|
||||
};
|
||||
```
|
||||
|
||||
### 2. Обновить маппинги
|
||||
|
||||
```javascript
|
||||
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
|
||||
|
||||
```javascript
|
||||
// В 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. Обновить базу данных (если необходимо)
|
||||
|
||||
## Примеры
|
||||
|
||||
### Создание предложения для добавления модуля
|
||||
|
||||
```javascript
|
||||
const moduleId = MODULE_TYPE_TO_ID['treasury'];
|
||||
const moduleAddress = '0x1234567890123456789012345678901234567890';
|
||||
|
||||
// Создание предложения через governance
|
||||
const proposalId = await dleContract.createAddModuleProposal(
|
||||
'Добавить Treasury модуль',
|
||||
86400, // 1 день
|
||||
moduleId,
|
||||
moduleAddress,
|
||||
1 // Ethereum mainnet
|
||||
);
|
||||
```
|
||||
|
||||
### Проверка статуса модуля
|
||||
|
||||
```javascript
|
||||
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}`);
|
||||
```
|
||||
Reference in New Issue
Block a user