Каждый узел в сети Lightning использует обнаружение каналов для создания и поддержки локального представления топологии сети, чтобы он мог обнаруживать маршруты к желаемым пунктам назначения. Маршрутизация от источника используется для того, чтобы дать узлам полный контроль над маршрутом, по которому они совершают платежи в сети. Маршруты выбираются на основе общей совокупной платы и других критериев. Алгоритмы выбора маршрута - область активных исследований.

Базы данных графов оптимизированы для представления набора узлов, связанных друг с другом отношениями, и для запросов, которые пересекают граф, то есть начинаются с (набора) определенных узлов и ищут шаблоны по графу, и, в частности, для поиска путей между два узла, т.е. для расчета маршрута. Neo4j - одна из самых известных баз данных Graph с открытым исходным кодом. См. Что такое база данных Graph? и От Relational to Neo4j для более подробной информации.

Здесь мы описываем, как экспортировать локальное представление сетевой топологии узла в базу данных Neo4j. Используется реализация Lightning Network Daemon (LND). В настоящее время ветка доступна здесь и включает в себя три компонента:

  1. В инструмент командной строки lncli добавлена ​​новая команда для создания снимка базы данных каналов (локальное представление узла топологии сети).
  2. Новый инструмент командной строки lnneo4j для импорта снимка в базу данных Neo4j.
  3. Учебное руководство по LN, которое можно загрузить в браузер Neo4j, чтобы исследовать моментальный снимок Lightning Network.

Работа над этим продолжается, и мы надеемся, что некоторые из них будут достаточно полезны, чтобы их можно было объединить с основным кодом LND. Комментарии, исправления и предложения приветствуются.

Примеры

Приведенные ниже примеры взяты из руководства LN (пункт 3 выше) для браузера Neo4j.

Базы данных Graph используют язык запросов Cypher (аналогичный SQL в реляционных базах данных). Cypher - это декларативный язык запросов к графам, который позволяет выразительно и эффективно запрашивать и обновлять хранилище графов. В первом примере используется следующий запрос:

MATCH p = (s:LNNode)-[*1..3]-(n:LNNode) WHERE s.alias = “FederalReserve” AND ALL (c IN relationships(p) WHERE c.capacity > 10000000) RETURN DISTINCT n, s LIMIT 20

Запрос ищет все узлы, подключенные к узлу «FederalReserve» с «толстыми» каналами с емкостью более 0,1 BTC на расстоянии до 3 переходов. Он выбирает все пути до трех переходов от узла и фильтрует эти пути без достаточной емкости. Браузер Neo4j отображает результаты графически ниже.

Браузер позволяет вам изменить запрос и повторно отправить его, что идеально подходит для экспериментов. Для этого может пригодиться Neo4j Cypher Refcard.

Во втором примере используется встроенный запрос кратчайшего пути для вычисления всех кратчайших путей между узлом LN.BLUETEGU.CC и узлом Blockstream Store. Используемый запрос:

MATCH (s:LNNode { alias: ‘SLEEPYARK-6–11–21–2612-gf083a699’ }),(t:LNNode { alias: ‘LN.BLUETEGU.CC’ }), p = allShortestPaths((s)-[:CHANNEL*]-(t))
WHERE ALL (c IN relationships(p) WHERE c.disabled = false)
RETURN p

И получившийся график (после некоторой ручной растяжки) выглядит следующим образом:

Обратите внимание, что у браузера есть ограничения; графы с множеством узлов и взаимосвязей представляют медленно, поэтому всегда рекомендуется добавлять предложение LIMIT. Он имеет встроенный лимит на количество извлекаемых узлов, и для представления графиков он «дополняет» запросы для получения информации об отношениях между узлами, даже если вы не включаете их в RETURN оговорка.

Попробуй сам

Установка Neo4j проста, поэтому не должно быть слишком сложно охватить экземпляр, сделать снимок базы данных каналов, импортировать его в Neo4j и запустить руководство через браузер. Но по крайней мере в течение ограниченного периода вы можете опробовать браузер на моем сервере, скопировав URL-адрес, указанный ниже, в свой браузер:

http://ln.bluetegu.cc:7474/browser

И используйте пользователя «гость» и пароль «гость». К сожалению, версия Neo4j с открытым исходным кодом не позволяет контролировать доступ для каждого пользователя, поэтому гостевой пользователь также может изменять или удалять данные, поэтому, пожалуйста, играйте хорошо и понимайте, что сервер может быть неработающим или медленным. Ниже показан экран входа в систему.

