Цель этой статьи — объяснить реализацию концепции Р2Р-сетей в рамках Ethereum. Технология P2P имеет потенциал для устранения недостатков централизованных систем за счет использования богатых ресурсов конечных устройств, и с 1990-х годов она была внедрена в популярных программах, таких как eMule, bitTorrent и Skype. Это также ключевой компонент систем блокчейнов, таких как биткойн или Ethereum.
Что такое сеть P2P?
Peer-to-Peer (P2P) — это оверлейная сеть, то есть построенная поверх общедоступного Интернета. С математической точки зрения его можно рассматривать как ориентированный граф G = (V, E), где V — это набор одноранговых узлов в сети, а E — набор связей между одноранговыми узлами. Каждый узел p имеет уникальный идентификационный номер pid. Ссылка (p, q) в E означает, что p имеет прямой путь для отправки сообщения q; то есть, p может отправить сообщение q по сети, используя pid q в качестве пункта назначения. Хотя в базовой сети TCP / IP подобные IP-адреса могут транслироваться в близлежащие физические местоположения, такая прямая корреляция редко встречается.
В идеале все узлы должны быть соединены путем. Поскольку отдельные одноранговые узлы имеют только неполное представление о топологии сети и членстве одноранговых узлов, наложение зависит от промежуточных одноранговых узлов для пересылки сообщений в правильные области наложения. Структура графа обеспечивает несколько путей между каждой парой одноранговых узлов и способствует устойчивости, обеспечивая возможность соединения, несмотря на изменения одноранговых узлов. На уровне каждого узла связь графа отражается с точки зрения его смежности с другими узлами. Когда одноранговые узлы присоединяются или покидают сеть, смежные одноранговые узлы могут иметь неверную информацию о смежности. Механизмы обслуживания оверлеев используются для обновления информации о смежности, что позволяет поддерживать связь между всеми узлами. [1]
Участники сети P2P предоставляют часть своих ресурсов другим участникам сети. Каждый одноранговый узел обеспечивает вычислительные циклы, дисковое хранилище и пропускную способность сети без необходимости в центральном координационном экземпляре. Пиры являются как поставщиками, так и потребителями сетевых ресурсов, в отличие от традиционной модели клиент-сервер, где потребляют только серверы и клиенты. Следовательно, P2P-сети потенциально способны устранить ограничения модели клиент-сервер, такие как масштабируемость и единая точка отказа.
Часто существует минимальный порог вклада ресурса для однорангового узла, чтобы присоединиться к оверлею P2P. Ресурсный вклад должен быть справедливым. Критерий справедливости может диктовать, что, например, средний вклад любого партнера должен быть в пределах статистической границы общего среднего значения системы P2P. Ресурсный вклад также должен быть взаимовыгодным. Пользователи поощряются к участию в приложениях P2P, если выгода сопоставима с предоставляемыми ресурсами. [2]
Как работает P2P-сеть Ethereum?
Официальное программное обеспечение клиентского узла Ethereum, Geth, реализует свой протокол обнаружения одноранговых узлов (протокол обнаружения узлов RLPx), основанный на механизме обслуживания оверлеев, называемом Kademlia DHT. В то время как Kademlia предназначена для эффективного поиска и хранения контента в P2P-сети, P2P-сеть Ethereum используется только для обнаружения новых партнеров.
Kademlia
В сети Ethereum каждый клиентский узел связан с идентификатором enode, который затем хэшируется с SHA3 в 256-битное значение. Kademlia определяет расстояние по метрике XOR, поэтому расстояние между двумя 256-битными числами является их побитовым исключающим ИЛИ. Каждый одноранговый узел имеет структуру данных, состоящую из 256 различных сегментов, где сегмент i хранит информацию о 16 одноранговых узлах на расстоянии от 2 ^ (i-1) до 2 ^ i от своего собственного идентификатора энода. Чтобы обнаружить нового партнера, узел Ethereum выбирает себя в качестве цели x, смотрит в свои сегменты, чтобы найти 16 узлов, ближайших к цели x, и просит каждого из них вернуть 16 узлов из своих сегментов «ближе» к цели x, в результате чего до 16x16 вновь обнаруженных узлов. Из этих 16x16 вновь обнаруженных узлов 16 узлов, ближайших к цели x, затем просят вернуть 16 узлов даже ближе к x. Процесс продолжается итеративно, пока не будут найдены новые узлы.
Peer Communications
Geth использует соединение UDP для обмена информацией о сети P2P. Существует четыре типа сообщений UDP. Сообщение ping требует сообщения pong в ответ. Эта пара сообщений используется для определения, реагирует ли соседний узел. Сообщение findnode запрашивает сообщение соседей, которое содержит список из 16 узлов, которые были обнаружены отвечающим узлом. После установления одноранговых соединений узлы Geth обмениваются информацией блокчейна через зашифрованные и аутентифицированные TCP-соединения.
Структура данных
Клиент Geth хранит информацию о других узлах в двух структурах данных. Первая — это долгосрочная база данных с именем db, которая хранится на диске и сохраняется при перезагрузках клиента. БД содержит информацию о каждом узле, который видел клиент. Каждая запись в БД состоит из идентификатора узла, IP-адреса, порта TCP, порта UDP, времени последнего пинга, отправленного на узел, времени последнего понга, полученного от узла, и количества раз, когда узел не смог ответить на сообщение findnode. Если время последнего понга, полученного от узла, было старше 1 дня, этот узел будет удален из БД.
Вторая структура данных — это краткосрочная база данных, называемая таблицей. Таблица пуста, когда клиент перезагружается. Таблица состоит из 256 сегментов, каждый из которых может содержать до 16 записей. Каждая запись записывает информацию о другом узле Ethereum — его идентификатор, IP-адрес, порт TCP и порт UDP. Если узел не отвечает на findnode более 4 раз подряд, он будет удален из таблицы.
Когда клиент впервые запускается, он имеет пустую базу данных и знает только шесть жестко запрограммированных узлов начальной загрузки. Затем, когда клиент начинает обнаруживать одноранговые узлы, он добавляет их в базу данных и таблицу в соответствии с механизмами, описанными выше.
Заключение
В рамках данной статьи были получены следующие результаты:
– Была рассмотрена общая структура Р2Р сетей;
– Было рассмотрено функционирование Р2Р концепции сети в реализации Ethereum;
– Изучен механизм хранения данных в Ethereum;
Литература:
- Vasilios Darlagiannis. P2P Systems and Overlay Networks, [PDF file] URL: https://www.iti.gr/iti/files/document/seminars/p2p_eketa_090610_v2.pdf
- S. Umamaheswari and Dr. V. Leela,. P2P Overlay Maintenance Algorithm, [PDF file] URL: http://journals.sagepub.com/doi/pdf/10.1260/1748–3018.6.3.555
- Ethereum Whitepaper [PDF file] URL: http://blockchainlab.com/pdf/Ethereum_white_paper-a_next_generation_smart_contract_and_decentralized_application_platform-vitalik-buterin.pdf