Оригинал статьи, указать: воспроизведено сКиган Смолл СтилИ указать исходную ссылку:http://keeganlee.me/post/blockchain/20180313Номер подписки WeChat:keeganlee_meНаписано 13 марта 2018 г.
Адрес столбца:xiaozhuanlan.com/fullstack
Согласно предыдущей статье "Понимание блокчейна от микро до макро》Мы уже узнали, что на микроуровне блокчейн, по сути, является своего родаНеизменяемая и отслеживаемая цепочка хэшей; Макроскопически он также имеет три другие основные характеристики:Распределенное хранилище, сеть P2P и механизм консенсуса. Распределенное хранилище — это не что иное, как то, что большинство узлов в сети сохраняют всю цепочку блоков, что легко понять и не сложно, поэтому нет необходимости вдаваться в подробности. Однако сеть P2P и механизм консенсуса блокчейна относительно сложнее, поэтому я буду использовать две статьи, чтобы рассказать об этих двух частях соответственно.В этой статье я сначала разберусь с сетью P2P блокчейна.
P2P-сеть
Поскольку большинство людей очень мало знают о P2P-сетях, необходимо сначала поговорить о некоторых основных принципах P2P-сетей. Содержание этой главы в основном взято из книги «Принцип и применение одноранговой сети P2P». Эта книга систематически знакомит с теоретическими основами P2P, что очень подходит для начальных читателей, которые хотят полностью понять знания P2P. , Вы можете взглянуть.
Сети P2P отличаются от традиционныхСтруктура клиент/сервер (клиент/сервер, C/S), каждый узел в сети P2P может быть как клиентом, так и сервером, поэтому использование протокола HTTP для связи между узлами не подходит.Как правило, Socket используется непосредственно для сетевого программирования.
В основном существует четыре различных сетевых модели для P2P, которые также представляют четыре этапа развития технологии P2P:Централизованные, чисто распределенные, гибридные и структурированные модели. Однако следует отметить, что упомянутая здесь сетевая модель в основном относится к структуре запроса маршрутизации, то есть к тому, как установить канал соединения между разными узлами. два узла.
Самый простой способ маршрутацентрализованный, то есть существует центральный узел, в котором хранится информация индекса всех других узлов, и информация индекса обычно включает IP-адрес узла, порт, ресурс узла и т. д. Преимущества централизованной маршрутизации заключаются в простой структуре и простоте реализации. Но очевиден и недостаток: поскольку центральному узлу необходимо хранить информацию о маршрутизации всех узлов, при расширении масштаба узла легко получить узкое место в производительности, а также возникает проблема единой точки отказа.
Вторая структура маршрутизациичистый распределенныйДа, удаление центрального узла и создание случайной сети между узлами P2P означает случайное установление канала соединения между вновь добавленным узлом и узлом в сети P2P, тем самым формируя случайную топологию. Существует также много способов присоединения нового узла к сети.Самый простой — случайным образом выбрать существующий узел и установить отношения соседства. Как и Биткойн, DNS используется для запросов к другим узлам. DNS обычно жестко запрограммирован в коде.Эти DNS-серверы будут предоставлять список IP-адресов узлов Биткойн, чтобы новые узлы могли найти другие узлы для установления соединений. После того, как новый узел установит соединение с соседним узлом, ему необходимо широковещательно передать всю сеть, чтобы вся сеть узнала о существовании узла. Общесетевой широковещательный метод заключается в том, что узел сначала осуществляет широковещательную рассылку своим соседним узлам, а после того, как соседний узел получает широковещательное сообщение, он продолжает широковещательную рассылку своим соседним узлам и так далее, чтобы осуществлять широковещательную рассылку на всю сеть. Этот метод вещания также известен какмеханизм затопления. Чистая распределенная структура не имеет проблемы узкого места производительности в одной точке и проблемы одноточечного отказа централизованной структуры и имеет хорошую масштабируемость, но механизм лавинной рассылки создает новые проблемы, в основном проблему плохой управляемости, в том числе две большие проблемы. заключается в том, что легко сформировать лавинный цикл.Например, сообщение, отправленное узлом A, проходит через узел B к узлу C, а узел C передает его узлу A, который формирует цикл; еще одна острая проблема - реагировать на штормы сообщений Проблема в том, что если ресурсы, которые хочет запросить узел А, принадлежат многим узлам, то за очень короткий промежуток времени большое количество узлов отправит ответные сообщения узлу А одновременно, что может привести к тому, что узел А быть парализованным мгновенно.
Давайте взглянем на третью структуру маршрутизации:смешанный тип. Гибрид на самом деле представляет собой смесь централизованных и распределенных структур.Как показано на рисунке ниже, существует несколькосупер узелобразуют распределенную сеть, и каждый суперузел имеет нескольконормальный узелОн образует с ним локальную централизованную сеть. Когда присоединяется новый обычный узел, сначала выберите суперузел для связи, суперузел отправляет список других суперузлов на вновь присоединенный узел, и присоединяющийся узел решает, какой конкретный суперузел выбрать в качестве родительского узла в соответствии с суперузлом. статус узла в списке. Распространение лавинной рассылки этой структуры происходит только между суперузлами, что позволяет избежать проблемы крупномасштабного флуда. В практических приложениях гибридная структура представляет собой относительно гибкую и эффективную сетевую архитектуру, а сложность реализации относительно невелика, поэтому в настоящее время многие системы разрабатываются и внедряются на основе гибридной структуры. Собственно, сеть Биткойн и сегодня имеет такую структуру, о чем будет подробно рассказано позже.
Последняя сетьСтруктурированная P2P-сеть, которая также является распределенной сетевой структурой, но отличается от чисто распределенной структуры. Чисто распределенная сеть — это случайная сеть, в то время как структурированная сеть организует все узлы упорядоченным образом в соответствии с определенной структурой, такой как кольцевая сеть или древовидная сеть. Конкретная реализация структурированной сети обычно основана на идее алгоритма **DHT (распределенная хэш-таблица, распределенная хеш-таблица) **. DHT предлагает только сетевую модель и не требует конкретной реализации, в основном он хочет решить проблему быстрой и точной маршрутизации и определения местоположения данных в распределенной среде. Конкретные схемы реализации включают такие алгоритмы, как Chord, Pastry, CAN и Kademlia, среди которыхKademliaЭто также алгоритм реализации сети Ethereum.Многие широко используемые приложения P2P, такие как BitTorrent, eDonkey и т. д., также используют Kademlia. Из-за ограниченного места конкретные принципы этих алгоритмов обсуждаться не будут. В настоящее время мы в основном понимаем основную идею DHT.
В сети P2P можно абстрагироваться от двух видов пространств:ресурсное пространствоа такжеУзловое пространство. Пространство ресурсов — это набор ресурсов, сохраненных всеми узлами, а пространство узлов — это набор всех узлов. Пронумеруйте все ресурсы и узлы отдельно, например, превратив имя или содержимое ресурса в значение с помощью хеш-функции (это также широко используемый метод в DHT), таким образом, каждый ресурс имеет соответствующий идентификатор, и каждый узел также имеет Отношение сопоставления устанавливается между идентификатором, идентификатором ресурса и идентификатором узла.Например, если вся информация об индексе ресурса n хранится на узле n, при поиске ресурса n можно найти только узел n, чтобы избежать обобщения Широковещательная рассылка, которая может направлять и находить данные быстрее и точнее. Конечно, в практических приложениях нет однозначного соответствия между идентификаторами ресурсов и идентификаторами узлов, но поскольку все идентификаторы являются числами, существует отношение размера или отношения частичного порядка и т. д., основанное на этих отношениях, может быть установлено отображение между двумя отношениями. Это основная идея DHT. Алгоритм DHT использует распределенную хэш-таблицу для нумерации ресурсов и нумерации узлов, так что нумерация пространства ресурсов и пространства узлов имеет лучшие свойства, такие как уникальность и равномерное распределение, которые могут соответствовать требованиям структурированных распределенных сетей.
Таким образом, это теоретическая основа сети P2P.Разные блокчейны могут использовать разные модели сети, но основные принципы одинаковы. Две наиболее репрезентативные сети блокчейнов будут объяснены позже: сеть Биткойн и сеть Эфириума.
Биткойн-сеть
Во-первых, узлы в сети Биткойн выполняют четыре основные функции:Кошелек, майнинг, база данных блокчейна, сетевая маршрутизация. Каждый узел будет иметь функцию маршрутизации, но другие функции могут быть недоступны. Различные типы узлов могут содержать только некоторые функции. Как правило, только узлы **bitcoin core** будут выполнять все четыре функции.
Все узлы будут участвовать в передаче контрольной суммы транзакций и информации о блоках, а также будут обнаруживать и поддерживать соединения с другими узлами. Некоторые узлы будут содержать полную базу данных блокчейна, включая все данные транзакций, такие узлы также называютсяПолный узел. Другие узлы хранят только часть базы данных блокчейна, как правило, только заголовок блока, а не данные транзакции, они будут передавать "Упрощенная проверка транзакции (SPV)” для завершения проверки транзакции, такой узел также называетсяузел SPVилиЛегкий узел. Кошелек, как правило, является функцией клиента для ПК или мобильного телефона. Пользователи могут проверять сумму своего счета, управлять адресом кошелька и закрытым ключом, а также инициировать транзакции через кошелек. За исключением Bitcoin Core, который представляет собой полноценный узел, большинство кошельковлегкий узел. Узел майнинга решает проблему, решаяДоказательство работы (PoW)Алгоритмические проблемы, конкурирующие с другими узлами майнинга для создания новых блоков. Некоторые узлы майнинга такжеполный узел, то есть хранится и полная база данных блокчейна, и такие узлы, как правило,Соло-шахтер. Существуют также узлы майнинга, которые не майнят самостоятельно, а связаны с другими узлами длямайнинг пул, участвовать в коллективном майнинге, этот тип узла также обычно называютМайнер пула. Это сформирует локальную централизованную сеть пула майнинга, центральный узелсервер пула майнинга, все остальные узлы майнинга подключены к серверу пула майнинга.майнеры пула майнингаа такжесервер пула майнингаСвязь междуБиткойн-протокол, вместо этого используйтеПротокол майнинга пула, а сервер пула выступает в ролиполный узелЗатем используйте основную сеть с другими биткойн-узлами.Биткойн-протоколобщаться.
Во всей сети Биткойн, за исключением использования разных узловБиткойн-протоколВ качестве основной сети протокола связи существует также множество расширенных сетей, в том числе упомянутая вышесеть майнинг пула. Различные сети майнинговых пулов также могут использовать разные протоколы майнинговых пулов.Слоистый протокол, протокол не только поддерживает узлы майнинга, но и поддерживаетКошельки для тонких клиентов. Расширенная сеть Биткойн, включающая различные узлы основной сети протокола Биткойн и сети Stratum, а также другие сети пулов майнинга, выглядит примерно следующим образом:
Кроме того, майнинг имеет особые потребности. Мы знаем, что после того, как майнеры создают новый блок, им необходимо выполнить широковещательную рассылку на все узлы во всей сети.Когда вся сеть принимает блок, вознаграждение за майнинг, данное майнеру, становится действительным, и тогда можно запускать хэш следующего блока. расчет. Поэтому майнеры должны минимизировать время между трансляцией нового блока и вычислением хэша следующего блока. Если для распространения блоков между майнерами используется только сеть протокола Биткойн, показанная на рисунке выше, несомненно, будет высокая задержка в сети.Поэтому для ускорения синхронного распространения новых блоков между майнерами необходима выделенная сеть распространения.Эта специализированная сеть также называетсяСеть распространения биткойновилиРетрансляционная сеть Биткойн.
Сеть Эфириума
Как и Биткойн, узлы Эфириума также имеютКошелек, майнинг, база данных блокчейна, сетевая маршрутизацияТакже существует множество различных типов узлов для четырех функций, а также множество расширенных сетей в дополнение к основной сети. Но в отличие от Биткойна, P2P-сеть основной сети Биткойн неструктурирована, а P2P-сеть Ethereum структурирована. Как мы упоминали ранее, P2P-сеть Ethereum в основном используетКадемлия (именуемая Кад)Реализация алгоритма Kad представляет собой технологию **Distributed Hash Table (DHT)**, с помощью этой технологии можно быстро и точно маршрутизировать и находить данные в распределенной среде. Следовательно, следующее в основном объясняет сеть Kad Ethereum.
В сети Kad каждый узел имеет уникальный идентификатор узла. Кроме того, вычисляется и расстояние между разными узлами, но это расстояние не физическое расстояние, а логическое расстояние.XOR (символ ^)Расчетная, то есть формула расчета расстояния между двумя узлами А и В:D(A,B) = A.ID^B.ID. XOR обладает важным свойством: если предположить, что a, b и c — любые три числа, если выполняется a^b = a^c, то b = c. Следовательно, для данного узла a и расстояния L существует один и только один узел b, такой что D(a,b) = L. Таким образом, можно эффективно измерить логическое расстояние между различными узлами в сети Kad.
На основе метрики расстояния XOR Kad также может организовать всю топологию сети в видебинарное префиксное дерево, каждый NodeID сопоставляется с листом двоичного дерева.
Основные правила картирования:
- Представьте NodeID в двоичной форме, а затем обработайте 0 или 1 каждого бита по очереди от старшего к младшему;
- n-й бит двоичного кода соответствует n-му уровню двоичного дерева;
- Если бит равен 0, войти в левое поддерево, если 1, войти в правое поддерево (и наоборот);
- После обработки всех битов NodeID соответствует листу двоичного дерева.
В этой бинарной древовидной структуре для каждого узла чем ближе узел к нему, тем ближе расстояние XOR. Затем вы можете разделить все двоичное дерево в соответствии с расстоянием XOR от себя. Правило разделения таково: начиная с корневого узла, разделите поддерево, которое не включает себя, а затем разделите поддерево, которое не включает себя, на поддерево, которое включает себя, и так далее, пока не останется только вы. Взяв в качестве примера узел 110 на приведенном выше рисунке, начиная с корневого узла, поскольку узел 110 находится в правом поддереве, разделите все поддерево слева, то есть поддерево, содержащее три узла 000, 001 и 010; Далее перейти к поддереву второго уровня, а затем разбить левое поддерево, не содержащее 110 узлов, то есть поддерево, содержащее два узла 100 и 101, и, наконец, разбить 111. Таким образом, все бинарное дерево, за исключением 110 узлов, разбивается на три поддерева.
После разделения поддерева, если известен один узел в каждом поддереве, можно выполнить рекурсивную маршрутизацию для обхода всех узлов всего бинарного дерева. Однако в реальных сценариях, поскольку узлы динамически меняются, обычно известен не только один узел каждого поддерева, но необходимо знать несколько узлов. Следовательно, есть Кад, называемыйК-ведроКонцепция каждого сегмента будет записывать несколько узлов, известных в каждом поддереве. Фактически,K-стволтолько одинтаблица маршрутизации, если имеется m поддеревьев, соответствующий узел должен поддерживать m таблиц маршрутизации. Каждый узел будет поддерживать свои собственные сегменты K. Информация об узле, записанная в каждом сегменте K, обычно включает NodeID, IP, конечную точку и расстояние XOR от целевого узла (то есть узла, который поддерживает сегмент K). и другая информация. В Ethereum количество K-сегментов, поддерживаемых каждым узлом, равно 256. Эти 256 K-сегментов будут отсортированы в соответствии с расстоянием XOR от целевого узла.Верхний предел количества узлов, хранящихся в каждом K-сегменте, составляет 16. .
В сети Kad Ethereum связь между узлами основана на UDP, и настроены 4 основных протокола связи:
- Ping: используется для определения того, находится ли узел в сети
- Pong: используется для ответа на команды Ping
- FindNode: используется для поиска других узлов с XOR, ближайшим к целевому узлу.
- Neighbours: В ответ на команду FindNode будет возвращен один или несколько узлов
С помощью приведенных выше четырех команд могут быть реализованы такие механизмы, как добавление новых узлов и обновление K-сегментов. Конкретный процесс реализации подробно обсуждаться не будет, и каждый может подумать сам.
Суммировать
Сети P2P с разной структурой имеют разные преимущества и недостатки. Структура сети Биткойн, очевидно, проста для понимания и относительно проста в реализации, в то время как сеть Эфириума вводит XOR-расстояние, бинарное префиксное дерево, K-сегмент и т. д. Структура намного сложнее, но она верна в Маршрутизация узлов Гораздо быстрее, чем биткойн. Кроме того, будь то Биткойн или Эфириум, на самом деле это всего лишь набор одного или нескольких протоколов, и разные узлы могут фактически использовать разные конкретные реализации.Например, Биткойн имеет Bitcoin Core, реализованный на C++, а BitcoinJ, реализованный на Java. Ethereum также имеет go-ethereum, реализованный на языке Go, go-ethereum, реализованный на C++, и Ethereum(J), реализованный на Java.
Думай и практикуй
Как происходит процесс присоединения к новым узлам и обновления K-сегментов в сети Ethereum Kad? Каков процесс присоединения к новому узлу в Биткойн? Каковы реализации хэш-таблиц?
Отсканируйте QR-код ниже, чтобы перейти к номеру подписки.