Оказавшись внутри, у вас есть несколько руководств, которые вы можете запустить. Если вы нажмете «Перейти в код», вы увидите два руководства. Вы можете запустить руководство Movie Graph, которое познакомит вас с основами Cypher. Нет необходимости выполнять команды «Создать», поскольку база данных, вероятно, уже будет заполнена узлами графа фильма. Точно так же нет необходимости выполнять команду «Отбросить» в конце. Ниже приведен снимок экрана с доступными руководствами.

Вы можете запустить руководство по сети Lightning, введя следующую команду воспроизведения и нажав кнопку запуска (как и любую другую команду в браузере):

:play http://ln.bluetegu.cc:80/html/ln.html

Чтобы начать руководство по Lightning Networks. Первая страница руководства выглядит следующим образом:

Технические подробности

Создание снимков

Команда для создания снимка базы данных каналов:

$ lncli snapshotchannels

Он создает или перезаписывает предыдущий снимок базы данных каналов на [lnddir]/snapshot/graph/[network]/channel.db. Например, ~/.lnd/snapshot/graph/mainnet/channel.db в Linux, когда используется основная сеть Биткойн.

Импорт в Neo4j

Инструмент командной строки Neo4j сначала очищает базу данных Neo4j из предыдущего снимка, а затем импортирует узлы и каналы в базу данных Neo4j. Инструмент имеет следующие параметры конфигурации:

ubuntu@ln:~$ lnneo4j — help
NAME:
 lnneo4j — import a snapshot of your channel databse to neo4j
USAGE:
 lnneo4j [global options] command [command options] [arguments…]
 
VERSION:
 0.1.1 commit=
 
COMMANDS:
 help, h Shows a list of commands or help for one command
GLOBAL OPTIONS:
 — lnddir value path to lnd’s base directory (default: “/home/ubuntu/.lnd”)
 — network value either mainnet, testnet, simnet, regtest, etc. (default: “mainnet”)
 — neouser value neo4j user for authentication (default: “neo4j”)
 — neopass value neo4j password for authentication. Required unless neo4j authentication is disabled, e.g. dbms.security.auth_enabled=false is set in neo4j.conf
 — neohost value neo4j hostname (default: “localhost”)
 — neoport value neo4j port number (default: “7687”)
 — help, -h show help
 — version, -v print the version

При запуске он дает следующий результат. Обратите внимание, что для завершения процесса импорта требуется время:

ubuntu@ln:~$ lnneo4j -neopass <password>
[lnneo4j] 15615 nodes and channels deleted.
[lnneo4j] Added 2313 detailed nodes and 6 nodes known only by public key.
[lnneo4j] Added 6541 bi-directional channels, 314 uni-directional channels and 0 channels without edges dropped.
ubuntu@ln:~$

Узлам присваивается ярлык LNNode. Узел, для которого было получено объявление, также помечается меткой Подробно. Для каждого подробного узла моделируются следующие свойства:

  • pubKey
  • псевдоним
  • адреса
  • цвет
  • последнее обновление

В базу данных включаются только открытые каналы (не ожидающие закрытия или ожидающие закрытия). Каналы моделируются как отношения КАНАЛ со следующими свойствами:

  • channelID
  • емкость
  • последнее обновление
  • отключен
  • minHTLC
  • feeBaseMsat
  • timeLockDelta
  • feeRateMilliMsat

Руководство по Neo4j

Руководство написано в соответствии с Руководством по созданию настраиваемого браузера Neo4j. В частности, руководство написано в формате adoc и скомпилировано в формате html. В проект копируется минимальный набор файлов, необходимый для составления руководства из репозитория neo4j-guides. readme.doc на /lnd/cmd/lnneo4j/guide/readme.adoc включает все подробности о том, как редактировать, компилировать и размещать руководство.

Установка

Чтобы установить эту версию, следуйте инструкциям проекта LND, но используйте ветку neo4j из моего репозитория. Моя подробная инструкция по установке здесь может быть вам полезна.

ubuntu@x:~$ git clone https://github.com/bluetegu/lnd $GOPATH/src/github.com/lightningnetwork/lnd
ubuntu@x:~$ cd $GOPATH/src/github.com/lightningnetwork/lnd
ubuntu@x:~/go/src/github.com/lightningnetwork/lnd$ git checkout neo4j
Branch neo4j set up to track remote branch neo4j from origin.
Switched to a new branch ‘neo4j’
ubuntu@x:~/go/src/github.com/lightningnetwork/lnd$ 
ubuntu@x:~/go/src/github.com/lightningnetwork/lnd$ dep ensure
ubuntu@x:~/go/src/github.com/lightningnetwork/lnd$ go install . ./cmd/...
ubuntu@x:~/go/src/github.com/lightningnetwork/lnd$