[English](https://hb3-accelerator.com/gitea/VC-HB3-Accelerator/Docs/src/branch/main/docs.en/security.md) | **Русский**

# Безопасность Digital Legal Entity (DLE)

## Содержание

1. [Введение](#введение)
2. [Модель безопасности](#модель-безопасности)
3. [Контроль доступа на основе токенов](#контроль-доступа-на-основе-токенов)
4. [Безопасность смарт-контрактов](#безопасность-смарт-контрактов)
5. [Защита от взлома кошельков](#защита-от-взлома-кошельков)
6. [Безопасность веб-приложения](#безопасность-веб-приложения)
7. [Управление модулями](#управление-модулями)
8. [Аудит и мониторинг](#аудит-и-мониторинг)
9. [Рекомендации по безопасности](#рекомендации-по-безопасности)
10. [Сценарии атак и защита](#сценарии-атак-и-защита)

---

## Введение

Digital Legal Entity (DLE) построен с фокусом на **безопасность на всех уровнях**:
- Контроль доступа через блокчейн-токены
- Защита смарт-контрактов от взлома
- Невозможность кражи токенов даже при взломе кошелька
- Управление только через голосование с кворумом

### Ключевые принципы безопасности

1. **Защита по умолчанию** - все действия запрещены, пока явно не разрешены
2. **Минимальные привилегии** - каждый получает только необходимые права
3. **Прозрачность** - все действия записаны на блокчейне
4. **Неизменяемость** - невозможно подделать историю
5. **Коллективный контроль** - критичные операции только через голосование

---

## Модель безопасности

### Архитектура безопасности

```
┌─────────────────────────────────────────────────────────────┐
│                    Уровни защиты DLE                        │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  Уровень 1: Блокчейн (Неизменяемая база)                   │
│  ┌───────────────────────────────────────────────────────┐  │
│  │ • Смарт-контракт DLE (проверен, иммутабельный)       │  │
│  │ • Токены управления (ERC20Votes)                      │  │
│  │ • История всех операций на блокчейне                  │  │
│  │ • Невозможность изменения правил без голосования      │  │
│  └───────────────────────────────────────────────────────┘  │
│                           ↑                                 │
│  Уровень 2: Веб-приложение (Backend)                       │
│  ┌───────────────────────────────────────────────────────┐  │
│  │ • Проверка токенов в реальном времени                 │  │
│  │ • Аутентификация через кошелек (SIWE)                 │  │
│  │ • Шифрование данных (AES-256)                         │  │
│  │ • Rate limiting и защита от DDoS                      │  │
│  └───────────────────────────────────────────────────────┘  │
│                           ↑                                 │
│  Уровень 3: Frontend (Vue.js)                               │
│  ┌───────────────────────────────────────────────────────┐  │
│  │ • Подключение к кошельку                              │  │
│  │ • Подпись транзакций                                  │  │
│  │ • XSS защита (DOMPurify)                              │  │
│  │ • CSRF токены                                         │  │
│  └───────────────────────────────────────────────────────┘  │
│                           ↑                                 │
│  Уровень 4: Пользователь                                    │
│  ┌───────────────────────────────────────────────────────┐  │
│  │ • Приватный ключ кошелька (MetaMask, WalletConnect)  │  │
│  │ • Подтверждение каждой операции                       │  │
│  └───────────────────────────────────────────────────────┘  │
└─────────────────────────────────────────────────────────────┘
```

### Модель угроз

| Угроза | Уровень риска | Защита |
|--------|---------------|--------|
| **Взлом кошелька** | Средний | Токены нельзя перевести без голосования |
| **Взлом веб-приложения** | Низкий | Все права проверяются на блокчейне, управление через блокчейн-сканеры |
| **Компрометация смарт-контракта** | Низкий | Аудит, OpenZeppelin, иммутабельность |
| **DDoS атака** | Средний | Rate limiting, CDN, резервные сервера |
| **Фишинг** | Высокий | Обучение пользователей, проверка домена |
| **Insider threat** | Низкий | Все действия через голосование |

### Критически важно: веб-приложение — это только интерфейс

**Ключевая особенность архитектуры DLE:**

```
┌─────────────────────────────────────────────────────────┐
│              Веб-приложение (интерфейс)                 │
│                                                         │
│  Frontend + Backend = УДОБСТВО использования           │
│  • Красивый UI                                         │
│  • Удобная навигация                                   │
│  • Быстрый доступ к функциям                           │
│                                                         │
│  Может быть взломано/недоступно                          │
│  ✅ НО! Активы бизнеса защищены                         │
└─────────────────────────────────────────────────────────┘
                           ↓
┌─────────────────────────────────────────────────────────┐
│               Блокчейн (реальная власть)                │
│                                                         │
│  Смарт-контракты = РЕАЛЬНОЕ управление активами        │
│  • Токены управления                                   │
│  • Казна с активами                                    │
│  • Правила голосования                                 │
│  • История всех решений                                │
│                                                         │
│  Защищено криптографией                                 │
│  ✅ Работает независимо от веб-приложения               │
└─────────────────────────────────────────────────────────┘
```

**Что происходит при взломе веб-приложения:**

```
Веб-приложение взломано/недоступно:
├── ❌ Веб-интерфейс не работает
├── ❌ Backend может показывать неверную информацию
├── ❌ Frontend может быть подменен
│
НО:
├── ✅ Все активы бизнеса остаются на блокчейне
├── ✅ Смарт-контракты продолжают работать
├── ✅ Токены невозможно украсть
├── ✅ Можно управлять через Etherscan/Polygonscan/др.
└── ✅ Можно создать новый frontend и подключить к тем же контрактам
```

**Реальный пример:**

1. Злоумышленник взламывает ваш сервер с веб-приложением
2. Пытается показать поддельные балансы токенов
3. **Но**: Реальные балансы на блокчейне остаются неизменными
4. Вы открываете Etherscan и видите правду
5. Создаете предложение через Etherscan на восстановление
6. Голосуете и исполняете предложение
7. Восстанавливаете веб-приложение
8. **Результат**: Ни один токен не потерян ✅

---

## Контроль доступа на основе токенов

### Принцип работы

**Без токенов доступ к приложению НЕВОЗМОЖЕН.**

```
Попытка доступа к DLE:
├── 1. Пользователь подключает кошелек
├── 2. Backend проверяет баланс токенов в смарт-контракте
├── 3. Если токенов НЕТ → Доступ ЗАПРЕЩЕН
└── 4. Если токены ЕСТЬ → Доступ разрешен (уровень зависит от количества)
```

### Уровни доступа

| Токенов на балансе | Уровень доступа | Права |
|-------------------|-----------------|-------|
| **0 токенов** | ❌ Нет доступа | Только страница "Нет доступа" |
| **1+ токенов** | ✅ ReadOnly | Просмотр данных |
| **100+ токенов** | ✅ Editor | Редактирование, создание |
| **Любое количество** | 🗳️ Голосование | 1 токен = 1 голос |

### Проверка токенов в реальном времени

**Backend** постоянно проверяет баланс токенов:

```javascript
// Каждый запрос проверяет токены
async function checkAccess(req, res, next) {
    const address = req.session.address;
    
    // Получаем баланс токенов из смарт-контракта
    const dleContract = new ethers.Contract(dleAddress, dleAbi, provider);
    const balance = await dleContract.balanceOf(address);
    
    if (balance === 0n) {
        return res.status(403).json({ 
            error: 'Доступ запрещен: нет токенов' 
        });
    }
    
    // Определяем уровень доступа
    const accessLevel = determineAccessLevel(balance);
    req.user = { address, balance, accessLevel };
    
    next();
}
```

**Важно**: Проверка происходит на **каждом запросе**, поэтому:
- ✅ Если токены переведены → доступ мгновенно теряется
- ✅ Если токены получены → доступ мгновенно появляется
- ✅ Невозможно обойти проверку

### Начальное распределение токенов

**Токены распределяет владелец при деплое смарт-контракта:**

```solidity
constructor(DLEConfig memory config) {
    // Создаем токены
    _mint(address(this), totalSupply);
    
    // Распределяем среди партнеров
    for (uint i = 0; i < config.initialPartners.length; i++) {
        _transfer(
            address(this), 
            config.initialPartners[i], 
            config.initialAmounts[i]
        );
    }
}
```

**Процесс**:
1. Владелец кошелька деплоит смарт-контракт DLE
2. Указывает адреса партнеров и количество токенов для каждого
3. Токены автоматически распределяются при деплое
4. После этого все изменения только через голосование

**Пример распределения**:
```javascript
const config = {
    initialPartners: [
        '0xAlice...', // Основатель 1
        '0xBob...',   // Основатель 2
        '0xCarol...'  // Инвестор
    ],
    initialAmounts: [
        500000,  // 50% для Alice
        300000,  // 30% для Bob
        200000   // 20% для Carol
    ]
};
```

---

## Безопасность смарт-контрактов

### Защита от переводов токенов

**КРИТИЧНО**: Токены управления **НЕЛЬЗЯ** перевести обычными способами!

```solidity
// Переводы ЗАБЛОКИРОВАНЫ
function transfer(address to, uint256 amount) 
    public 
    pure 
    override 
    returns (bool) 
{
    revert ErrTransfersDisabled();
}

// Одобрения ЗАБЛОКИРОВАНЫ
function approve(address spender, uint256 amount) 
    public 
    pure 
    override 
    returns (bool) 
{
    revert ErrApprovalsDisabled();
}

// TransferFrom ЗАБЛОКИРОВАН
function transferFrom(address from, address to, uint256 amount) 
    public 
    pure 
    override 
    returns (bool) 
{
    revert ErrTransfersDisabled();
}
```

**Что это означает**:
- ❌ Невозможно отправить токены на биржу
- ❌ Невозможно продать токены на DEX
- ❌ Невозможно передать токены другому лицу напрямую
- ❌ Злоумышленник НЕ может украсть токены даже со взломанного кошелька

### Единственный способ перевода токенов

**Только через голосование с кворумом:**

```solidity
// Перевод токенов (только через голосование)
function _transferTokens(address recipient, uint256 amount) internal {
    require(msg.sender == address(this), "Only through governance");
    _transfer(address(this), recipient, amount);
}
```

**Процесс перевода**:
```
1. Создание предложения
   ├── "Перевести 1000 токенов на адрес 0xNew..."
   └── Требуется: минимум 1 токен для создания

2. Голосование
   ├── Длительность: 1-30 дней (настраивается)
   ├── Каждый токен = 1 голос
   └── Требуется: кворум (например, 10% от всех токенов)

3. Проверка кворума
   ├── Если "За" > "Против" И кворум достигнут
   └── → Предложение одобрено

4. Исполнение
   ├── Смарт-контракт автоматически переводит токены
   └── Событие записано на блокчейне навсегда
```

### Настройка кворума

**Кворум устанавливается при деплое** и может быть изменен только через голосование:

```solidity
uint256 public quorumPercentage; // Например, 10%

function _hasQuorum(uint256 forVotes, uint256 againstVotes) 
    internal 
    view 
    returns (bool) 
{
    uint256 totalVotes = forVotes + againstVotes;
    uint256 required = (totalSupply() * quorumPercentage) / 100;
    return totalVotes >= required;
}
```

**Примеры кворума**:
- 5% - легко достичь (для активных организаций)
- 10% - стандартный (рекомендуется)
- 20% - строгий (для критичных решений)
- 51% - абсолютное большинство

### Защита от реентерабельности

```solidity
import "@openzeppelin/contracts/utils/ReentrancyGuard.sol";

contract DLE is ReentrancyGuard {
    function execute(uint256 proposalId) 
        external 
        nonReentrant  // Защита от реентерабельности
    {
        // Исполнение предложения
    }
}
```

### Защита от flash-loans

**Снапшоты голосов** предотвращают атаки с временным займом токенов:

```solidity
// Голоса берутся из ПРОШЛОГО блока
uint256 public snapshotTimepoint = block.number - 1;

function vote(uint256 proposalId, bool support) external {
    // Используем баланс из прошлого блока
    uint256 votingPower = getPastVotes(msg.sender, snapshotTimepoint);
    require(votingPower > 0, "No voting power");
    
    // Голосование
}
```

**Почему это безопасно**:
1. Злоумышленник берет flash-loan на 1,000,000 токенов
2. Пытается проголосовать
3. Смарт-контракт проверяет баланс в **прошлом блоке**
4. В прошлом блоке у злоумышленника было 0 токенов
5. Голосование отклонено ❌

### Валидация всех параметров

```solidity
// Проверка адресов
if (address == address(0)) revert ErrZeroAddress();

// Проверка наличия токенов
if (balanceOf(msg.sender) == 0) revert ErrNotHolder();

// Проверка длительности голосования
if (duration < minVotingDuration) revert ErrTooShort();
if (duration > maxVotingDuration) revert ErrTooLong();

// Проверка поддерживаемых сетей
if (!supportedChains[chainId]) revert ErrUnsupportedChain();
```

### Custom errors для экономии gas

```solidity
// Экономия gas: custom errors вместо require
error ErrZeroAddress();
error ErrNotHolder();
error ErrAlreadyVoted();
error ErrTransfersDisabled();
error ErrApprovalsDisabled();
error ErrProposalMissing();
error ErrWrongChain();
```

---

## Защита от взлома кошельков

### Сценарий: Злоумышленник получил приватный ключ

**Что может сделать злоумышленник:**

```
Попытки злоумышленника:

1. ❌ Отправить токены на свой адрес
   └── БЛОКИРОВАНО: transfer() заблокирован

2. ❌ Продать токены на DEX (Uniswap, etc.)
   └── БЛОКИРОВАНО: approve() заблокирован

3. ❌ Отправить через transferFrom
   └── БЛОКИРОВАНО: transferFrom() заблокирован

4. ❓ Создать предложение "Перевести токены мне"
   └── Требуется голосование других токен-холдеров
   └── Кворум: 10%+ должны проголосовать "За"
   └── СКОРЕЕ ВСЕГО ПРОВАЛИТСЯ
```

### Реальный пример атаки

```
Злоумышленник взломал кошелек Alice (500,000 токенов):

1. Создает предложение:
   "Перевести 500,000 токенов на адрес 0xEvil..."
   
2. Голосует "За" своими 500,000 голосами (50%)

3. Но кворум = 10% = 100,000 голосов
   Уже достигнут? ДА ✅

4. "За" = 500,000 (50%)
   "Против" = 0
   
5. Результат: Предложение ОДОБРЕНО ❌

ПРОБЛЕМА: Если у Alice большинство токенов!
```

### Защита от атаки с большинством токенов

**Решение 1: Timelock Module**

```solidity
// Отложенное исполнение (например, 3 дня)
uint256 public constant TIMELOCK_DELAY = 3 days;

function scheduleProposal(uint256 proposalId) external {
    // Предложение одобрено, но исполнится только через 3 дня
    executionTime = block.timestamp + TIMELOCK_DELAY;
}
```

**Преимущество**: Другие токен-холдеры видят опасное предложение и могут:
- Проголосовать "Против"
- Создать контр-предложение
- Принять меры (например, обратиться в суд)

**Решение 2: Мультиподпись**

```solidity
// Требуется несколько подписей для критичных операций
mapping(uint256 => mapping(address => bool)) public approvals;

function executeWithApprovals(
    uint256 proposalId,
    address[] calldata signers,
    bytes[] calldata signatures
) external {
    // Проверяем подписи нескольких токен-холдеров
    require(signers.length >= minSigners, "Not enough signers");
    
    for (uint i = 0; i < signers.length; i++) {
        // Проверка подписи
        verifySignature(proposalId, signers[i], signatures[i]);
    }
    
    // Исполнение
}
```

**Решение 3: Холодный кошелек для крупных холдеров**

Рекомендуется держать токены на:
- 🥶 **Hardware wallet** (Ledger, Trezor) - максимальная защита
- **Мультиподпись** (Gnosis Safe) — требуется несколько подписей
- ❄️ **Холодное хранение** - offline, не подключен к интернету

### Мониторинг подозрительных предложений

**Backend автоматически детектирует опасные предложения:**

```javascript
// Детектор подозрительных предложений
function detectSuspiciousProposal(proposal) {
    const alerts = [];
    
    // Проверка 1: Перевод большого количества токенов
    if (proposal.operation.includes('_transferTokens')) {
        const amount = decodeAmount(proposal.operation);
        const percentage = (amount / totalSupply) * 100;
        
        if (percentage > 10) {
            alerts.push({
                level: 'HIGH',
                message: `Предложение переводит ${percentage}% всех токенов!`
            });
        }
    }
    
    // Проверка 2: Инициатор голосует своими токенами
    if (proposal.forVotes === proposal.initiatorBalance) {
        alerts.push({
            level: 'MEDIUM',
            message: 'Инициатор голосует только своими токенами'
        });
    }
    
    // Проверка 3: Быстрое голосование (< 24 часов)
    if (proposal.duration < 86400) {
        alerts.push({
            level: 'MEDIUM',
            message: 'Голосование менее 24 часов - мало времени на проверку'
        });
    }
    
    // Отправляем уведомления всем токен-холдерам
    if (alerts.length > 0) {
        notifyAllTokenHolders(proposal, alerts);
    }
}
```

---

## Безопасность веб-приложения

### Аутентификация через SIWE

**Sign-In with Ethereum** - стандарт безопасной аутентификации:

```javascript
// Генерация nonce (одноразовый)
const nonce = crypto.randomBytes(32).toString('hex');

// Сохранение в БД с шифрованием
await db.query(
    'INSERT INTO nonces (address_encrypted, nonce_encrypted, expires_at) VALUES ($1, $2, $3)',
    [encrypt(address), encrypt(nonce), expiresAt]
);

// Проверка подписи
const message = new SiweMessage({
    domain: req.get('host'),
    address: ethers.getAddress(address),
    nonce: nonce,
    chainId: 1
});

const isValid = await verifySignature(
    message.prepareMessage(),
    signature,
    address
);
```

**Безопасность**:
- ✅ Приватный ключ **никогда** не покидает кошелек
- ✅ Каждый nonce используется **один раз**
- ✅ Nonce истекает через 5 минут
- ✅ Подделать подпись невозможно без приватного ключа

### Шифрование данных

```javascript
// AES-256 шифрование
const crypto = require('crypto');

function encrypt(text, key) {
    const iv = crypto.randomBytes(16);
    const cipher = crypto.createCipheriv('aes-256-cbc', key, iv);
    
    let encrypted = cipher.update(text, 'utf8', 'hex');
    encrypted += cipher.final('hex');
    
    return iv.toString('hex') + ':' + encrypted;
}

function decrypt(encrypted, key) {
    const parts = encrypted.split(':');
    const iv = Buffer.from(parts[0], 'hex');
    const encryptedText = parts[1];
    
    const decipher = crypto.createDecipheriv('aes-256-cbc', key, iv);
    let decrypted = decipher.update(encryptedText, 'hex', 'utf8');
    decrypted += decipher.final('utf8');
    
    return decrypted;
}
```

**Что шифруется**:
- Адреса кошельков в БД
- Nonces для аутентификации
- Сессионные данные
- Приватные сообщения

### Rate Limiting

```javascript
const rateLimit = require('express-rate-limit');

// Ограничение запросов
const apiLimiter = rateLimit({
    windowMs: 15 * 60 * 1000, // 15 минут
    max: 100, // максимум 100 запросов
    message: 'Слишком много запросов, попробуйте позже'
});

// Ограничение для аутентификации (более строгое)
const authLimiter = rateLimit({
    windowMs: 15 * 60 * 1000,
    max: 5, // максимум 5 попыток аутентификации
    skipSuccessfulRequests: true
});

app.use('/api/', apiLimiter);
app.use('/api/auth/', authLimiter);
```

### CSRF защита

```javascript
const csrf = require('csurf');

// CSRF токены для всех форм
const csrfProtection = csrf({ cookie: true });

app.post('/api/action', csrfProtection, async (req, res) => {
    // Проверка CSRF токена автоматическая
});
```

### XSS защита

```javascript
import DOMPurify from 'dompurify';

// Очистка HTML от опасного кода
function sanitizeHTML(html) {
    return DOMPurify.sanitize(html, {
        ALLOWED_TAGS: ['b', 'i', 'em', 'strong', 'a', 'p'],
        ALLOWED_ATTR: ['href']
    });
}

// Использование
const userInput = req.body.comment;
const safeHTML = sanitizeHTML(userInput);
```

### Helmet.js для защиты заголовков

```javascript
const helmet = require('helmet');

app.use(helmet({
    contentSecurityPolicy: {
        directives: {
            defaultSrc: ["'self'"],
            scriptSrc: ["'self'", "'unsafe-inline'"],
            styleSrc: ["'self'", "'unsafe-inline'"],
            imgSrc: ["'self'", "data:", "https:"],
        }
    },
    hsts: {
        maxAge: 31536000,
        includeSubDomains: true,
        preload: true
    }
}));
```

### Clean Logs система

**Автоматическая очистка логов от чувствительных данных:**

```javascript
function cleanLogs() {
    const sensitivePatterns = [
        /0x[a-fA-F0-9]{40}/g,  // Адреса кошельков
        /pk_[a-zA-Z0-9]{64}/g,  // Приватные ключи (если случайно залогированы)
        /nonce:\s*[a-f0-9]{64}/gi,  // Nonces
    ];
    
    // Замена чувствительных данных на ***
    let cleanedLog = logContent;
    sensitivePatterns.forEach(pattern => {
        cleanedLog = cleanedLog.replace(pattern, '[REDACTED]');
    });
    
    return cleanedLog;
}
```

---

## Управление модулями

### Только смарт-контракт DLE управляет модулями

**Модификатор `onlyDLE`** гарантирует, что только смарт-контракт DLE может вызывать функции модуля:

```solidity
// Модуль: TreasuryModule
contract TreasuryModule {
    address public immutable dleContract;
    
    modifier onlyDLE() {
        require(msg.sender == dleContract, "Only DLE can call");
        _;
    }
    
    // Только DLE может переводить токены из казны
    function transferTokens(
        address token,
        address recipient,
        uint256 amount
    ) external onlyDLE {
        IERC20(token).transfer(recipient, amount);
    }
}
```

**Что это означает**:
- ❌ Владелец кошелька **НЕ может** напрямую вызвать функции модуля
- ❌ Backend **НЕ может** вызвать функции модуля
- ❌ Злоумышленник **НЕ может** взаимодействовать с модулем
- ✅ **Только** смарт-контракт DLE через голосование

### Процесс использования модуля

```
1. Токен-холдер создает предложение
   └── "Перевести 1000 USDC из Treasury на маркетинг"

2. Предложение содержит закодированный вызов функции модуля
   └── operation = treasuryModule.transferTokens(USDC, marketing, 1000)

3. Голосование

4. Если одобрено, DLE контракт вызывает модуль:
   └── TreasuryModule.transferTokens() ✅
   └── msg.sender = DLE контракт ✅
   
5. Модуль проверяет msg.sender и исполняет
```

### Добавление нового модуля

**Только через голосование:**

```solidity
// Операция добавления модуля
function _addModule(bytes32 moduleId, address moduleAddress) internal {
    require(msg.sender == address(this), "Only through voting");
    require(moduleAddress != address(0), "Invalid address");
    require(!activeModules[moduleId], "Module already exists");
    
    modules[moduleId] = moduleAddress;
    activeModules[moduleId] = true;
    
    emit ModuleAdded(moduleId, moduleAddress);
}
```

**Процесс**:
1. Деплой нового модуля
2. Создание предложения: "Добавить модуль X по адресу 0x..."
3. Голосование
4. Если одобрено → модуль добавлен
5. Модуль можно использовать

### Удаление скомпрометированного модуля

Если модуль оказался уязвимым:

```
1. Токен-холдер создает экстренное предложение
   └── "Удалить скомпрометированный модуль X"
   └── Длительность: 1 день (экстренное голосование)

2. Голосование (ускоренное)

3. Модуль удален
   └── Больше нельзя вызвать из DLE контракта
```

---

## Аудит и мониторинг

### Прозрачность на блокчейне

**Все действия записаны навсегда:**

```solidity
// События для аудита
event ProposalCreated(uint256 proposalId, address initiator);
event ProposalVoted(uint256 proposalId, address voter, bool support);
event ProposalExecuted(uint256 proposalId, bytes operation);
event ModuleAdded(bytes32 moduleId, address moduleAddress);
event TokensTransferred(address recipient, uint256 amount);
```

**Проверка в блокчейн-сканере:**
```
https://etherscan.io/address/0xDLE_CONTRACT_ADDRESS
└── Все транзакции видны публично
└── Невозможно скрыть или удалить
```

### Мониторинг в реальном времени

**Backend отслеживает все события:**

```javascript
// Подписка на события смарт-контракта
dleContract.on('ProposalCreated', async (proposalId, initiator, event) => {
    logger.info(`Новое предложение #${proposalId} от ${initiator}`);
    
    // Получаем детали предложения
    const proposal = await dleContract.proposals(proposalId);
    
    // Анализ безопасности
    const risks = analyzeProposalRisks(proposal);
    
    // Уведомление токен-холдеров
    if (risks.level === 'HIGH') {
        await notifyAllTokenHolders({
            type: 'SECURITY_ALERT',
            proposalId,
            risks
        });
    }
});
```

### Система алертов

```javascript
// Критичные события требуют немедленного уведомления
const criticalEvents = [
    'ProposalCreated',     // Новое предложение
    'ModuleAdded',         // Добавлен модуль
    'TokensTransferred'    // Переведены токены
];

async function sendAlert(event, data) {
    // Email уведомления
    await sendEmail({
        to: allTokenHolders,
        subject: `[DLE Alert] ${event}`,
        body: formatAlert(data)
    });
    
    // Telegram уведомления
    await sendTelegram({
        chat: dleNotificationsChat,
        message: formatAlert(data)
    });
    
    // Запись в логи
    logger.warn(`ALERT: ${event}`, data);
}
```

---

## Рекомендации по безопасности

### Для владельцев токенов

1. **Используйте hardware wallet** (Ledger, Trezor)
   - Приватный ключ никогда не покидает устройство
   - Подтверждение каждой операции на физическом устройстве

2. **Храните seed-фразу безопасно**
   - Напишите на бумаге, не храните в цифровом виде
   - Используйте металлические пластины для долговечности
   - Храните в сейфе или банковской ячейке

3. **Включите уведомления**
   - Email алерты на новые предложения
   - Telegram боты для критичных событий

4. **Проверяйте все предложения**
   - Читайте описание перед голосованием
   - Проверяйте адреса получателей
   - Используйте timelock для критичных операций

5. **Разделите токены**
   - Горячий кошелек: 10-20% для повседневного использования
   - Холодный кошелек: 80-90% для долгосрочного хранения

### Для администраторов

1. **Регулярные обновления**
   ```bash
   # Еженедельное обновление
   docker-compose pull
   docker-compose up -d
   ```

2. **Резервные копии**
   ```bash
   # Ежедневный бэкап базы данных
   docker exec dapp-postgres pg_dump -U user db > backup.sql
   ```

3. **Мониторинг логов**
   ```bash
   # Проверка логов на подозрительную активность
   docker logs dapp-backend | grep -i "error\|warning\|failed"
   ```

4. **Ротация ключей шифрования**
   - Меняйте ключ шифрования раз в год
   - Храните старые ключи для расшифровки исторических данных

5. **Firewall настройка**
   ```bash
   # Разрешить только необходимые порты
   ufw allow 80/tcp   # HTTP
   ufw allow 443/tcp  # HTTPS
   ufw enable
   ```

### Для разработчиков

1. **✅ Аудит смарт-контрактов**
   - Используйте Slither для статического анализа
   - Mythril для поиска уязвимостей
   - Ручной аудит критичного кода

2. **Тестирование**
   ```bash
   # Запуск тестов
   cd backend
   yarn test
   
   # Покрытие кода
   yarn coverage
   ```

3. **Код-ревью**
   - Все изменения через pull requests
   - Минимум 2 ревьюера для критичных изменений

4. **Безопасные зависимости**
   ```bash
   # Проверка уязвимостей
   yarn audit
   npm audit fix
   ```

---

## Сценарии атак и защита

### Сценарий 1: Фишинговая атака

**Атака:**
```
1. Злоумышленник создает поддельный сайт: dlle.com (вместо dle.com)
2. Отправляет фишинговые письма токен-холдерам
3. Просит подключить кошелек и подписать транзакцию
```

**Защита:**
```javascript
// Backend проверяет домен в SIWE сообщении
const message = new SiweMessage({
    domain: req.get('host'), // Должен быть правильный домен
    uri: req.get('origin')
});

// Frontend показывает предупреждение
if (window.location.hostname !== 'dle.app') {
    alert('ВНИМАНИЕ: Это НЕ официальный сайт DLE!');
}
```

**Рекомендации пользователям:**
- ✅ Всегда проверяйте URL перед подключением кошелька
- ✅ Используйте закладки браузера
- ✅ Проверяйте SSL сертификат (зеленый замок)

### Сценарий 2: Взлом backend сервера

**Атака:**
```
1. Злоумышленник получает доступ к backend серверу
2. Пытается изменить код для обхода проверки токенов
3. Или полностью выводит веб-приложение из строя
```

**Защита:**
```
✅ Проверка токенов происходит на блокчейне (неизменяемо)
✅ Backend может быть скомпрометирован, но:
   ├── Невозможно изменить баланс токенов в смарт-контракте
   ├── Невозможно создать поддельные токены
   ├── Невозможно изменить правила смарт-контракта
   └── Пользователи увидят расхождение между backend и блокчейном
```

**Критично: Веб-приложение - это только интерфейс!**

Даже при **полном взломе** веб-приложения:
- ✅ **Все активы бизнеса защищены** на блокчейне
- ✅ **Смарт-контракты продолжают работать** независимо от веб-приложения
- ✅ **Можно управлять через блокчейн-сканеры** (Etherscan, Polygonscan, и др.)

### Управление через блокчейн-сканеры

**Если веб-приложение недоступно, используйте блокчейн-сканеры:**

#### 1. Проверка баланса токенов

```
1. Откройте Etherscan: https://etherscan.io
2. Введите адрес смарт-контракта DLE
3. Перейдите на вкладку "Read Contract"
4. Вызовите функцию balanceOf(address)
5. Введите адрес вашего кошелька
6. Нажмите "Query" - увидите баланс токенов ✅
```

**Пример**:
```
Contract Address: 0x1234...DLE
Function: balanceOf
Address: 0xYourWallet...
Result: 500000 (ваш баланс токенов)
```

#### 2. Создание предложения через Etherscan

```
1. Откройте Etherscan и найдите смарт-контракт DLE
2. Перейдите на вкладку "Write Contract"
3. Подключите кошелек MetaMask
4. Найдите функцию createProposal
5. Заполните параметры:
   - description: "Восстановить веб-приложение"
   - operation: закодированный вызов функции
   - votingDuration: 86400 (1 день в секундах)
6. Нажмите "Write" и подтвердите транзакцию ✅
```

**Пример создания предложения**:
```solidity
// Через Etherscan Write Contract
createProposal(
    "Перевести 10,000 USDT на восстановление инфраструктуры",
    0x..., // закодированный вызов transferTokens
    86400  // 1 день
)
```

#### 3. Голосование через Etherscan

```
1. Откройте смарт-контракт DLE на Etherscan
2. Вкладка "Write Contract"
3. Подключите кошелек
4. Функция vote(uint256 proposalId, bool support)
   - proposalId: номер предложения (например, 5)
   - support: true (за) или false (против)
5. Нажмите "Write" ✅
```

#### 4. Проверка состояния предложения

```
1. Вкладка "Read Contract" на Etherscan
2. Функция proposals(uint256)
3. Введите ID предложения
4. Увидите все детали:
   - Описание
   - Голоса "За" и "Против"
   - Статус (Active, Executed, Failed)
   - Время окончания голосования
```

#### 5. Исполнение одобренного предложения

```
1. Если предложение одобрено и время истекло
2. Откройте "Write Contract"
3. Функция execute(uint256 proposalId)
4. Введите ID предложения
5. Нажмите "Write" - предложение исполнится ✅
```

### Популярные блокчейн-сканеры для DLE

| Сеть | Блокчейн-сканер | URL |
|------|-----------------|-----|
| **Ethereum Mainnet** | Etherscan | https://etherscan.io |
| **Polygon** | Polygonscan | https://polygonscan.com |
| **Binance Smart Chain** | BscScan | https://bscscan.com |
| **Arbitrum** | Arbiscan | https://arbiscan.io |
| **Optimism** | Optimistic Etherscan | https://optimistic.etherscan.io |
| **Avalanche** | SnowTrace | https://snowtrace.io |
| **Base** | BaseScan | https://basescan.org |

### Преимущества управления через блокчейн-сканеры

**1. Полная независимость от веб-приложения**
```
Веб-приложение взломано → Блокчейн работает ✅
Backend сервер упал → Смарт-контракты работают ✅
Frontend недоступен → Можно управлять через Etherscan ✅
```

**2. Невозможно подделать данные**
```
Злоумышленник на backend → Блокчейн-сканер показывает правду
Поддельный frontend → Etherscan покажет реальные токены
Измененная логика → Смарт-контракт работает как задумано
```

**3. Доступ 24/7 из любой точки мира**
```
Нет доступа к серверу → Etherscan доступен всегда
Приложение на обслуживании → Управление через блокчейн
DDoS атака на сайт → Блокчейн недоступен для DDoS
```

**Реакция на взлом:**
1. Пользователи замечают странное поведение веб-приложения
2. Проверяют баланс токенов напрямую через Etherscan ✅
3. Создают предложение через Etherscan на восстановление
4. Голосуют за восстановление инфраструктуры
5. Администраторы восстанавливают backend из резервной копии
6. **Никакие токены и активы не потеряны** ✅

**Вывод**: Веб-приложение - это лишь удобный интерфейс. Реальная власть и активы находятся на блокчейне, где они защищены криптографией и невозможно их изменить или украсть через взлом веб-приложения.

### Сценарий 3: 51% атака

**Атака:**
```
1. Злоумышленник покупает или получает >51% всех токенов
2. Создает предложение "Перевести все активы мне"
3. Голосует всеми своими токенами "За"
4. Предложение одобрено
```

**Защита:**
```javascript
// Timelock Module дает время на реакцию
const TIMELOCK = 7 days;

// Другие токен-холдеры могут:
1. Проголосовать "Против" (если у них еще 49%)
2. Создать контр-предложение
3. Обратиться в правоохранительные органы
4. Отменить предложение через emergency функцию (если настроена)
```

**Долгосрочная защита:**
- Равномерное распределение токенов между партнерами
- Мультиподпись для крупных операций
- Квадратичное голосование (опция для будущих версий)

### Сценарий 4: Social Engineering

**Атака:**
```
1. Злоумышленник выдает себя за поддержку DLE
2. Просит токен-холдера "для верификации" подписать сообщение
3. Сообщение на самом деле - одобрение перевода токенов
```

**Защита:**
```javascript
// Frontend всегда показывает ЧТО подписывается
function signMessage(message) {
    // Показываем пользователю точное содержимое
    const confirmation = confirm(`
        Вы собираетесь подписать:
        ${message}
        
        НИКОГДА не подписывайте сообщения по просьбе «поддержки»!
        
        Продолжить?
    `);
    
    if (!confirmation) return;
    
    // Подпись
}
```

**Рекомендации:**
- ❌ Поддержка **НИКОГДА** не попросит подписать сообщение
- ❌ Не доверяйте "срочным" запросам
- ✅ Всегда проверяйте, что подписываете
- ✅ При сомнениях - свяжитесь с официальной поддержкой

---

## Заключение

### Многоуровневая защита DLE

```
┌─────────────────────────────────────────────────────┐
│           Уровни безопасности DLE                   │
├─────────────────────────────────────────────────────┤
│  1️⃣ Блокчейн                                         │
│     └── Токены нельзя украсть даже со взломом       │
│                                                     │
│  2️⃣ Смарт-контракты                                 │
│     └── Аудит, OpenZeppelin, иммутабельность        │
│                                                     │
│  3️⃣ Голосование с кворумом                          │
│     └── Невозможно единоличное решение              │
│                                                     │
│  4️⃣ Timelock                                        │
│     └── Время на реакцию при атаке                  │
│                                                     │
│  5️⃣ Backend проверки                               │
│     └── Проверка токенов в реальном времени         │
│                                                     │
│  6️⃣ Frontend защита                                │
│     └── XSS, CSRF, rate limiting                    │
│                                                     │
│  7️⃣ Мониторинг и алерты                            │
│     └── Детекция подозрительных действий            │
└─────────────────────────────────────────────────────┘
```

### Ключевые преимущества безопасности

1. **Контроль доступа через токены**
   - Без токенов доступ невозможен
   - Проверка в реальном времени на блокчейне

2. **Защита от кражи токенов**
   - Невозможно перевести без голосования
   - Даже при взломе кошелька токены защищены

3. **🌐 Независимость от веб-приложения**
   - Даже при взломе веб-приложения активы бизнеса защищены на блокчейне
   - Можно управлять через блокчейн-сканеры (Etherscan, Polygonscan и др.)
   - Смарт-контракты работают независимо от frontend/backend
   - Веб-приложение - это только удобный интерфейс, реальная власть на блокчейне

4. **Коллективное управление**
   - Критичные решения только через голосование
   - Кворум предотвращает единоличные действия

5. **Модули под контролем смарт-контракта**
   - Только DLE контракт может вызывать модули
   - Никакого прямого доступа

6. **📊 Полная прозрачность**
   - Все действия на блокчейне
   - Невозможно скрыть или подделать

### Следующие шаги

1. [Изучите техническую документацию](./back-docs/blockchain-integration-technical.md)
2. [Настройте безопасное окружение](./back-docs/setup-instruction.md)
3. [Прочитайте FAQ](https://github.com/VC-HB3-Accelerator/.github/blob/main/ru/FAQ.md)
4. [Получите поддержку](https://hb3-accelerator.com/)
---

**© 2024-2026 Тарабанов Александр Викторович. Все права защищены.**

**Последнее обновление**: February 2026

