Объясняя архитектуру Нила

Я построил этот прототип, чтобы лучше объяснить свое представление об архитектуре Нила. Чтобы приступить к работе, git clone репозиторий и git checkout prototype:

Местный экземпляр Nile

Экземпляр Nile является директором всех локальных узлов. Когда новый узел регистрируется в сети, узел отправляет свой хэш IPFS (содержащий информацию об узле) в локальный экземпляр Nile, этот экземпляр проверяет, а затем в конечном итоге принимает узел внутри локальной сети, вставляя новое значение в таблицу (node_id , ipfs_name); затем экземпляр Nile опубликует таблицу в IPFS (она будет использоваться клиентом для получения списка узлов).

Для начала следуйте инструкциям на README.md.

Когда вы запускаете экземпляр с помощью npm start, журнал сообщит вам следующее:

  • кто-то подключается / выходит из сети: когда кто-то подключается к локальному серверу WebSocket или отключается от него.
  • список новых узлов, опубликованный на ipfs: когда узел регистрируется в локальном экземпляре, публикуется новый список узлов. Это хеш ipfs, который вам понадобится, чтобы скопировать и вставить полученный хеш ipfs в клиент *

Узел Нила

Узел является основным компонентом Нила, он состоит из:

  • Основная информация (имя, местонахождение…)
  • Действия: все службы, которые размещает узел. Эти действия вызываются непосредственно клиентом через соединение WebSockets. Подробнее об этом я расскажу в разделе Действия.
  • Компоненты: представления, которые клиенты загружают и используют для вызова действий. Подробнее об этом я расскажу в разделе Компоненты.

Для начала следуйте инструкциям на README.md.

Вы можете запустить узел двумя способами: просто закомментируйте / раскомментируйте две строки кода в test.js в строках 90 и 91:

  • registerNode: эта функция сначала заполнит узел свойствами (базовой информацией, компонентами, действиями), необходимыми для регистрации в локальном экземпляре, а затем фактически отправит запрос регистрации в локальный пример. Локальный экземпляр вернет токен, который будет зарегистрирован в процессе узла.
  • loginNode: вы можете использовать зарегистрированный токен для входа в систему. Если вы перейдете к функции входа в систему в строке 64, вы можете заменить токен на тот, который вы только что получили.

Клиент Нила

Клиент используется для просмотра узлов в локальном экземпляре и вызова их действий.

Для начала следуйте инструкциям на README.md.

Помните, я говорил вам скопировать хэш ipfs * локального экземпляра? Теперь нам нужно вставить его в строку 75 файла dist / index.html. Теперь клиент загрузит список узлов из ipfs.

После загрузки списка вы увидите что-то вроде этого:

Обратите внимание на кнопку ЗАГРУЗИТЬ УЗЕЛ, она видна только тогда, когда узел есть, вы можете попытаться остановить и запустить процесс узла, вы увидите, что в реальном времени эта кнопка отображается и скрывается.

Если вы нажмете кнопку ЗАГРУЗИТЬ УЗЕЛ, клиент получит информацию об узле в ipfs, в частности, вы увидите его проанализированные компоненты.

Если вы напишете что-то в компоненте ввода и нажмете компонент кнопки вызова функции1, клиент отправит запрос на узел, передав значение компонента ввода в качестве параметра (мы увидим, как укажите параметры в следующем разделе), и ответ будет отображаться в компоненте вывода.

Обратите внимание на свойство Data, отображаемое в нижней части узла, когда узел отвечает, что значения изменяются. Каждый узел (я говорю об объекте узла в клиенте) имеет свойство данных, оно используется для обмена информацией между клиентом и экземпляром узла:

  • В случае ввода, когда вы вводите что-то, объект данных будет заполнен содержимым ввода, попробуйте взглянуть на inp1.
  • В случае вывода, когда узел отвечает на ваш запрос, он может заполнить свойство данных значениями (я покажу вам, как это сделать в следующем разделе), попробуйте взглянуть на out1.

Компоненты

Узел может указывать компоненты, которые будет загружать клиент, каждый компонент может использовать объект данных (объекта узла в клиенте) для извлечения или размещения информации. Давайте посмотрим на объявление узла своих компонентов, nile-node / test.js в строке 16:

  • Второй компонент, type: text, имеет свойство под названием key со значением inp1:, которое определяет, что значение текстового компонента должно идти в node.data ['inp1']
  • Третий компонент, type: output, имеет свойство под названием key со значением out1:, которое определяет, что значение внутри узла .data ['out1'] должен отображаться в компоненте вывода.
  • Первый компонент, type: button, имеет свойство parameters со значением ['inp1']: оно определяет, что когда клиент отправляет запрос к узлу он должен передать node.data [inp1]. Также кнопка указывает, какое действие будет запрашиваться клиентом при нажатии кнопки со свойством action, в данном случае function1

Действия

У узла есть действия, когда вы нажимаете кнопку в клиенте, на узел отправляется запрос. Узел обрабатывает этот запрос с помощью функций внутри свойства node.action, посмотрите на nile-node / test.js в строке 69:

Функция представляет собой строку, но только потому, что это прототип и было проще написать ее таким образом, но это не то, что я хотел сказать ...

Внутри функции вы можете использовать два элемента:

  • parameters, это объект, содержащий параметры запроса
  • reply - это функция, которую вы можете использовать для ответа клиенту, если вы передадите объект, содержащий свойства _key и _data, node.data [_ key] будет заполнен содержимым _data. Вот как вы можете заполнить свойство данных объекта узла (в клиенте).

Спасибо за ваше время

Даже если я написал много вещей, я, вероятно, забыл объяснить важные вещи, прокомментируйте здесь и задавайте вопросы (я обновлю эту статью)

Я также мог бы записать видеоурок о том, как настроить каждый компонент, чтобы он работал, но только если вы попросите об этом.

Большое спасибо за время, потраченное на чтение этой статьи, не стесняйтесь оставлять комментарии здесь или в Slack!