ваше сообщение коммита
This commit is contained in:
4133
backend/db/data/isic_titles_ru.csv
Normal file
4133
backend/db/data/isic_titles_ru.csv
Normal file
File diff suppressed because it is too large
Load Diff
@@ -59,7 +59,8 @@
|
||||
"utf7": "^1.0.2",
|
||||
"viem": "^2.23.15",
|
||||
"winston": "^3.17.0",
|
||||
"ws": "^8.18.1"
|
||||
"ws": "^8.18.1",
|
||||
"csv-parser": "^3.0.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@nomicfoundation/hardhat-chai-matchers": "^2.0.0",
|
||||
|
||||
@@ -2,6 +2,8 @@ const express = require('express');
|
||||
const router = express.Router();
|
||||
const db = require('../db');
|
||||
const logger = require('../utils/logger'); // Если используете логгер
|
||||
const fs = require('fs');
|
||||
const csv = require('csv-parser');
|
||||
|
||||
/**
|
||||
* @swagger
|
||||
@@ -72,6 +74,49 @@ router.get('/codes', async (req, res) => {
|
||||
const page = parseInt(req.query.page, 10) || 1;
|
||||
const limit = parseInt(req.query.limit, 10) || 25;
|
||||
const offset = (page - 1) * limit;
|
||||
const { lang } = req.query;
|
||||
|
||||
// Если запрошен русский язык — отдаём из CSV
|
||||
if (lang === 'ru') {
|
||||
const { level, parent_code } = req.query;
|
||||
const results = [];
|
||||
fs.createReadStream(__dirname + '/../db/data/isic_titles_ru.csv')
|
||||
.pipe(csv())
|
||||
.on('data', (data) => {
|
||||
let pass = true;
|
||||
// Фильтрация по уровню (по длине кода)
|
||||
if (level) {
|
||||
if (level == 1 && data.code.length !== 1) pass = false;
|
||||
if (level == 2 && data.code.length !== 2) pass = false;
|
||||
if (level == 3 && data.code.length !== 3) pass = false;
|
||||
if (level == 4 && data.code.length !== 4) pass = false;
|
||||
}
|
||||
// Фильтрация по parent_code
|
||||
if (parent_code && pass) {
|
||||
if (level == 2 && !data.code.startsWith(parent_code)) pass = false;
|
||||
if (level == 3 && !data.code.startsWith(parent_code)) pass = false;
|
||||
if (level == 4 && !data.code.startsWith(parent_code)) pass = false;
|
||||
}
|
||||
if (pass) {
|
||||
results.push({
|
||||
code: data.code,
|
||||
description: data.title,
|
||||
});
|
||||
}
|
||||
})
|
||||
.on('end', () => {
|
||||
res.json({
|
||||
totalItems: results.length,
|
||||
codes: results,
|
||||
totalPages: 1,
|
||||
currentPage: 1,
|
||||
});
|
||||
})
|
||||
.on('error', (err) => {
|
||||
res.status(500).json({ error: 'Ошибка чтения русских кодов ISIC', details: err.message });
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
const baseQuerySelect = `
|
||||
SELECT c.code, c.description, c.code_level, c.explanatory_note_inclusion, c.explanatory_note_exclusion,
|
||||
|
||||
@@ -305,4 +305,45 @@ router.post('/broadcast', async (req, res) => {
|
||||
}
|
||||
});
|
||||
|
||||
// DELETE /api/messages/history/:userId - удалить историю сообщений пользователя
|
||||
router.delete('/history/:userId', async (req, res) => {
|
||||
const userId = req.params.userId;
|
||||
if (!userId) {
|
||||
return res.status(400).json({ error: 'userId required' });
|
||||
}
|
||||
|
||||
try {
|
||||
// Проверяем права администратора
|
||||
if (!req.user || !req.user.isAdmin) {
|
||||
return res.status(403).json({ error: 'Only administrators can delete message history' });
|
||||
}
|
||||
|
||||
// Удаляем все сообщения пользователя
|
||||
const result = await db.getQuery()(
|
||||
'DELETE FROM messages WHERE user_id = $1 RETURNING id',
|
||||
[userId]
|
||||
);
|
||||
|
||||
// Удаляем беседы пользователя (если есть)
|
||||
const conversationResult = await db.getQuery()(
|
||||
'DELETE FROM conversations WHERE user_id = $1 RETURNING id',
|
||||
[userId]
|
||||
);
|
||||
|
||||
console.log(`[messages.js] Deleted ${result.rowCount} messages and ${conversationResult.rowCount} conversations for user ${userId}`);
|
||||
|
||||
// Отправляем обновление через WebSocket
|
||||
broadcastMessagesUpdate();
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
deletedMessages: result.rowCount,
|
||||
deletedConversations: conversationResult.rowCount
|
||||
});
|
||||
} catch (e) {
|
||||
console.error('[ERROR] /history/:userId:', e);
|
||||
res.status(500).json({ error: 'DB error', details: e.message });
|
||||
}
|
||||
});
|
||||
|
||||
module.exports = router;
|
||||
@@ -1,59 +0,0 @@
|
||||
// Скрипт для деплоя DLE (Digital Legal Entity) контрактов
|
||||
const { ethers, artifacts } = require("hardhat");
|
||||
const fs = require("fs");
|
||||
const path = require("path");
|
||||
|
||||
async function main() {
|
||||
console.log("Начинаем деплой DLE контрактов...");
|
||||
|
||||
// Получаем аккаунт деплоя
|
||||
const [deployer] = await ethers.getSigners();
|
||||
console.log(`Адрес деплоера: ${deployer.address}`);
|
||||
console.log(`Баланс деплоера: ${await ethers.formatEther(await deployer.provider.getBalance(deployer.address))} ETH`);
|
||||
|
||||
// Получаем фабрику контрактов
|
||||
console.log("Деплоим DLEFactory...");
|
||||
const DLEFactory = await ethers.getContractFactory("DLEFactory");
|
||||
const dleFactory = await DLEFactory.deploy(deployer.address);
|
||||
await dleFactory.waitForDeployment();
|
||||
const dleFactoryAddress = await dleFactory.getAddress();
|
||||
console.log(`DLEFactory задеплоен по адресу: ${dleFactoryAddress}`);
|
||||
|
||||
// Сохраняем адреса контрактов
|
||||
saveContractData("DLEFactory", dleFactoryAddress, await getAbi("DLEFactory"));
|
||||
|
||||
console.log("Деплой завершен!");
|
||||
}
|
||||
|
||||
// Сохраняем адреса контрактов и ABI для фронтенда
|
||||
function saveContractData(name, address, abi) {
|
||||
const contractsDir = path.join(__dirname, "../..", "contracts-data");
|
||||
|
||||
if (!fs.existsSync(contractsDir)) {
|
||||
fs.mkdirSync(contractsDir, { recursive: true });
|
||||
}
|
||||
|
||||
fs.writeFileSync(
|
||||
path.join(contractsDir, `${name}-address.json`),
|
||||
JSON.stringify({ address }, null, 2)
|
||||
);
|
||||
|
||||
fs.writeFileSync(
|
||||
path.join(contractsDir, `${name}-abi.json`),
|
||||
JSON.stringify(abi, null, 2)
|
||||
);
|
||||
}
|
||||
|
||||
// Получаем ABI контракта
|
||||
async function getAbi(contractName) {
|
||||
const artifact = await artifacts.readArtifact(contractName);
|
||||
return artifact.abi;
|
||||
}
|
||||
|
||||
// Запускаем скрипт деплоя
|
||||
main()
|
||||
.then(() => process.exit(0))
|
||||
.catch((error) => {
|
||||
console.error(error);
|
||||
process.exit(1);
|
||||
});
|
||||
@@ -2323,6 +2323,11 @@ csurf@^1.11.0:
|
||||
csrf "3.1.0"
|
||||
http-errors "~1.7.3"
|
||||
|
||||
csv-parser@^3.0.0:
|
||||
version "3.2.0"
|
||||
resolved "https://registry.yarnpkg.com/csv-parser/-/csv-parser-3.2.0.tgz#7e5515e3763e963dc8660dc9dcfc3f0eaf72b0a9"
|
||||
integrity sha512-fgKbp+AJbn1h2dcAHKIdKNSSjfp43BZZykXsCjzALjKy80VXQNHPFJ6T9Afwdzoj24aMkq8GwDS7KGcDPpejrA==
|
||||
|
||||
dashdash@^1.12.0:
|
||||
version "1.14.1"
|
||||
resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
|
||||
@@ -5196,11 +5201,6 @@ parent-module@^1.0.0:
|
||||
dependencies:
|
||||
callsites "^3.0.0"
|
||||
|
||||
parse-duration@^1.1.0:
|
||||
version "1.1.2"
|
||||
resolved "https://registry.yarnpkg.com/parse-duration/-/parse-duration-1.1.2.tgz#20008e6c507814761864669bb936e3f4a9a80758"
|
||||
integrity sha512-p8EIONG8L0u7f8GFgfVlL4n8rnChTt8O5FSxgxMz2tjc9FMP199wxVKVB6IbKx11uTbKHACSvaLVIKNnoeNR/A==
|
||||
|
||||
parseley@^0.12.0:
|
||||
version "0.12.1"
|
||||
resolved "https://registry.yarnpkg.com/parseley/-/parseley-0.12.1.tgz#4afd561d50215ebe259e3e7a853e62f600683aef"
|
||||
|
||||
801
docs/DLE_Governance_System.md
Normal file
801
docs/DLE_Governance_System.md
Normal file
@@ -0,0 +1,801 @@
|
||||
# DLE Governance System - Документация
|
||||
|
||||
## 📋 Обзор системы
|
||||
|
||||
DLE (Digital Legal Entity) - это система управления цифровым юридическим лицом с использованием смарт-контрактов и токенов управления. Система включает в себя механизмы голосования, мультиподписи и административного управления.
|
||||
|
||||
## 🏗️ Архитектура системы
|
||||
|
||||
### Текущие смарт-контракты
|
||||
|
||||
#### 1. GovernanceToken.sol
|
||||
```solidity
|
||||
contract GovernanceToken is ERC20Permit, ERC20Votes, Ownable {
|
||||
// Основные функции:
|
||||
- mintInitialSupply(address[] partners, uint256[] amounts) // Начальное распределение токенов
|
||||
- transfer() // Передача токенов
|
||||
- balanceOf() // Проверка баланса
|
||||
- getVotes() // Получение голосов на определенном блоке
|
||||
}
|
||||
```
|
||||
|
||||
#### 2. GovernanceTimelock.sol
|
||||
```solidity
|
||||
contract GovernanceTimelock is TimelockController {
|
||||
// Основные функции:
|
||||
- queue() // Постановка операции в очередь
|
||||
- execute() // Выполнение операции после задержки
|
||||
- cancel() // Отмена операции
|
||||
}
|
||||
```
|
||||
|
||||
#### 3. GovernorContract.sol
|
||||
```solidity
|
||||
contract GovernorContract is Governor, GovernorSettings, GovernorCountingSimple, GovernorVotes, GovernorVotesQuorumFraction, GovernorTimelockControl {
|
||||
// Основные функции:
|
||||
- propose() // Создание предложения
|
||||
- vote() // Голосование
|
||||
- execute() // Выполнение предложения
|
||||
- cancel() // Отмена предложения
|
||||
}
|
||||
```
|
||||
|
||||
### Текущие параметры системы
|
||||
- **Порог предложения**: 100,000 GT
|
||||
- **Кворум**: 4% от общего количества токенов
|
||||
- **Задержка голосования**: 1 день
|
||||
- **Период голосования**: 7 дней
|
||||
- **Минимальная задержка Timelock**: 2 дня
|
||||
|
||||
## 🔧 Функции приложения
|
||||
|
||||
### Критические функции (требуют голосования)
|
||||
|
||||
#### 🚨 УДАЛЕНИЕ ДАННЫХ
|
||||
|
||||
##### Пользователи
|
||||
```javascript
|
||||
// Удаление пользователя
|
||||
DELETE /api/users/:id
|
||||
- Описание: Полное удаление пользователя и всех связанных данных
|
||||
- Критичность: 🔴 ВЫСОКАЯ
|
||||
- Требует голосования: ДА
|
||||
|
||||
// Блокировка пользователя
|
||||
PATCH /api/users/:id/block
|
||||
- Описание: Блокировка пользователя в системе
|
||||
- Критичность: 🔴 ВЫСОКАЯ
|
||||
- Требует голосования: ДА
|
||||
```
|
||||
|
||||
##### Таблицы
|
||||
```javascript
|
||||
// Удаление таблицы
|
||||
DELETE /api/tables/:id
|
||||
- Описание: Удаление таблицы и всех связанных данных
|
||||
- Критичность: 🔴 ВЫСОКАЯ
|
||||
- Требует голосования: ДА
|
||||
|
||||
// Удаление строк таблицы
|
||||
DELETE /api/tables/:id/rows
|
||||
- Описание: Массовое удаление строк
|
||||
- Критичность: 🟡 СРЕДНЯЯ
|
||||
- Требует голосования: ДА
|
||||
|
||||
// Удаление столбцов таблицы
|
||||
DELETE /api/tables/:id/columns
|
||||
- Описание: Удаление столбцов таблицы
|
||||
- Критичность: 🟡 СРЕДНЯЯ
|
||||
- Требует голосования: ДА
|
||||
```
|
||||
|
||||
##### DLE (Digital Legal Entity)
|
||||
```javascript
|
||||
// Удаление DLE
|
||||
DELETE /api/dle/:tokenAddress
|
||||
- Описание: Удаление DLE по адресу токена
|
||||
- Критичность: 🔴 ВЫСОКАЯ
|
||||
- Требует голосования: ДА
|
||||
|
||||
// Удаление пустого DLE
|
||||
DELETE /api/dle/empty/:fileName
|
||||
- Описание: Удаление пустого DLE по имени файла
|
||||
- Критичность: 🔴 ВЫСОКАЯ
|
||||
- Требует голосования: ДА
|
||||
```
|
||||
|
||||
##### Системные настройки
|
||||
```javascript
|
||||
// Удаление RPC провайдера
|
||||
DELETE /api/settings/rpc/:networkId
|
||||
- Описание: Удаление RPC конфигурации
|
||||
- Критичность: 🔴 ВЫСОКАЯ
|
||||
- Требует голосования: ДА
|
||||
|
||||
// Удаление токена аутентификации
|
||||
DELETE /api/settings/auth-token/:address/:network
|
||||
- Описание: Удаление токена для аутентификации
|
||||
- Критичность: 🔴 ВЫСОКАЯ
|
||||
- Требует голосования: ДА
|
||||
|
||||
// Удаление AI настроек
|
||||
DELETE /api/settings/ai-settings/:provider
|
||||
- Описание: Удаление настроек AI провайдера
|
||||
- Критичность: 🟡 СРЕДНЯЯ
|
||||
- Требует голосования: ДА
|
||||
|
||||
// Удаление правил AI ассистента
|
||||
DELETE /api/settings/ai-assistant-rules/:id
|
||||
- Описание: Удаление набора правил AI
|
||||
- Критичность: 🟡 СРЕДНЯЯ
|
||||
- Требует голосования: ДА
|
||||
```
|
||||
|
||||
#### 🏗️ СОЗДАНИЕ КРИТИЧНЫХ СУЩНОСТЕЙ
|
||||
|
||||
##### DLE
|
||||
```javascript
|
||||
// Создание нового DLE
|
||||
POST /api/dle
|
||||
- Описание: Создание нового Digital Legal Entity
|
||||
- Критичность: 🔴 ВЫСОКАЯ
|
||||
- Требует голосования: ДА
|
||||
- Параметры: name, symbol, location, isicCodes, partners, amounts, network, etc.
|
||||
```
|
||||
|
||||
##### Таблицы
|
||||
```javascript
|
||||
// Создание таблицы
|
||||
POST /api/tables
|
||||
- Описание: Создание новой таблицы
|
||||
- Критичность: 🟡 СРЕДНЯЯ
|
||||
- Требует голосования: ДА
|
||||
```
|
||||
|
||||
##### Системные настройки
|
||||
```javascript
|
||||
// Добавление RPC провайдера
|
||||
POST /api/settings/rpc
|
||||
- Описание: Добавление нового RPC провайдера
|
||||
- Критичность: 🔴 ВЫСОКАЯ
|
||||
- Требует голосования: ДА
|
||||
|
||||
// Добавление токена аутентификации
|
||||
POST /api/settings/auth-token
|
||||
- Описание: Добавление нового токена для аутентификации
|
||||
- Критичность: 🔴 ВЫСОКАЯ
|
||||
- Требует голосования: ДА
|
||||
```
|
||||
|
||||
#### ⚙️ ИЗМЕНЕНИЕ СИСТЕМНЫХ НАСТРОЕК
|
||||
|
||||
##### База данных
|
||||
```javascript
|
||||
// Изменение настроек БД
|
||||
PUT /api/settings/db-settings
|
||||
- Описание: Изменение параметров подключения к базе данных
|
||||
- Критичность: 🔴 ВЫСОКАЯ
|
||||
- Требует голосования: ДА
|
||||
- Параметры: db_host, db_port, db_name, db_user, db_password
|
||||
```
|
||||
|
||||
##### AI настройки
|
||||
```javascript
|
||||
// Изменение настроек AI ассистента
|
||||
PUT /api/settings/ai-assistant
|
||||
- Описание: Изменение глобальных настроек AI ассистента
|
||||
- Критичность: 🟡 СРЕДНЯЯ
|
||||
- Требует голосования: ДА
|
||||
|
||||
// Изменение AI провайдера
|
||||
PUT /api/settings/ai-settings/:provider
|
||||
- Описание: Изменение настроек конкретного AI провайдера
|
||||
- Критичность: 🟡 СРЕДНЯЯ
|
||||
- Требует голосования: ДА
|
||||
```
|
||||
|
||||
##### Коммуникации
|
||||
```javascript
|
||||
// Настройки Email
|
||||
PUT /api/identities/email-settings
|
||||
- Описание: Изменение настроек SMTP/IMAP
|
||||
- Критичность: 🟡 СРЕДНЯЯ
|
||||
- Требует голосования: ДА
|
||||
|
||||
// Настройки Telegram
|
||||
PUT /api/identities/telegram-settings
|
||||
- Описание: Изменение настроек Telegram бота
|
||||
- Критичность: 🟡 СРЕДНЯЯ
|
||||
- Требует голосования: ДА
|
||||
```
|
||||
|
||||
### Умеренные функции (опциональное голосование)
|
||||
|
||||
#### 📝 РЕДАКТИРОВАНИЕ ДАННЫХ
|
||||
|
||||
```javascript
|
||||
// Редактирование пользователя
|
||||
PATCH /api/users/:id
|
||||
- Описание: Изменение данных пользователя
|
||||
- Критичность: 🟡 СРЕДНЯЯ
|
||||
- Требует голосования: ОПЦИОНАЛЬНО
|
||||
|
||||
// Редактирование таблицы
|
||||
PATCH /api/tables/:id
|
||||
- Описание: Изменение структуры таблицы
|
||||
- Критичность: 🟡 СРЕДНЯЯ
|
||||
- Требует голосования: ОПЦИОНАЛЬНО
|
||||
|
||||
// Импорт пользователей
|
||||
POST /api/users/import
|
||||
- Описание: Массовый импорт пользователей
|
||||
- Критичность: 🟡 СРЕДНЯЯ
|
||||
- Требует голосования: ОПЦИОНАЛЬНО
|
||||
```
|
||||
|
||||
### Обычные функции (не требуют голосования)
|
||||
|
||||
#### 📖 ПРОСМОТР ДАННЫХ
|
||||
|
||||
```javascript
|
||||
// Список пользователей
|
||||
GET /api/users
|
||||
- Описание: Получение списка пользователей
|
||||
- Критичность: 🟢 НИЗКАЯ
|
||||
- Требует голосования: НЕТ
|
||||
|
||||
// Список таблиц
|
||||
GET /api/tables
|
||||
- Описание: Получение списка таблиц
|
||||
- Критичность: 🟢 НИЗКАЯ
|
||||
- Требует голосования: НЕТ
|
||||
|
||||
// Список DLE
|
||||
GET /api/dle
|
||||
- Описание: Получение списка DLE
|
||||
- Критичность: 🟢 НИЗКАЯ
|
||||
- Требует голосования: НЕТ
|
||||
|
||||
// Детали пользователя
|
||||
GET /api/users/:id
|
||||
- Описание: Получение детальной информации о пользователе
|
||||
- Критичность: 🟢 НИЗКАЯ
|
||||
- Требует голосования: НЕТ
|
||||
```
|
||||
|
||||
#### ✏️ РЕДАКТИРОВАНИЕ ЯЧЕЕК
|
||||
|
||||
```javascript
|
||||
// Изменение значения ячейки
|
||||
PATCH /api/tables/cell
|
||||
- Описание: Изменение значения конкретной ячейки таблицы
|
||||
- Критичность: 🟢 НИЗКАЯ
|
||||
- Требует голосования: НЕТ
|
||||
```
|
||||
|
||||
## 🎯 Система голосования
|
||||
|
||||
### Текущая реализация
|
||||
|
||||
#### Процесс голосования
|
||||
1. **Создание предложения** - пользователь с достаточным количеством токенов создает предложение
|
||||
2. **Период голосования** - 7 дней для голосования
|
||||
3. **Подсчет голосов** - проверка кворума (4% от общего количества токенов)
|
||||
4. **Постановка в очередь** - успешные предложения ставятся в очередь Timelock
|
||||
5. **Выполнение** - после задержки (2 дня) предложение выполняется
|
||||
|
||||
#### Параметры голосования
|
||||
- **Порог для создания предложений**: 100,000 GT
|
||||
- **Кворум**: 4% от общего количества токенов
|
||||
- **Задержка голосования**: 1 день (в блоках)
|
||||
- **Период голосования**: 7 дней (в блоках)
|
||||
- **Минимальная задержка Timelock**: 2 дня
|
||||
|
||||
### Предлагаемые улучшения
|
||||
|
||||
#### Новый модуль: AdminGovernanceModule
|
||||
|
||||
```solidity
|
||||
contract AdminGovernanceModule {
|
||||
struct AdminAction {
|
||||
string actionType; // Тип действия
|
||||
string targetId; // ID цели
|
||||
bytes actionData; // Данные действия
|
||||
uint256 proposalId; // ID предложения
|
||||
bool executed; // Выполнено ли
|
||||
uint256 createdAt; // Время создания
|
||||
}
|
||||
|
||||
mapping(uint256 => AdminAction) public adminActions;
|
||||
mapping(string => bool) public actionTypesRequiringVote;
|
||||
|
||||
// Функции
|
||||
function proposeAdminAction(string memory actionType, string memory targetId, bytes memory actionData) external returns (uint256);
|
||||
function executeAdminAction(uint256 actionId) external;
|
||||
function canExecuteAction(address executor, string memory actionType) external view returns (bool);
|
||||
}
|
||||
```
|
||||
|
||||
#### Типы административных действий
|
||||
|
||||
```solidity
|
||||
// Критические действия (обязательное голосование)
|
||||
"DELETE_USER" // Удаление пользователя
|
||||
"DELETE_DLE" // Удаление DLE
|
||||
"DELETE_TABLE" // Удаление таблицы
|
||||
"CREATE_DLE" // Создание DLE
|
||||
"UPDATE_DB_SETTINGS" // Изменение настроек БД
|
||||
"UPDATE_RPC" // Изменение RPC настроек
|
||||
"UPDATE_AUTH_TOKENS" // Изменение токенов аутентификации
|
||||
|
||||
// Важные действия (опциональное голосование)
|
||||
"CREATE_TABLE" // Создание таблицы
|
||||
"UPDATE_AI_SETTINGS" // Изменение AI настроек
|
||||
"UPDATE_EMAIL_SETTINGS" // Изменение email настроек
|
||||
"UPDATE_TELEGRAM_SETTINGS" // Изменение telegram настроек
|
||||
"IMPORT_USERS" // Импорт пользователей
|
||||
```
|
||||
|
||||
## 🔐 Система доступа
|
||||
|
||||
### Текущая система ролей
|
||||
|
||||
#### Роли пользователей
|
||||
- **Администратор** - полный доступ ко всем функциям
|
||||
- **Пользователь** - ограниченный доступ
|
||||
|
||||
#### Проверка прав
|
||||
```javascript
|
||||
// Middleware для проверки администратора
|
||||
requireAdmin(req, res, next) {
|
||||
// Проверка через сессию
|
||||
if (req.session.isAdmin) return next();
|
||||
|
||||
// Проверка через кошелек
|
||||
if (req.session.address) {
|
||||
const isAdmin = await authService.checkAdminTokens(req.session.address);
|
||||
if (isAdmin) return next();
|
||||
}
|
||||
|
||||
// Проверка через ID пользователя
|
||||
if (req.session.userId) {
|
||||
const user = await db.getQuery()('SELECT role FROM users WHERE id = $1', [req.session.userId]);
|
||||
if (user.rows[0].role === 'admin') return next();
|
||||
}
|
||||
|
||||
return res.status(403).json({ error: 'Доступ запрещен' });
|
||||
}
|
||||
```
|
||||
|
||||
### Предлагаемая система доступа с токенами
|
||||
|
||||
#### Проверка через смарт-контракт
|
||||
```solidity
|
||||
function canExecuteAction(address executor, string memory actionType) public view returns (bool) {
|
||||
// Проверка баланса токенов
|
||||
uint256 balance = governanceToken.balanceOf(executor);
|
||||
|
||||
// Проверка типа действия
|
||||
if (actionTypesRequiringVote[actionType]) {
|
||||
return balance >= proposalThreshold;
|
||||
}
|
||||
|
||||
// Для некритических действий достаточно быть администратором
|
||||
return adminService.isAdmin(executor);
|
||||
}
|
||||
```
|
||||
|
||||
## 📊 Модули DLE
|
||||
|
||||
### Текущие модули
|
||||
|
||||
#### Доступные модули
|
||||
1. **Контракт на активы** - токенизация физических активов
|
||||
2. **Мультиподпись** - повышенная безопасность
|
||||
3. **Дивиденды** - распределение дивидендов между держателями
|
||||
4. **Стейкинг** - стейкинг токенов для получения наград
|
||||
5. **Прием платежей** - прием оплаты в выбранных токенах
|
||||
|
||||
#### Предлагаемый модуль: Административное голосование
|
||||
```javascript
|
||||
{
|
||||
name: 'Административное голосование',
|
||||
description: 'Добавляет систему голосования для административных действий',
|
||||
installed: false,
|
||||
features: [
|
||||
'Голосование за удаление пользователей',
|
||||
'Голосование за создание таблиц',
|
||||
'Голосование за изменение системных настроек',
|
||||
'Интеграция с существующими контрактами DLE'
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
## 🚀 План реализации
|
||||
|
||||
### Этап 1: Анализ и проектирование
|
||||
- [x] Анализ текущих функций приложения
|
||||
- [x] Определение критических операций
|
||||
- [x] Проектирование архитектуры системы голосования
|
||||
|
||||
### Этап 2: Разработка смарт-контрактов
|
||||
- [ ] Создание AdminGovernanceModule
|
||||
- [ ] Расширение GovernorContract
|
||||
- [ ] Создание интерфейсов для взаимодействия
|
||||
|
||||
### Этап 3: Интеграция с приложением
|
||||
- [ ] Создание сервиса для работы с голосованием
|
||||
- [ ] Интеграция с существующими API
|
||||
- [ ] Обновление middleware для проверки прав
|
||||
|
||||
### Этап 4: Обновление UI
|
||||
- [ ] Создание интерфейса для управления предложениями
|
||||
- [ ] Интеграция с модульной системой DLE
|
||||
- [ ] Добавление уведомлений о голосованиях
|
||||
|
||||
### Этап 5: Тестирование и развертывание
|
||||
- [ ] Тестирование смарт-контрактов
|
||||
- [ ] Интеграционное тестирование
|
||||
- [ ] Развертывание в production
|
||||
|
||||
## 📝 Заключение
|
||||
|
||||
Текущая система DLE предоставляет базовую функциональность управления через токены, но требует расширения для полной интеграции с административными функциями приложения. Предлагаемая система голосования позволит обеспечить безопасность и прозрачность при выполнении критических операций.
|
||||
|
||||
### Ключевые преимущества предлагаемого решения:
|
||||
1. **Безопасность** - все критические операции требуют голосования
|
||||
2. **Прозрачность** - все действия записываются в блокчейн
|
||||
3. **Гибкость** - возможность настройки уровней критичности
|
||||
4. **Интеграция** - использование существующей инфраструктуры DLE
|
||||
5. **Модульность** - возможность включения/выключения функций
|
||||
|
||||
---
|
||||
|
||||
# 🏗️ Архитектура DLE как цифрового акционерного общества
|
||||
|
||||
## 🎯 Концепция DLE
|
||||
|
||||
DLE (Digital Legal Entity) - это **цифровое акционерное общество**, где смарт-контракт сам по себе является **цифровым ИНН организации** со всеми функциями традиционного АО.
|
||||
|
||||
### **Основная аналогия:**
|
||||
```
|
||||
Акционерное общество:
|
||||
├── ИНН (идентификатор)
|
||||
├── Банковский счет (финансы)
|
||||
├── Юридический адрес
|
||||
├── Контакты (телефон, email)
|
||||
├── Коды деятельности (ОКВЭД)
|
||||
├── Акционеры (владельцы)
|
||||
├── Управление (голосование)
|
||||
└── Участие в других организациях
|
||||
|
||||
DLE (цифровой аналог):
|
||||
├── Адрес контракта (идентификатор)
|
||||
├── Токены управления (акции)
|
||||
├── Цифровой адрес (блокчейн)
|
||||
├── Контакты (веб-интерфейс)
|
||||
├── Коды деятельности (ISIC)
|
||||
├── Держатели токенов (акционеры)
|
||||
├── Система голосования
|
||||
└── Участие в других DLE
|
||||
```
|
||||
|
||||
## 📋 Формы для ручного деплоя смарт-контрактов
|
||||
|
||||
### **Основная форма деплоя DLE:**
|
||||
|
||||
#### **Блок 1: Идентификация (ИНН)**
|
||||
```
|
||||
- Название организации (name)
|
||||
- Символ токена (symbol)
|
||||
- Описание деятельности (businessDescription)
|
||||
- Юридический адрес (legalAddress)
|
||||
- Контактная информация (contactInfo)
|
||||
```
|
||||
|
||||
#### **Блок 2: Коды деятельности (ISIC)**
|
||||
```
|
||||
- Выбор секций ISIC (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U)
|
||||
- Выбор разделов (2-значные коды)
|
||||
- Выбор групп (3-значные коды)
|
||||
- Выбор классов (4-значные коды)
|
||||
- Дополнительные коды деятельности
|
||||
```
|
||||
|
||||
#### **Блок 3: Финансы (банковский счет)**
|
||||
```
|
||||
- Начальное распределение токенов (partners[], amounts[])
|
||||
- Общее количество токенов (totalSupply)
|
||||
- Минимальный баланс для голосования (proposalThreshold)
|
||||
- Кворум для принятия решений (quorumPercentage)
|
||||
```
|
||||
|
||||
#### **Блок 4: Управление (акционерное собрание)**
|
||||
```
|
||||
- Задержка голосования (votingDelay)
|
||||
- Период голосования (votingPeriod)
|
||||
- Минимальная задержка выполнения (timelockMinDelay)
|
||||
- Тип управления (демократическое/олигархическое)
|
||||
```
|
||||
|
||||
#### **Блок 5: Мультиподпись**
|
||||
```
|
||||
- Количество требуемых подписей (requiredSignatures)
|
||||
- Список авторизованных подписантов (authorizedSigners[])
|
||||
- Временные ограничения на подписание
|
||||
- Типы операций, требующие мультиподпись
|
||||
```
|
||||
|
||||
#### **Блок 6: Коммуникация**
|
||||
```
|
||||
- Веб-сайт организации (website)
|
||||
- Email для связи (contactEmail)
|
||||
- Телефон для связи (contactPhone)
|
||||
- Адрес для сообщений (communicationAddress)
|
||||
```
|
||||
|
||||
## 🏗️ Типы и функции смарт-контрактов
|
||||
|
||||
### **Основной контракт: DigitalLegalEntity.sol**
|
||||
|
||||
#### **A. Функции идентификации:**
|
||||
```solidity
|
||||
- getName() - получение названия
|
||||
- getSymbol() - получение символа
|
||||
- getContractAddress() - получение адреса (ИНН)
|
||||
- getBusinessDescription() - получение описания
|
||||
- getLegalAddress() - получение юр. адреса
|
||||
- getContactInfo() - получение контактов
|
||||
```
|
||||
|
||||
#### **B. Функции кодов деятельности:**
|
||||
```solidity
|
||||
- getIsicCodes() - получение кодов ISIC
|
||||
- addIsicCode(string code) - добавление кода
|
||||
- removeIsicCode(string code) - удаление кода
|
||||
- updateBusinessDescription(string description) - обновление описания
|
||||
```
|
||||
|
||||
#### **C. Финансовые функции:**
|
||||
```solidity
|
||||
- receive() - прием ETH
|
||||
- receiveERC20(address token, uint256 amount) - прием токенов
|
||||
- getBalance() - получение баланса
|
||||
- distributePayment(address[] recipients, uint256[] amounts) - распределение
|
||||
- mintTokens(address to, uint256 amount) - эмиссия токенов
|
||||
- transferTokens(address to, uint256 amount) - передача токенов
|
||||
- getTotalSupply() - общее количество токенов
|
||||
```
|
||||
|
||||
#### **D. Функции управления:**
|
||||
```solidity
|
||||
- createProposal(string title, string description, ProposalType type) - создание предложения
|
||||
- vote(uint256 proposalId, bool support) - голосование
|
||||
- executeProposal(uint256 proposalId) - выполнение предложения
|
||||
- cancelProposal(uint256 proposalId) - отмена предложения
|
||||
- getProposalStatus(uint256 proposalId) - статус предложения
|
||||
- getVotingPower(address account) - голосующая сила
|
||||
```
|
||||
|
||||
#### **E. Функции участия в других DLE:**
|
||||
```solidity
|
||||
- participateInDLE(address dleAddress, uint256 tokens) - участие в другом DLE
|
||||
- voteInOtherDLE(address dleAddress, uint256 proposalId, bool support) - голосование в другом DLE
|
||||
- getParticipation(address dleAddress) - получение информации об участии
|
||||
- withdrawFromDLE(address dleAddress, uint256 tokens) - выход из DLE
|
||||
```
|
||||
|
||||
#### **F. Функции мультиподписи:**
|
||||
```solidity
|
||||
- requireMultiSignature(bytes32 operationId, uint256 requiredSignatures) - требование мультиподписи
|
||||
- signOperation(bytes32 operationId) - подписание операции
|
||||
- getSignatureCount(bytes32 operationId) - количество подписей
|
||||
- addAuthorizedSigner(address signer) - добавление подписанта
|
||||
- removeAuthorizedSigner(address signer) - удаление подписанта
|
||||
```
|
||||
|
||||
#### **G. Коммуникационные функции:**
|
||||
```solidity
|
||||
- sendMessage(string message, string senderInfo) - отправка сообщения
|
||||
- respondToMessage(uint256 messageId, string response) - ответ на сообщение
|
||||
- initiateCall(string callerInfo, string purpose) - запрос звонка
|
||||
- acceptCall(uint256 callId, string response) - принятие звонка
|
||||
- rejectCall(uint256 callId, string reason) - отклонение звонка
|
||||
```
|
||||
|
||||
## 🧩 Модули для настройки смарт-контракта
|
||||
|
||||
### **Базовые модули:**
|
||||
|
||||
#### **Модуль 1: Управление токенами**
|
||||
```
|
||||
Функции:
|
||||
- Эмиссия новых токенов
|
||||
- Сжигание токенов
|
||||
- Замораживание/размораживание токенов
|
||||
- Делегирование голосов
|
||||
- Настройка прав доступа
|
||||
|
||||
Настройки:
|
||||
- Максимальное количество токенов
|
||||
- Минимальный баланс для голосования
|
||||
- Период блокировки токенов
|
||||
- Комиссии за операции
|
||||
```
|
||||
|
||||
#### **Модуль 2: Система голосования**
|
||||
```
|
||||
Функции:
|
||||
- Создание различных типов предложений
|
||||
- Настройка параметров голосования
|
||||
- Автоматическое выполнение решений
|
||||
- Отмена предложений
|
||||
- Делегирование голосов
|
||||
|
||||
Настройки:
|
||||
- Кворум для разных типов решений
|
||||
- Период голосования
|
||||
- Задержка выполнения
|
||||
- Порог для создания предложений
|
||||
```
|
||||
|
||||
#### **Модуль 3: Мультиподпись**
|
||||
```
|
||||
Функции:
|
||||
- Настройка количества подписей
|
||||
- Управление подписантами
|
||||
- Временные ограничения
|
||||
- Отмена подписей
|
||||
- Автоматическое выполнение
|
||||
|
||||
Настройки:
|
||||
- Количество требуемых подписей
|
||||
- Список авторизованных подписантов
|
||||
- Время действия подписей
|
||||
- Типы операций, требующие мультиподписи
|
||||
```
|
||||
|
||||
#### **Модуль 4: Финансовое управление**
|
||||
```
|
||||
Функции:
|
||||
- Управление балансами
|
||||
- Распределение дивидендов
|
||||
- Инвестирование средств
|
||||
- Конвертация валют
|
||||
- Управление портфелем
|
||||
|
||||
Настройки:
|
||||
- Автоматическое распределение дивидендов
|
||||
- Инвестиционные лимиты
|
||||
- Валютные пары для конвертации
|
||||
- Комиссии за операции
|
||||
```
|
||||
|
||||
#### **Модуль 5: Участие в других DLE**
|
||||
```
|
||||
Функции:
|
||||
- Покупка токенов других DLE
|
||||
- Голосование в других DLE
|
||||
- Управление портфелем участий
|
||||
- Автоматическое голосование
|
||||
- Отчетность по участиям
|
||||
|
||||
Настройки:
|
||||
- Лимиты на участие в других DLE
|
||||
- Стратегии голосования
|
||||
- Автоматические действия
|
||||
- Уведомления о важных событиях
|
||||
```
|
||||
|
||||
#### **Модуль 6: Коммуникация**
|
||||
```
|
||||
Функции:
|
||||
- Управление сообщениями
|
||||
- Настройка уведомлений
|
||||
- Автоматические ответы
|
||||
- Интеграция с внешними сервисами
|
||||
- Архив коммуникаций
|
||||
|
||||
Настройки:
|
||||
- Автоматические ответы
|
||||
- Фильтры сообщений
|
||||
- Интеграции (email, telegram, slack)
|
||||
- Шаблоны ответов
|
||||
```
|
||||
|
||||
#### **Модуль 7: Безопасность**
|
||||
```
|
||||
Функции:
|
||||
- Многофакторная аутентификация
|
||||
- Временные блокировки
|
||||
- Аудит операций
|
||||
- Восстановление доступа
|
||||
- Мониторинг безопасности
|
||||
|
||||
Настройки:
|
||||
- Уровни безопасности
|
||||
- Временные ограничения
|
||||
- Список доверенных адресов
|
||||
- Автоматические блокировки
|
||||
```
|
||||
|
||||
#### **Модуль 8: Отчетность**
|
||||
```
|
||||
Функции:
|
||||
- Генерация финансовых отчетов
|
||||
- Отчеты о голосованиях
|
||||
- Отчеты об участиях
|
||||
- Налоговая отчетность
|
||||
- Экспорт данных
|
||||
|
||||
Настройки:
|
||||
- Периодичность отчетов
|
||||
- Форматы экспорта
|
||||
- Автоматическая отправка
|
||||
- Шаблоны отчетов
|
||||
```
|
||||
|
||||
## 🔄 Интеграция модулей
|
||||
|
||||
### **Связи между модулями:**
|
||||
```
|
||||
Управление токенами ↔ Система голосования
|
||||
Финансовое управление ↔ Участие в других DLE
|
||||
Мультиподпись ↔ Все критические операции
|
||||
Безопасность ↔ Все модули
|
||||
Отчетность ↔ Все модули
|
||||
Коммуникация ↔ Все модули
|
||||
```
|
||||
|
||||
### **Настройка модулей:**
|
||||
```
|
||||
1. Активация/деактивация модулей
|
||||
2. Настройка параметров каждого модуля
|
||||
3. Установка связей между модулями
|
||||
4. Тестирование функциональности
|
||||
5. Развертывание в production
|
||||
```
|
||||
|
||||
## 🎯 Ключевые особенности DLE
|
||||
|
||||
### **1. Единый идентификатор:**
|
||||
- Адрес смарт-контракта = ИНН организации
|
||||
- Все функции доступны через один адрес
|
||||
- Полная прозрачность всех операций
|
||||
|
||||
### **2. Автоматизация:**
|
||||
- Автоматическое выполнение решений
|
||||
- Автоматическое распределение дивидендов
|
||||
- Автоматическая отчетность
|
||||
|
||||
### **3. Безопасность:**
|
||||
- Мультиподпись для критических операций
|
||||
- Временные задержки для важных решений
|
||||
- Полный аудит в блокчейне
|
||||
|
||||
### **4. Масштабируемость:**
|
||||
- Участие в неограниченном количестве других DLE
|
||||
- Настраиваемые параметры для разных типов операций
|
||||
- Модульная архитектура для добавления новых функций
|
||||
|
||||
## 🏆 Преимущества DLE над традиционным АО
|
||||
|
||||
### **Эффективность:**
|
||||
- Мгновенные платежи и переводы
|
||||
- Автоматическое выполнение решений
|
||||
- Снижение бюрократических процедур
|
||||
|
||||
### **Прозрачность:**
|
||||
- Все операции видны в блокчейне
|
||||
- Невозможность подделки документов
|
||||
- Полная история всех действий
|
||||
|
||||
### **Глобальность:**
|
||||
- Работа без границ
|
||||
- Участие в международных проектах
|
||||
- Мультивалютные операции
|
||||
|
||||
### **Инновационность:**
|
||||
- Интеграция с DeFi протоколами
|
||||
- Участие в DAO экосистеме
|
||||
- Доступ к новым финансовым инструментам
|
||||
@@ -42,6 +42,12 @@ export default {
|
||||
withCredentials: true
|
||||
});
|
||||
return data;
|
||||
},
|
||||
async deleteMessagesHistory(userId) {
|
||||
const { data } = await axios.delete(`/messages/history/${userId}`, {
|
||||
withCredentials: true
|
||||
});
|
||||
return data;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -84,8 +84,11 @@
|
||||
>Разблокировать</el-button>
|
||||
</template>
|
||||
</div>
|
||||
<div class="delete-actions">
|
||||
<button class="delete-history-btn" @click="deleteMessagesHistory">Удалить историю сообщений</button>
|
||||
<button class="delete-btn" @click="deleteContact">Удалить контакт</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="messages-block">
|
||||
<h3>Чат с пользователем</h3>
|
||||
<ChatInterface
|
||||
@@ -290,6 +293,45 @@ function saveName() {
|
||||
}
|
||||
|
||||
// --- Удаление ---
|
||||
async function deleteMessagesHistory() {
|
||||
if (!contact.value || !contact.value.id) return;
|
||||
|
||||
try {
|
||||
const confirmed = await ElMessageBox.confirm(
|
||||
'Вы действительно хотите удалить всю историю сообщений этого пользователя? Это действие необратимо.',
|
||||
'Подтверждение удаления',
|
||||
{
|
||||
confirmButtonText: 'Удалить',
|
||||
cancelButtonText: 'Отмена',
|
||||
type: 'warning'
|
||||
}
|
||||
);
|
||||
|
||||
if (confirmed) {
|
||||
const result = await messagesService.deleteMessagesHistory(contact.value.id);
|
||||
if (result.success) {
|
||||
ElMessageBox.alert(
|
||||
`История сообщений успешно удалена. Удалено сообщений: ${result.deletedMessages}, бесед: ${result.deletedConversations}`,
|
||||
'Успех',
|
||||
{ type: 'success' }
|
||||
);
|
||||
// Обновляем список сообщений
|
||||
await loadMessages();
|
||||
} else {
|
||||
throw new Error('Не удалось удалить историю сообщений');
|
||||
}
|
||||
}
|
||||
} catch (e) {
|
||||
if (e !== 'cancel') {
|
||||
ElMessageBox.alert(
|
||||
'Ошибка при удалении истории сообщений: ' + (e?.response?.data?.error || e?.message || e),
|
||||
'Ошибка',
|
||||
{ type: 'error' }
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function deleteContact() {
|
||||
router.push({ name: 'contact-delete-confirm', params: { id: contact.value.id } });
|
||||
}
|
||||
@@ -601,6 +643,27 @@ watch(userId, async () => {
|
||||
font-size: 0.95rem;
|
||||
margin-left: 8px;
|
||||
}
|
||||
.delete-actions {
|
||||
display: flex;
|
||||
gap: 12px;
|
||||
margin-top: 18px;
|
||||
}
|
||||
|
||||
.delete-history-btn {
|
||||
background: #ff9800;
|
||||
color: #fff;
|
||||
border: none;
|
||||
border-radius: 6px;
|
||||
padding: 7px 18px;
|
||||
cursor: pointer;
|
||||
font-size: 1rem;
|
||||
transition: background 0.2s;
|
||||
}
|
||||
|
||||
.delete-history-btn:hover {
|
||||
background: #f57c00;
|
||||
}
|
||||
|
||||
.delete-btn {
|
||||
background: #dc3545;
|
||||
color: #fff;
|
||||
@@ -609,9 +672,9 @@ watch(userId, async () => {
|
||||
padding: 7px 18px;
|
||||
cursor: pointer;
|
||||
font-size: 1rem;
|
||||
margin-top: 18px;
|
||||
transition: background 0.2s;
|
||||
}
|
||||
|
||||
.delete-btn:hover {
|
||||
background: #b52a37;
|
||||
}
|
||||
|
||||
@@ -45,7 +45,12 @@
|
||||
:showBaseUrl="providerLabels[showProvider].showBaseUrl"
|
||||
@cancel="showProvider = null"
|
||||
/>
|
||||
<NoAccessModal :show="showNoAccessModal" @close="closeNoAccessModal" />
|
||||
<NoAccessModal
|
||||
:show="showNoAccessModal"
|
||||
title="Доступ ограничен"
|
||||
message="Настройки ИИ доступны только администраторам."
|
||||
@close="closeNoAccessModal"
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
|
||||
@@ -452,7 +452,7 @@ const fetchIsicCodes = async (params = {}, optionsRef, loadingRef) => {
|
||||
loadingRef.value = true;
|
||||
optionsRef.value = []; // Очищаем перед загрузкой
|
||||
try {
|
||||
const queryParams = new URLSearchParams(params).toString();
|
||||
const queryParams = new URLSearchParams({ ...params, lang: 'ru' }).toString();
|
||||
console.debug(`[BlockchainSettingsView] Fetching ISIC codes with params: ${queryParams}`);
|
||||
|
||||
// Убедитесь, что базовый URL настроен правильно (например, через axios interceptors или .env)
|
||||
|
||||
Reference in New Issue
Block a user