28 апреля 2020

P2P Слой

Эта статья — перевод The P2P layer” с сайта TezEdge

Статья также доступна в переводе на украинский язык.

Peer-to-peer (буквальный перевод “равный к равному”, или “участник к участнику”, далее мы переводим “peer” как “участник”) сети представляют особый интерес для криптовалют, поскольку они хорошо работают в рамках децентрализованной архитектуры блокчейна. Узел общается с другими узлами Tezos через сеть одноранговых сплетен (peer to peer gossip), чтобы распространять информацию о состоянии сети.

Скажем, Алиса хочет участвовать в сети Tezos. Ее интересует выпечка (baking, процесс создания блоков в блокчейне Tezos) или, возможно, она разработчик смарт-контракта и хочет получить доступ к данным на блокчейне. Независимо от ее мотива, для участия в сети Tezos она должна настроить устройство как узел в сети Tezos. Эта настройка известна как бутстрэппинг (bootstrapping) и она включает синхронизацию с сетью (загрузка текущего состояния блокчейна). Этот процесс разделен на две части:

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

Процесс рукопожатия

  1. Создание идентичности участников

Во-первых, прежде чем она сможет даже подключиться к слою P2P, Tezos требует от новых участников выполнить небольшую задачу proof of work, благодаря которой они создают идентификацию своего узла. Эта задача — контрмеры против противников, которые в противном случае могут затопить сеть Tezos тысячами фейковых участников (явление, известное как атака Сивиллы). Proof of work предполагает выявление нонса (nonce). Эта proof of work задача похожа (но гораздо менее сложная) на те, которые выполняют майнеры Биткойна, когда они добывают новые блоки. Как только нонс обнаружено, участник получает proofofwork_stamp. Идентификация вашего узла базируется на этом нонсе.

После решения proof of work задачи участники генерируют следующие четыре типа информации:

peer_id: идентичность участника, основанная на нонсе, решеному в первичном proof of work задании.

public_key: публичный ключ предоставляется другим коллегам, которые сочетают его со своими личными ключами для создания ключей канала, создавая надежные связи между участниками.

secret_key: это собственный личный ключ участника, сочетается с публичным ключом других коллег, чтобы образовывать ключи каналов, которые используются для шифрования и расшифровки сообщений, которые отправляются между участниками.

proofofwork_stamp: штамп, который используется для подтверждения подлинности нонса proof of work участника.

2. Запрос списка участников с DNS

Алиса теперь подключается к сети Tezos P2P. Теперь ей нужно будет разобраться, к каким участникам подключаться. Она запрашивает список участников с сервера DNS, который затем доставляет список участников, который содержит IP-адреса участников, к которым Алиса может подключиться. Хотя могут быть миллионы участников в сети Tezos, она подключается только к нескольким за один раз. Если необходимо, Алиса может позже расширить свой список участников, попросив у других участников их списки.

Теперь разобравшись, с кем она свяжется, Алиса должна установить надежную связь с этими участниками. Процесс, известный как рукопожатие.

3. Рукопожатие

Скажем, Алиса хочет подать руку Бобу. Перед тем, как начнется рукопожатие, Алиса генерирует нонс (не связанный с нонсом из шага №1), который служит счетчиком сообщений, направляемых Бобу. Также Боб генерирует нонс, который считает сообщения, которые он посылает Алисе. Тогда Алиса и Боб обмениваются своими proof of work штампами, публичными ключами, нонсами, портами слушателей и списками версий.

Proof of work штамп

Это штамп, который был создан с proof of work задачи Алисой, выполненной на шаге 1.

Публичный ключ

Публичный ключ генерируется на шаге 1 и используется для шифрования сообщений между участниками.

Нонс

Этот нонс — уникальное значение, созданное Алисой до того, как она начинает рукопожатие с Бобом. Он работает как счетчик. Алиса получает нос Боба (нонс Боб-Алиса) и использует его для подсчета количества сообщений, которые она получила от Боба. Кроме нонсов, полученных от Боба, Алиса уже имеет другой нонс, который она создала перед рукопожатием — нонс Алиса-Боб, используемый как счётчик сообщений направляемых Бобу.

Этот нонс не стоит путать с нонсом, который задействован в proof of work задаче которая используется для генерирования идентичности участников.

Алиса проверяет proof of work штамп Боба и наоборот. Если оба штампы действительны, Алиса использует свой личный ключ и публичный ключ Боба, чтобы создать ключ канала. Боб делает то же со своим личным ключом и публичным ключом Алисы. Для шифрования или расшифровки сообщений, которыми она обменивается с Бобом, Алиса использует свой ключ канала в сочетании с одним из нонсов, в зависимости от того, получает она (нонс Боб-Алиса) или направляет (нонс Алиса-Боб) сообщения.

