OrbitDB и IPFS: создание децентрализованного приложения с базой данных на Node.js

    Разработка децентрализованных приложений (dApp) часто требует использования распределённых технологий хранения данных. IPFS (InterPlanetary File System) и OrbitDB - популярный стек для создания peer-to-peer баз данных. Однако настройка этой связки может вызывать трудности, особенно у новичков. В этой статье мы разберём типичные ошибки, возникающие при попытке подключить IPFS и OrbitDB в Node.js, и предложим пошаговое решение.

    Почему возникает ошибка require('ipfs')?

    Ошибка Cannot find module 'ipfs' при использовании const IPFS = require('ipfs') чаще всего связана с неправильной установкой зависимостей или устаревшей версией модуля. Начиная с версии 0.55.0, IPFS перешёл на ESM-модули, и классический CommonJS-синтаксис require() перестал работать. Вместо этого нужно использовать динамический импорт.

    Как правильно установить и импортировать IPFS и OrbitDB

    Для корректной работы выполните следующие шаги:

    1. Инициализация проекта и установка зависимостей

    • Создайте директорию проекта и выполните npm init -y.
    • Установите IPFS: npm install ipfs@0.63.7 (используйте стабильную версию, совместимую с CommonJS).
    • Установите OrbitDB: npm install orbit-db@0.26.3.
    • Дополнительно установите @chainsafe/libp2p-gossipsub и libp2p для работы сети.

    2. Импорт модулей в коде

    Используйте синтаксис async/await и динамический импорт:

    const IPFS = await import('ipfs');
    const OrbitDB = await import('orbit-db');
    
    const ipfs = await IPFS.create();
    const orbitdb = await OrbitDB.createInstance(ipfs);
    const db = await orbitdb.keyvalue('my-db');
    await db.put('key', 'value');
    console.log(await db.get('key'));
    

    Типичные ошибки и их решения

    Ошибка: require не распознаёт модуль

    Если вы работаете в среде, где CommonJS не поддерживается, переключитесь на ES-модули. Добавьте в package.json строку "type": "module" и используйте import вместо require.

    Ошибка: IPFS.create() не является функцией

    Убедитесь, что вы установили совместимую версию IPFS. Рекомендуется версия 0.63.7, так как более новые версии (0.64+) требуют дополнительных конфигураций libp2p.

    Ошибка: OrbitDB не может подключиться к IPFS

    Проверьте, что IPFS-узел запущен и доступен. Иногда помогает настройка ipfsOptions в конструкторе OrbitDB, например, указание порта или репозитория.

    Как создать простую децентрализованную базу данных

    Для минимального рабочего примера используйте Key-Value Store:

    import { create } from 'ipfs-core';
    import OrbitDB from 'orbit-db';
    
    const ipfs = await create();
    const orbitdb = await OrbitDB.createInstance(ipfs);
    const db = await orbitdb.keyvalue('my-first-db');
    await db.put('message', 'Hello, decentralized world!');
    console.log(await db.get('message'));
    

    Этот код создаёт запись в распределённой базе данных, которая автоматически синхронизируется между узлами.

    Советы по отладке и дальнейшей разработке

    • Всегда проверяйте версии модулей в package.json - используйте фиксированные версии вместо последних.
    • Включайте логирование: process.env.DEBUG = 'orbit*' для отслеживания событий OrbitDB.
    • Для курсовой работы можно использовать IPFS Companion (браузерное расширение) для визуализации данных.

    Следуя этим рекомендациям, вы сможете избежать распространённых ошибок и сосредоточиться на функциональности вашего децентрализованного приложения.

    Часто задаваемые вопросы