IPFS Proxy

 Примеры ИИ запросов

P2P IPFS Python Proxy Client

Prompt для генерирования в ИИ Python кода Proxy-сервера, работающего через P2P сеть (IPFS).

Пробный сгенерированный код нормально отображал статические сайты через 27 пиров (При работе с вторым Python Proxy-сервером, преобразующим IPFS в HTTP).


Промпт


  СТРУКТУРИРОВАННЫЙ ПРОМПТ ДЛЯ ГЕНЕРАЦИИ IPFS PROXY-КЛИЕНТА

  1. ЦЕЛЬ И КОНТЕКСТ

Создать Python 3 скрипт прокси-клиента, который принимает HTTP-запросы от браузера, оборачивает их в кастомный фрейминг-протокол и маршрутизирует через P2P-туннель IPFS. Скрипт должен работать в режиме Browser-to-IPFS, динамически поднимая локальные туннели через CLI ipfs p2p forward и обеспечивая двунаправленную передачу данных с кодированием/декодированием.

  2. ТЕХНОЛОГИЧЕСКИЙ СТЕК И ЗАВИСИМОСТИ

Язык: Python 3.x

Стандартные библиотеки: socket, threading, binascii, subprocess, time, re

Внешняя зависимость: Установленный и запущенный демон ipfs (Kubo/Go-IPFS или аналог), доступный в $PATH

Сетевой протокол: TCP (AF_INET, SOCK_STREAM)

Модель выполнения: Многопоточная (threading), каждый клиентский запрос обрабатывается в отдельном потоке-демонe

  3. КОНФИГУРАЦИОННЫЕ КОНСТАНТЫ

Имя переменной

Тип

Значение

Назначение

LISTEN_IP

str

"10.10.0.1"

Локальный IP для прослушивания входящих соединений от браузера

LISTEN_PORT

int

8443

TCP-порт прокси-сервера

SERVER_PEER_ID

str

"12D3Ko74Hsk1DYv1SQY64nC8zub3x63D7tBjde7ZQaroUgdpQ6cz"

Peer ID удалённого узла IPFS, к которому будет подключаться туннель

PROTOCOL

str

"/x/http-proxy/1.0.0"

Имя пользовательского протокола для IPFS p2p forward

HTTP_PREFIX

bytes

b"GET /wiki/ HTTP/1.1\r\nHost: en.euwiki.io\r\nUser-Agent: Mozilla/5.0...\r\n\r\n"

Фиксированный HTTP-заголовок, используемый как префикс фрейма

SEPARATOR

bytes

b"\n===END===\n"

Разделитель между префиксом и HEX-данными

  4. СПЕЦИФИКАЦИЯ ФУНКЦИЙ

extract_host(data: bytes) -> str

Вход: Сырые байты HTTP-запроса

Логика: Декодирует в ASCII с игнорированием ошибок. Ищет CONNECT <host> или заголовок Host: <host> через re.search. Возвращает найденный хост или "unknown" при ошибке/отсутствии совпадений.

Выход: str

encode_data(data: bytes) -> bytes

Вход: Сырые данные для отправки

Логика: Конвертирует data в HEX через binascii.hexlify(), добавляет \n. Формирует фрейм: HTTP_PREFIX + SEPARATOR + hex_data.

Выход: bytes

decode_data(data: bytes) -> bytes

Вход: Фрейм с префиксом и HEX-строками, разделёнными \n

Логика: Если начинается с HTTP_PREFIX, отсекает его и SEPARATOR. Разбивает остаток по \n, убирает пустые строки, декодирует каждую строку из HEX через binascii.unhexlify(). Конкатенирует результат. Ошибки декодирования игнорируются.

Выход: bytes

forward_to_tunnel(tunnel_sock: socket, client_sock: socket) -> None

Направление: Клиент → Туннель

Логика: В цикле читает до 8192 байт из client_sock, кодирует через encode_data(), отправляет в tunnel_sock. Прерывается при получении пустых данных. Обёрнут в try/except.

forward_to_client(tunnel_sock: socket, client_sock: socket) -> None

Направление: Туннель → Клиент

Логика: Читает чанки из tunnel_sock, накапливает в buffer. При наличии \n делит буфер на строки, передаёт каждую строку (с добавлением \n) в decode_data(). Если декодирование успешно, отправляет результат в client_sock. Работает в цикле.

handle_browser(client_sock: socket, client_addr: tuple) -> None

Роль: Обработчик одного клиентского соединения

Логика:

Читает начальный запрос, извлекает хост.

Находит свободный локальный порт через временный сокет (bind(127.0.0.1, 0)).

Запускает subprocess.Popen(['ipfs', 'p2p', 'forward', PROTOCOL, f'/ip4/127.0.0.1/tcp/{local_port}', f'/p2p/{SERVER_PEER_ID}'], stdout=DEVNULL, stderr=DEVNULL).

Ждёт 2 сек (time.sleep(2)).

Подключается к 127.0.0.1:local_port, устанавливает TCP_NODELAY.

Отправляет закодированный начальный запрос.

Запускает два потока (forward_to_tunnel, forward_to_client) с daemon=True.

Блокируется на join().

В finally: закрывает сокет туннеля, завершает subprocess, закрывает клиентский сокет.

main() -> None

Логика: Создаёт серверный сокет, устанавливает SO_REUSEADDR, биндит к LISTEN_IP:LISTEN_PORT, слушает очередь до 100 соединений. В бесконечном цикле принимает подключения, ставит TCP_NODELAY, запускает handle_browser в потоке-демоне. Обрабатывает KeyboardInterrupt для graceful shutdown.

  5. СЕТЕВЫЕ ПАРАМЕТРЫ И IP-АДРЕСАЦИЯ

Внешний интерфейс: 10.10.0.1:8443 (прослушивание)

Локальный туннель: 127.0.0.1:<динамический_порт>

Удалённый узел IPFS: /p2p/{SERVER_PEER_ID} (определяется демоном IPFS)

Опции сокетов: SO_REUSEADDR (сервер), TCP_NODELAY (клиент и туннель)

Протокол IPFS: Используется команда ipfs p2p forward <protocol> <local_multiaddr> <remote_multiaddr>

  6. ИНСТРУКЦИЯ ДЛЯ ИИ-ГЕНЕРАЦИИ

Реализуй скрипт строго по указанной сигнатуре функций и конфигурации.

Сохрани точный порядок байт для HTTP_PREFIX и SEPARATOR.

Обеспечь корректную обработку частичных чтений и фрагментации TCP-потоков через буферизацию в forward_to_client.

Используй daemon=True для потоков пересылки, чтобы они не блокировали выход при закрытии соединения.

Добавь корректное управление жизненным циклом subprocess и сокетов в блоках try/finally.

Код должен быть совместим с Python 3.8+, не использовать сторонние пакеты.

Выведи полный рабочий скрипт без заглушек.


ЛИСТИНГ >>


AI Prompts Examples

AI generated scenario






Comments

Popular posts from this blog

Perplexity Answer

Учим с ИИ

Генерирование МОДЕЛЕЙ