Теперь они обмениваются первым зашифрованным сообщением, которое содержит метаданные. После этого они обмениваются еще одним сообщением, которое содержит Ack / Nack (Принять / Отказать в соединении).

Если Алиса получает Ack от Боба и наоборот, рукопожатие проходит успешно, и теперь они готовы начать обмен зашифрованными сообщениями.

Алиса повторяет этот процесс с другими участниками, пока она не установит надежную связь с достаточным количеством участников. Хотя у нее есть надежная связь только с определенным количеством участников, она косвенно связана со всей распределенной сетью Tezos, как показано в анимации выше.

Когда канал формируется, коллеги обмениваются другими типами сообщений, включая:

  • Бутстрэппинг (синхронизация с текущей версией блокчейна)
  • Списки участников
  • Введение новых операций
  • Новые публикации блоков
  • Изменения протокола

Процесс Бутстрэппинга

  1. Запрос и загрузка заголовков

Теперь, когда поддерживать связь безопасно, Алиса может начать загружать свой узел. Ей надо обновить состояние блокчейна, что означает загрузку истории всех блоков, опубликованных до сих пор на Tezos. Алиса запрашивает последний заголовок блока у Боба.

Каждый заголовок блока содержит следующую информацию:

level: (уровень) высота блока, от генезис блока

proto: количество изменений протокола после блока генезиса.

predecessor: (предшественник) хэш предыдущего блока.

timestamp: метка времени, когда утверждается создания блока.

validation_pass: количество пропусков валидации (также количество списков операций).

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

operations_hash: коренной хеш дерева Меркла списка корневых хэшей деревьев Меркла для различных наборов операций в блоке.

context: (контекст) хеш состояния контекста после применения этого блока.

Подумайте о том, что Алиса не знает, какой блок — последний. Это означает, что она не может идентифицировать одного участника, который имеет последнюю версию и просто скачать его. Вместо этого она подключится ко всем участникам (с которыми она успешно провела рукопожатие) и начнет запрашивать историю всех блоков (заголовков блоков и операций) у каждого участника. Каждый участник по-разному подбирает историю своего блока. Алиса начинает с загрузки последнего блока с самого раннего образца участника. Алисе нужно загрузить блоки хронологически, от наиболее старых до самых новых, отражая порядок, в котором эти блоки были опубликованы.

2. Загрузка операций и заполнение блоков

После загрузки заголовков, Алиса начнет завершать блоки загрузкой операций внутри них, начиная с самого старшего блока (блок уровня 1, блок сразу после генезис-блока). Это значит все операции, включая данные транзакций.

Блок содержит такие списки операций:

Transactions: (Транзакции): транзакции токенов Tezos между пользователями Tezos. Это стандартная операция, используется для передачи токенов Tezos на счет.

Delegations: (Делегации): используются для делегирования средств пекарю (baker), зарегистрированного в качестве делегата. Делегат может быть обозначен как активный, или пассивный. Пассивный делегат не может быть выбран для выпечки (baking) или одобрения (endorsement).

Originations: (Создание): эта операция используется для создания учетных записей. Оригинальные учетные записи имеют адреса, начиная с “KT1”.

Endorsement: (Одобрение): операция одобрения указывает главу цепи, с точки зрения поддерживателя определенного слота. Поддерживатель выбирается случайным образом для включения в блок, который расширяет главу цепи, как указано в этой операции. Блок с большим количеством одобрений улучшает вес цепи и увеличивает вероятность того, что цепь является канонической.

Activations: (активации) этот тип операций используется для активации счетов, которым выделили токены Tezos за их вклад в начальный сбор средств от Tezos Foundation.

Существуют также другие виды операций, которые применяются намного реже:

Seed nonce revelation: (выявление посевного нонса): используется для выявления нонса, привлеченного к генерированию идентичности участника.

Double endorsement evidence: (Доказательства двойного одобрения): очень редкий тип операции, представляющий доказательства двойного одобрения, то есть когда есть два одобрение для двух блоков на одном уровне блока.

Double baking evidence: (Доказательства двойной выпечки) тип операции, представляет доказательства двойной выпечки, в которой пекарь пытался испечь (валидировать) два блока на одном уровне блока.

3. Применение операций в протоколе

Теперь, когда Алиса загрузила все операции, она применяет их в протоколе. Важно отметить, что протокол Tezos лежит вне слоя P2P. Протокол валидирует блоки и операции в них. После валидации, операции применяются, в результате чего ведется реестр, содержащий различную информацию, включая балансы всех пользователей Tezos. Эти данные затем сохраняются в модуле хранения. Мы рассмотрим как протокол, так и хранение в следующих статьях.

Обсудить в Discord!