Blockchain алгоритм – Алгоритм формирования блокчейна / Dсoin corporate blog / Habr

Содержание

Обзор 9 алгоритмов блокчейн консенсуса

Описание алгоритма опубликовано в 2014 году, как потенциально нового и более надежного алгоритма для биткоина, информации о его имплементации я так и не нашел. Авторы алгоритма PoA попытались объединить два наиболее популярных алгоритма, такие как Proof-of-Work и Proof-of-Stake, с целью увеличения уровня защиты от потенциально возможных атак (51% attack, Denial-of-Service attacks (DoS). Принцип работы алгоритма описан ниже:
— каждый майнер блокчейн сети пробует сгенерировать заголовок пустого блока, который включает в себя хеш предыдущего блока, публичный адрес майнера, индекс текущего блока в блокчейне и nonce.
— после генерации заголовка пустого блока отвечающего текущим требованиям сложности, узел рассылает этот заголовок в блокчейн сеть.
— все узлы сети рассматривают заголовок такого блока, как данные полученные от псевдослучайных владельцев. Используя хеш разосланного заголовка блока и хеш предыдущего блока + N пресетов с использованием алгоритма follow-the-satoshi выбираются стейкхолдеры.
— каждый стейкхолдер, находящийся в онлайне, проверяет полученный, пустой заголовок блока на его корректность. Во время проверки, каждый получивший заголовок, проверяет: является ли он одним из первых N-1 стейкхолдеров «счастливчиков» этого блока и в этом случае подписывает заголовок пустого блока своим секретным ключом и отправляет его в блокчейн сеть.
— Когда N-й стейкхолдер видит, что он должен стать подписантом этого блока, он, в дополнение к заголовку пустого блока, добавляет блок с включенными транзакциями (количество включаемых транзакций он выбирает сам), все подписи N-1 от других стейкхолдеров и подписывает блок.
— Стейкхолдер N рассылает новый, подготовленный блок. Узлы получают этот блок, убеждаются в его законности и добавляют этот блок в блокчейн.
— Премия за транзакции, которую получил N-стейкхолдер, распределяется между майнером и N стейкхолдерами «счастливчиками».

Ссылки
— Proof of Activity: Extending Bitcoin’s Proof of Work via Proof of Stake / PDF

digiforest.io

Виды консенсуса Блокчейн — алгоритмы

Любая реализация криптовалюты должна быть способна защитить Blockchain от возможных атак. Например, злоумышленник может потратить определенную сумму денег, а затем отменить транзакцию, распределив собственную версию блок-цепи, которая не включает транзакцию. Пока безопасность блочной цепи не зависит от одного центра управления, пользователи не знают, какая версия базы данных является исходной. Чтобы избежать атаки, сеть использует согласованный алгоритм.

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

Что такое алгоритм консенсуса Блокчейн

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

Консенсус Блокчейн — это процесс принятия решений группой, в котором все члены системы готовы прийти к единому решению в интересах всей группы. Сам процесс принятия решений также называется консенсусным алгоритмом. В этом случае ключевыми аспектами являются:

  1. Согласование.
  2. Совместная работа.
  3. Кооперирование.
  4. Эгалитаризм — равенство всех голосов.
  5. Инклюзивность – максимальное количество людей участвующих в консенсусе.
  6. Участие.

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

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



Механизмы достижения консенсуса в Блокчейне

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

Зачем нужны эти сложности? Оказывается, без согласования между узлами сети возможна повторная трата средств (double spending).

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

Proof-of-Work (PoW) (Доказательство работы)

Сфера применения: Bitcoin, Ethereum, Litecoin, Dogecoin и т. д.

Алгоритм Proof-of-Work является наиболее популярным консенсусным механизмом, используемым для блочной цепи, не в последнюю очередь потому, что он используется на платформах Bitcoin и Ethereum. Суть алгоритма заключается в том, что сетевой узел должен выполнять интенсивные вычисления, чтобы доказать транзакцию и добавить ее в пул, причем результат легко сопоставим с другими результатами сетевых вычислений. Первый, кто завершил необходимые вычисления, получает вознаграждение за выполненную работу, поэтому члены системы конкурируют. Следует также подчеркнуть, что объем выполненных работ всегда является постоянным.

Плюсы PoW:

  • Устойчивость к атаке Sybil, когда пользователь злонамеренно создает поддельные узлы, чтобы подавить реальных честных пользователей. Однако вероятность поддельного создания равна нулю, поскольку вычислительная производительность лежит в основе Доказательства работы и связана с материальным миром.

  • Подтверждение не может быть сфальсифицировано или украдено по вышеуказанной причине.

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

  • Честность в распределении вознаграждений. Сумма вознаграждения напрямую зависит от хеш-ставки шахтера (вычислительная производительность). Шахтер всегда награждается пропорционально добытым блокам.

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

Система достаточно проста и понятна, но е нее все еще есть некоторые серьезные недостатки.

Минусы PoW:

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

  • Уязвимость к атаке 51%. Объекты, которые имеют доступ к более мощным вычислительным системам, могут создать потенциальную угрозу централизации. Даже сейчас 65% добычи Биткоинов разделяются пятью пулами. Это потенциально опасная ситуация: их объединенные силы (если будет) могут привести к атаке 51%, что приведет к появлению злонамеренного большинства, способного игнорировать блоки от всех оставшихся шахтеров. Эксперты уверяют, что более крупные системы защищены от подобных ситуаций, тогда как более мелкие блок-цепи с гораздо меньшим числом членов сети по-прежнему сталкиваются с определенными рисками.

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

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



Proof-of-Stake (PoS) (Доказательство ставки)

Сфера применения: VCash, BitBay, Peercoin, Qtum, Stratis.

Если в системе используется алгоритм Proof-of-Stake, более уместно говорить о валидаторах, то есть о членах сети, а не о шахтерах. Чтобы подтвердить транзакцию и добавить ее в пул, валидаторы блокируют часть средств, конвертируя их в ставку, которую они кладут на блок, который может быть добавлен в сеть. Это обязательное залоговое обеспечение фиксируется с целью обеспечения любого возможного ненадлежащего поведения члена сети. Таким образом, участники конкурируют за право на подтверждение и не создание блока.

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

Плюсы PoS:

  • Снижение потребления энергии в сравнении с PoW. Процесс проверки полностью виртуализирован и не требует больших вычислений.

  • Защита от атаки 51%. Злоумышленник вряд ли выиграет от такого подхода.

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

Минусы PoS:

  • Дополнительный стимул для децентрализации. Общий принцип: «чем больше сумма валюты, тем выше потенциальные вознаграждения», дает членам сети дополнительный импульс для сохранения валюты. Хотя сеть будет защищена от атаки на 51%, гипотетически существует вероятность того, что 51% средств будет накоплено в руках одного человека, что приведет к последующему контролю за принятием решений. Такая ситуация маловероятна в более крупных системах, тогда как более мелкие сети могут быть подвержены возможному сценарию, подобному этому.

  • Угроза вилок. В традиционном шаблоне «Доказательство ставки» наиболее полезным поведением участников является создание вилок для повторных расходов фонда. Именно по этой причине механизм PoS еще больше усложняется обязательными ставками и другими условиями в попытке закрыть «пробелы» в сетевой безопасности, введя экономический фактор для сдерживания недобросовестных игроков.



Delegated Proof-of-Stake (DPoS) (Делегированное подтверждение ставки)

Сфера применения: EOS, BitShares.

Делегированный алгоритм Proof-of-Stake сильно отличается от PoS. Механизм включает в себя выбор определенного количества валидаторов среди всех членов сети, которые подтверждают транзакции и участвуют в создании блока по расписанию. Выбор валидаторов основан на репутации членов; эти лица пользуются ограниченным доверием и имеют право подтвердить цепочку блоков, не допуская вредоносных пользователей. Тем не менее, валидаторы переизбираются каждый раунд, причем круглая скорость зависит от каждой системы.

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

Плюсы DPoS:

  • Члены сети заинтересованы в честности транзакций. Система репутации оказывается мощным стимулом для поддержания системы в соответствии с правилами честной конкуренции.

  • Скорость транзакций выше по сравнению с PoS. Делегаты могут сотрудничать и не конкурировать друг с другом, частичная централизация позволяет достичь консенсуса быстрее.

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

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

Минусы DPoS:

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

  • Держателям кошельков необходима постоянная мотивация, чтобы их деятельность поддерживалась на должном уровне.



Другие модификации алгоритма PoS

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

LPoS (Leased Proof-of-Stake) используется на платформе Waves. Нижняя строка этого метода заключается в том, что баланс передается в аренду другим узлам добычи, а доходы от непрямой добычи заработаны без необходимости вычислений.

PoI («Доказательство важности») уделяет должное внимание не только балансовому счету члена сети, но и активности / важности пользователя, которая измеряется транзакциями, выполненными на счете. Соответственно, этот механизм поощряет пользователей к тому, чтобы они были постоянно активными и демонстрировали его ради более высоких вознаграждений. PoI используется на платформе NEM.

Proof of Concept (PoC) (Доказательство емкости)

Сфера применения: Burstcoin.

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

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

Плюсы PoC:

  • Алгоритм не требует специального оборудования для работы, теоретически даже мобильное устройство под управлением ОС Android может стать узлом. Данные о добыче легко удалить, и пользователь может использовать жесткий диск для выполнения других задач.

Минусы PoC:

  • Метод менее популярен. Однако он может реализовать алгоритм в небольших частных сетях.

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

guland.biz

Изучаем блокчейн на практике / Цифровые Экосистемы corporate blog / Habr

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

Но разобраться в блокчейне не так-то просто, по крайней мере, по моему опыту. Я корпел над заумными видео, продирался через туториалы и с нарастающей досадой отмечал недостаток иллюстрирующих примеров.

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



Но для начала…


Напомню: блокчейн — это неизменяемая, последовательная цепочка записей, которые называются блоками. Они могут заключать в себе транзакции, файлы и, в принципе, любые другие виды данных. Главное здесь — что они связаны друг с другом посредством хэшей.

Если вы не совсем понимаете, что такое хэш, вам сюда.

На кого рассчитано это руководство? На тех, кто без проблем может читать и писать несложный код на Python и в общих чертах представляет, как работают HTTP запросы — мы будет общаться с нашим блокчейном через HTTP.

Что будет нужно для работы? Проверьте, чтобы у вас был установлен Python 3.6+ (вместе с pip). Также вам нужно будет установить Flask и прекрасную библиотеку Requests:

 pip install Flask==0.12.2 requests==2.18.4 

Ах да, еще вам понадобится HTTP клиент, например, Postman или cURL. Тут подойдет любой.

Где можно посмотреть то, что получится в итоге? Исходный код доступен здесь.

Шаг первый: Делаем блокчейн


Откройте свой любимый текстовый или графический редактор, мне вот, например, нравится PyCharm. Создайте новый файл под названием blockchain.py. Мы будем работать только в этом файле, а если запутаетесь, всегда можно подсмотреть в исходный код.

Представление блокчейна

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

class Blockchain(object):
    def __init__(self):
        self.chain = []
        self.current_transactions = []
        
    def new_block(self):
        # Creates a new Block and adds it to the chain
        pass
    
    def new_transaction(self):
        # Adds a new transaction to the list of transactions
        pass
    
    @staticmethod
    def hash(block):
        # Hashes a Block
        pass

    @property
    def last_block(self):
        # Returns the last Block in the chain
        pass

Класс Blockchain отвечает за управление цепочкой. Здесь будут храниться транзакции, а также некоторые вспомогательные методы для добавления в цепочку новых блоков. Давайте распишем эти методы.

Как выглядит блок?

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

Вот пример того, как может выглядет отдельный блок:

block = {
    'index': 1,
    'timestamp': 1506057125.900785,
    'transactions': [
        {
            'sender': "8527147fe1f5426f9dd545de4b27ee00",
            'recipient': "a77f5cdfa2934df3954a5c7c7da5df1f",
            'amount': 5,
        }
    ],
    'proof': 324984774000,
    'previous_hash': "2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824"
}

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

Понятно? Если нет, остановитесь и дайте себе время усвоить эту информацию — именно в ней состоит базовый принцип блокчейна.

Добавляем транзакции в блок

Нам нужно каким-то образом добавлять в блок новые транзакции. За это отвечает метод new_transaction(), работает он достаточно просто:

class Blockchain(object):
    ...
    
    def new_transaction(self, sender, recipient, amount):
        """
        Creates a new transaction to go into the next mined Block

        :param sender: <str> Address of the Sender
        :param recipient: <str> Address of the Recipient
        :param amount: <int> Amount
        :return: <int> The index of the Block that will hold this transaction
        """

        self.current_transactions.append({
            'sender': sender,
            'recipient': recipient,
            'amount': amount,
        })

        return self.last_block['index'] + 1

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

Помимо создания блока genesis в конструкторе, мы также распишем методы new_block(), new_transaction() и hash():

import hashlib
import json
from time import time


class Blockchain(object):
    def __init__(self):
        self.current_transactions = []
        self.chain = []

        # Create the genesis block
        self.new_block(previous_hash=1, proof=100)

    def new_block(self, proof, previous_hash=None):
        """
        Create a new Block in the Blockchain

        :param proof: <int> The proof given by the Proof of Work algorithm
        :param previous_hash: (Optional) <str> Hash of previous Block
        :return: <dict> New Block
        """

        block = {
            'index': len(self.chain) + 1,
            'timestamp': time(),
            'transactions': self.current_transactions,
            'proof': proof,
            'previous_hash': previous_hash or self.hash(self.chain[-1]),
        }

        # Reset the current list of transactions
        self.current_transactions = []

        self.chain.append(block)
        return block

    def new_transaction(self, sender, recipient, amount):
        """
        Creates a new transaction to go into the next mined Block

        :param sender: <str> Address of the Sender
        :param recipient: <str> Address of the Recipient
        :param amount: <int> Amount
        :return: <int> The index of the Block that will hold this transaction
        """
        self.current_transactions.append({
            'sender': sender,
            'recipient': recipient,
            'amount': amount,
        })

        return self.last_block['index'] + 1

    @property
    def last_block(self):
        return self.chain[-1]

    @staticmethod
    def hash(block):
        """
        Creates a SHA-256 hash of a Block

        :param block: <dict> Block
        :return: <str>
        """

        # We must make sure that the Dictionary is Ordered, or we'll have inconsistent hashes
        block_string = json.dumps(block, sort_keys=True).encode()
        return hashlib.sha256(block_string).hexdigest()

Вышеприведенный код, вероятно, в пояснениях не нуждается — я добавил кое-где комментарии и докстринги, чтобы было понятнее. С представлением блокчейна мы практически закончили. Но сейчас вы, должно быть, задаетесь вопросом, как происходит процесс создания, встраивания и майнинга блоков.

Разбираемся с доказательством работы

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

Чтобы стало яснее, давайте рассмотрим очень простой пример.

Допустим, хэш некоторого числа X, помноженного на другое Y, должен оканчиваться на 0. Соответственно, hash(x * y) = ac23dc…0. Для этого упрощенного примера установим x = 5. Прописываем все это на Python:

from hashlib import sha256
x = 5
y = 0  # We don't know what y should be yet...
while sha256(f'{x*y}'.encode()).hexdigest()[-1] != "0":
    y += 1
print(f'The solution is y = {y}')

Правильный ответ здесь: y = 21; именно при таком значении получается хэш с 0 в конце:
hash(5 * 21) = 1253e9373e...5e3600155e860

В биткойне алгоритм доказательства работы называется HashCash и не особенно отличается от простенького примера, приведенного выше. Это уравнение, которые майнеры наперегонки пытаются разрешить, чтобы создать новый блок. В целом, сложность определяется тем, сколько символов нужно вычислить в заданной последовательности. За верный ответ майнеры получают вознаграждение в виде одной монеты — в ходе транзакции.

Проверить их решение для системы не составляет труда.

Пишем простое доказательство работы

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

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

import hashlib
import json

from time import time
from uuid import uuid4


class Blockchain(object):
    ...
        
    def proof_of_work(self, last_proof):
        """
        Simple Proof of Work Algorithm:
         - Find a number p' such that hash(pp') contains leading 4 zeroes, where p is the previous p'
         - p is the previous proof, and p' is the new proof

        :param last_proof: <int>
        :return: <int>
        """

        proof = 0
        while self.valid_proof(last_proof, proof) is False:
            proof += 1

        return proof

    @staticmethod
    def valid_proof(last_proof, proof):
        """
        Validates the Proof: Does hash(last_proof, proof) contain 4 leading zeroes?

        :param last_proof: <int> Previous Proof
        :param proof: <int> Current Proof
        :return: <bool> True if correct, False if not.
        """

        guess = f'{last_proof}{proof}'.encode()
        guess_hash = hashlib.sha256(guess).hexdigest()
        return guess_hash[:4] == "0000"

Мы можем варьировать сложность этой задачи, меняя количество нулей в начале. Но четырех вполне достаточно. Вы можете сами убедиться, что один-единственный дополнительный нолик значительно замедляет процесс поиска решения.

Работа над классом почти завершена и теперь мы готовы начать взаимодействие с ним при помощи HTTP запросов.

Шаг второй: Блокчейн как API


Здесь мы будем использовать Python Flask — микрофреймворк, который облегчает процесс соотнесения конечных пунктов с функциями Python, что позволяет нам осуществлять диалог с блокчейном по Сети при помощи HTTP запросов.

Создаем три метода:

  • /transactions/new для создания новой транзакции в блоке
  • /mine для майнинга нового блока на сервере
  • /chain для возвращения полной цепочки блокчейна.

Настраиваем Flask

Наш «сервер» сгенерирует один-единственный узел сети в блокчейн-системе. Давайте напишем немного шаблонного кода:

import hashlib
import json
from textwrap import dedent
from time import time
from uuid import uuid4

from flask import Flask


class Blockchain(object):
    ...


# Instantiate our Node
app = Flask(__name__)

# Generate a globally unique address for this node
node_identifier = str(uuid4()).replace('-', '')

# Instantiate the Blockchain
blockchain = Blockchain()


@app.route('/mine', methods=['GET'])
def mine():
    return "We'll mine a new Block"
  
@app.route('/transactions/new', methods=['POST'])
def new_transaction():
    return "We'll add a new transaction"

@app.route('/chain', methods=['GET'])
def full_chain():
    response = {
        'chain': blockchain.chain,
        'length': len(blockchain.chain),
    }
    return jsonify(response), 200

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

Краткие пояснения к тому, что мы добавили:

Строка 15: Инстанцирует узел. Подробнее о Flask можно почитать здесь.
Строка 18: Создает произвольное имя для узла.
Строка 21: Инстанцирует класс Blockchain.
Строки 24-26: Создает конечную точку /mine, то есть запрос GET.
Строки 28-30: Создает конечную точку /transactions/new, то есть запрос POST, так как именно туда мы и будем отсылать данные.
Строки 32-38: Создает конечную точку /chain, который возвращает блокчейн целиком.
Строки 40-41: Запускает сервер на порту 5000.

Конечный пункт для транзакций

Вот как будет выглядеть запрос на транзакцию. Именно это пользователь отсылает на сервер:

{
 "sender": "my address",
 "recipient": "someone else's address",
 "amount": 5
}

Метод класса для добавления транзакции в блок у нас уже есть, поэтому дальше все легко. Давайте напишем функцию для добавления транзакции:
import hashlib
import json
from textwrap import dedent
from time import time
from uuid import uuid4

from flask import Flask, jsonify, request

...

@app.route('/transactions/new', methods=['POST'])
def new_transaction():
    values = request.get_json()

    # Check that the required fields are in the POST'ed data
    required = ['sender', 'recipient', 'amount']
    if not all(k in values for k in required):
        return 'Missing values', 400

    # Create a new Transaction
    index = blockchain.new_transaction(values['sender'], values['recipient'], values['amount'])

    response = {'message': f'Transaction will be added to Block {index}'}
    return jsonify(response), 201

Конечный пункт для майнинга

Именно в этой конечной точке творится вся магия, но ничего особо сложного в нем нет. Она должна делать три вещи:

  1. Рассчитывать доказательство работы
  2. Выдавать майнеру (то есть нам) вознаграждение, добавляя транзакцию, с ходе которой мы получаем одну монету
  3. Встраивать новый блок в цепочку
import hashlib
import json

from time import time
from uuid import uuid4

from flask import Flask, jsonify, request

...

@app.route('/mine', methods=['GET'])
def mine():
    # We run the proof of work algorithm to get the next proof...
    last_block = blockchain.last_block
    last_proof = last_block['proof']
    proof = blockchain.proof_of_work(last_proof)

    # We must receive a reward for finding the proof.
    # The sender is "0" to signify that this node has mined a new coin.
    blockchain.new_transaction(
        sender="0",
        recipient=node_identifier,
        amount=1,
    )

    # Forge the new Block by adding it to the chain
    block = blockchain.new_block(proof)

    response = {
        'message': "New Block Forged",
        'index': block['index'],
        'transactions': block['transactions'],
        'proof': block['proof'],
        'previous_hash': block['previous_hash'],
    }
    return jsonify(response), 200

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

Шаг третий: Диалог с блокчйном


Для взаимодействия с API в рамках системы можно использовать старый-добрый cURL или Postman.

Запускаем сервер:

$ python blockchain.py
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

Давайте попробуем создать блок, отправив запрос GET по адресу localhost:5000/mine:
Теперь создаем новую транзакцию, отправив запрос POST, содержащий ее структуру, по адресу localhost:5000/transactions/new:
Если вы работаете не с Postman, вот как сформулировать аналогичный запрос в cURL:
$ curl -X POST -H "Content-Type: application/json" -d '{
 "sender": "d4ee26eee15148ee92c6cd394edd974e",
 "recipient": "someone-other-address",
 "amount": 5
}' "http://localhost:5000/transactions/new"

Я перезапустил сервер и создал еще два блока, чтобы в итоге получилось три. Давайте изучим получившуюся цепочку через запрос localhost:5000/chain:
{
  "chain": [
    {
      "index": 1,
      "previous_hash": 1,
      "proof": 100,
      "timestamp": 1506280650.770839,
      "transactions": []
    },
    {
      "index": 2,
      "previous_hash": "c099bc...bfb7",
      "proof": 35293,
      "timestamp": 1506280664.717925,
      "transactions": [
        {
          "amount": 1,
          "recipient": "8bbcb347e0634905b0cac7955bae152b",
          "sender": "0"
        }
      ]
    },
    {
      "index": 3,
      "previous_hash": "eff91a...10f2",
      "proof": 35089,
      "timestamp": 1506280666.1086972,
      "transactions": [
        {
          "amount": 1,
          "recipient": "8bbcb347e0634905b0cac7955bae152b",
          "sender": "0"
        }
      ]
    }
  ],
  "length": 3
}

Шаг четвертый: Консенсус


Все это очень здорово. У нас есть простой блокчейн, который позволяет осуществлять транзакции и создавать новые блоки. Но блокчейн имеет смысл только в том случае, если он децентрализован. А если сделать его децентрализованным, как мы вообще можем гарантировать, что везде будет отображаться одна и та же цепочка? Это называется проблемой консенсуса. Если мы хотим, чтобы в системе было больше одного узла, придется ввести алгоритм консенсуса.

Распознаем новые узлы

Прежде чем внедрять алгоритм консенсуса, нам нужно что-то предпринять, чтобы каждый узел в системе знал о существовании соседних. У каждого узла в системе должен быть реестр всех остальных узлов. А значит понадобятся дополнительные конечные точки:

  1. /nodes/register, который будет принимать список новых узлов в URL формате
  2. /nodes/resolve для внедрения алгоритма консенсуса, который будет разрешать возникающие конфликты и отслеживать, чтобы в узле содержалась правильная цепочка.

Нам нужно подкорректировать конструктор блокчейна и обеспечить метод для регистрации узлов:
...
from urllib.parse import urlparse
...


class Blockchain(object):
    def __init__(self):
        ...
        self.nodes = set()
        ...

    def register_node(self, address):
        """
        Add a new node to the list of nodes

        :param address: <str> Address of node. Eg. 'http://192.168.0.5:5000'
        :return: None
        """

        parsed_url = urlparse(address)
        self.nodes.add(parsed_url.netloc)

Заметьте: мы использовали set() для хранения списка узлов. Это нехитрый способ гарантировать, что при добавлении новых узлов будет соблюдаться индемпотентность — то есть сколько бы раз мы ни добавляли какой-то конкретный узел, он будет засчитан только единожды.

Внедряем алгоритм консенсуса

Как я уже упоминал, конфликт происходит тогда, когда цепочка одного узла отличается от цепочки другого. Чтобы его устранить, мы введем такое правило: прерогатива всегда у той цепочки, которая длиннее. Иными словами, самая длинная цепочка в системе рассматривается как фактическая. Используя такой алгоритм, мы достигаем консенсуса среди всех узлов системы:

...
import requests


class Blockchain(object)
    ...
    
    def valid_chain(self, chain):
        """
        Determine if a given blockchain is valid

        :param chain: <list> A blockchain
        :return: <bool> True if valid, False if not
        """

        last_block = chain[0]
        current_index = 1

        while current_index < len(chain):
            block = chain[current_index]
            print(f'{last_block}')
            print(f'{block}')
            print("\n-----------\n")
            # Check that the hash of the block is correct
            if block['previous_hash'] != self.hash(last_block):
                return False

            # Check that the Proof of Work is correct
            if not self.valid_proof(last_block['proof'], block['proof']):
                return False

            last_block = block
            current_index += 1

        return True

    def resolve_conflicts(self):
        """
        This is our Consensus Algorithm, it resolves conflicts
        by replacing our chain with the longest one in the network.

        :return: <bool> True if our chain was replaced, False if not
        """

        neighbours = self.nodes
        new_chain = None

        # We're only looking for chains longer than ours
        max_length = len(self.chain)

        # Grab and verify the chains from all the nodes in our network
        for node in neighbours:
            response = requests.get(f'http://{node}/chain')

            if response.status_code == 200:
                length = response.json()['length']
                chain = response.json()['chain']

                # Check if the length is longer and the chain is valid
                if length > max_length and self.valid_chain(chain):
                    max_length = length
                    new_chain = chain

        # Replace our chain if we discovered a new, valid chain longer than ours
        if new_chain:
            self.chain = new_chain
            return True

        return False

Первый метод valid_chain() отвечает за проверку цепочек на валидность, проходя каждый блок и верифицируя и хэш, и доказательство.

resolve_conflicts() — метод, который прорабатывает все соседние узлы: скачивает их цепочки и проверяет их описанным выше способом. Если при этом найдена валидная цепочка длиннее, чем наша, производится замена.

Давайте введем в наш API две конечные точки, один для добавления соседних узлов, другой для разрешения конфликтов:

@app.route('/nodes/register', methods=['POST'])
def register_nodes():
    values = request.get_json()

    nodes = values.get('nodes')
    if nodes is None:
        return "Error: Please supply a valid list of nodes", 400

    for node in nodes:
        blockchain.register_node(node)

    response = {
        'message': 'New nodes have been added',
        'total_nodes': list(blockchain.nodes),
    }
    return jsonify(response), 201


@app.route('/nodes/resolve', methods=['GET'])
def consensus():
    replaced = blockchain.resolve_conflicts()

    if replaced:
        response = {
            'message': 'Our chain was replaced',
            'new_chain': blockchain.chain
        }
    else:
        response = {
            'message': 'Our chain is authoritative',
            'chain': blockchain.chain
        }

    return jsonify(response), 200

На данном этапе, если хотите, можете привлечь другие машины и насоздавать разных узлов для вашей системы. Или добиться того же используя разные порты на одной машине. Я создал новый узел на другом порте той же машины, и позволил исходному узлу его распознать. Таким образом, получилось два узла: localhost:5000 и localhost:5001.
В узел номер два я добавил побольше блоков, чтобы цепочка получилась однозначно длиннее. После чего вызвал GET /nodes/resolve в первом узле — и алгоритм консенсуса заменил его цепочку на цепочку второго.
Ну, вот и все. Теперь собирайте друзей и тестируйте вам блокчейн совместными усилиями.

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

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

habr.com

Что такое Алгоритм Консенсуса в Blockchain?

В контексте криптовалют, алгоритмы консенсуса являются решающим элементом каждого блокчейна, поскольку они отвечают за поддержание целостности и безопасности этих распределенных систем. Первый криптовалютный алгоритм консенсуса, это Proof of Work (PoW), который был разработан Сатоши Накамото и реализован в Bitcoin, как способ преодоления Византийских ошибок.

Алгоритм консенсуса

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

Прежде чем мы погрузимся в разные типы алгоритмов консенсуса, важно понять различия между алгоритмом и протоколом.

Алгоритм консенсуса vs Протокол

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

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

В то время как протокол определяет правила, алгоритм сообщает системе, какие меры необходимо предпринять для соблюдения этих правил и получения желаемых результатов. Например, алгоритмом консенсуса блокчейн, является то, что определяет валидацию транзакций и блоков. Таким образом, Bitcoin и Ethereum являются протоколами, в то время как Proof of Work и Proof of Stake являются их алгоритмами консенсуса.

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

Другие типы алгоритмов консенсуса

Существует несколько типов алгоритмов консенсуса. Наиболее распространенными являются PoW и PoS. У каждого есть свои преимущества и недостатки, при попытке сбалансирования безопасности, с функциональностью и масштабируемостью.

Proof of Work (PoW)

PoW первый алгоритмом консенсуса, который был создан. Он используется Bitcoin и многими другими криптовалютами. Алгоритм Proof of Work является неотъемлемой частью майнинг процесса.

Майнинг PoW включает в себя многочисленные попытки хеширования, поэтому чем больше вычислительная мощность, тем больше попыток в секунду. Другими словами, майнер с высоким хешрейтом имеет больше шансов найти правильное решение для следующего блока (aka. хеш блока). Алгоритм консенсуса PoW гарантирует, что майнеры смогут только подтверждать новый блок транзакций и добавлять его в блокчейн, если распределенные узлы сети достигают консенсуса и соглашаются с тем, что хеш блока, предоставленный майнером, является подтвержденным proof of work (валидированным доказательством работы).

Proof of Stake (PoS)

В 2011 году в качестве альтернативы PoW был разработан алгоритм консенсуса PoS. Хотя PoS и PoW имеют похожие цели, но представляют некоторые фундаментальные различия и особенности. Особенно во время валидации новых блоков.

В нескольких словах, алгоритм консенсуса Proof of Stake заменяет технологию майнинга PoW механизмом, в котором блоки проверяются в соответствии с долей участников. Валидатор каждого блока (также называемый форжер или минтер) определяется вложенной криптовалютой, а не количеством выделенной вычислительной мощности. Каждая система PoS может реализовать алгоритм по-разному, но в целом блокчейн обеспечивается псевдослучайным процессом выборов, который учитывает богатство узла и возраст монеты (как долго монеты заблокированы или находятся в доле), наряду с фактор рандомизации.

Блокчейн Ethereum в настоящее время основан на алгоритме PoW, но в конечном итоге протокол Casper будет выпущен для переключения сети с PoW на PoS в попытке увеличить масштабируемость сети.

Почему алгоритмы консенсуса имеют значения для криптовалют?

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

Алгоритм консенсуса Proof of Work считается одним из лучших решений Проблем Византийских Генералов, что позволило создать Биткойн как систему их решения. Это означает, что биткойн блокчейн обладает высокой устойчивостью к атакам, таким как атака 51% (или атака большинства). Не только потому что сеть децентрализована, но и из-за алгоритма PoW. Высокие затраты, связанные с процессом майнинга, делают его очень трудным и маловероятным, чтобы майнеры вкладывали свои ресурсы в разрушение сети.

www.binance.vision

Что такое Консенсус в Блокчейне? Алгоритмы консенсуса

 

 

 

Что такое Консенсус?

 

Термин Консенсус (лат. Consensus – согласие) в общем случае трактуется как процесс принятия группой лиц единого решения, достижение согласия по какому-либо вопросу. При этом как такового голосования не проводится – решение принимается на основе отсутствия возражений у большинства участников.

Стоит отметить, что консенсусом называют не только сам процесс принятия решения, но и само принятое в результате такой процедуры решение, то есть результат.

 

Алгоритм консенсуса

 

Тот или иной метод, который используется для принятия решения, называется «механизмом консенсуса» или «алгоритмом консенсуса».

Алгоритм консенсуса имеет следующие цели:

  • Согласование. Достижение максимальной степени согласия всех сторон
  • Эгалитаризм. Соблюдение равноправия, равенство всех участников
  • Кооперирование. Участники заинтересованы работать сообща
  • Инклюзивность. В процессе достижения консенсуса должно участвовать максимальное количество участников

 

Консенсус в блокчейне

 

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

Как известно, первой криптовалютой, в основе которой лежит технология блокчейн, является Биткоин. Однако и до его появления было достаточно много попыток разработки одноранговых децентрализованных платежных систем, но все они потерпели неудачу, главным образом, из-за неспособности решить основную проблему достижения консенсуса. Эта проблема получила название «задача византийских генералов». Более подробно о ней читайте в статье по ссылке.

Современные механизмы консенсуса в блокчейне основаны именно на данной криптографической задаче.

Для применения в отношении криптовалют принципы «византийской» задачи были несколько скорректированы и адаптированы под работу в P2P-сети.

Применяя данную задачу к блокчейну можно выделить следующие моменты:

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

 

Функции механизмов консенсуса в блокчейне

 

  • Частота генерации новых блоков. Благодаря данным алгоритмам исключаются ситуации, каждый узел генерирует свой блок и записывает его в блокчейн. К примеру, в сети Биткоин блоки генерируются каждые 10 минут. Однако иногда возникают ситуации, когда два или более узлов генерируют блок практически одновременно, с разницей в долях секунды. В этом случае возникает конфликт, который разрешается в пользу узла, раньше всех создавшего блок. Транзакции, которые входили в конкурентный блок или блоки, помещается в список неподтвержденных транзакций, и отрабатываются в следующем блоке.
  • Проверка информации в блоке. Все участники должны подтвердить, что данные в сгенерированном блоке верны. Проверке подлежат хеши транзакций как текущего, так и предыдущего блока, а также корректность подбора числа nonce.
  • Размер вознаграждения. Размер вознаграждения зависит от сложности сети, причем, как это ни парадоксально в обратной пропорции.
  • Недопущение двойного списания средств. Например, в сети Биткоин при проведении транзакции в блокчейн направляются все средства. После этого необходимая сумма перечисляется получателя, а остаток возвращается отправителю.

 

Основные алгоритмы консенсуса в блокчейне

 

Все перечисленные механизмы консенсуса имеют свои преимущества и недостатки. Ознакомится с каждым из них вы можете по ссылкам.

Самыми распространенными в настоящее время являются два алгоритма — Proof-of-Work и Proof-of-Stake. Другие механизмы находят применение в намного меньшем количестве криптовалютных платформ. Это связано с их относительным малым возрастом, и, соответственно, не в полной мере отработанными технологиями.

blockchaindesk.ru

PoW, PoS и другие |

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

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

Блокчейн позволяет упорядочивать и верифицировать транзакции в распределённом реестре и, в конечном счёте, обеспечивает достоверную запись истории.

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

Происхождение доказательства выполнения работы

Задача обеспечения надёжности в децентрализованных системах впервые была сформулирована в научной статье «Задача византийских генералов», опубликованной ещё в 1982 г. В созданной авторами иллюстрации византийская армия, атакующая город, полностью его окружила. Для дальнейшего продвижения генералы, разбросанные по периферии города, должны договориться о плане битвы. Но тогда как часть генералов хочет продолжать наступление, другие хотят отступить. И всё осложняется тем, что генералы так далеко находятся друг от друга, что сообщения приходится передавать через гонцов, причём один или больше генералов могут также оказаться предателями, намеревающимися саботировать ситуацию.

Может ли армия при таком сценарии реализовать какую-нибудь стратегию?

Да, может, но для этого выбранную стратегию должно поддержать большинство (т. е. 51% или больше генералов).

Данная задача византийских генералов аналогична решению задач консенсуса в блокчейне. Все узлы должны достичь согласия касаемо определённого набора правил и далее быть в состоянии достигать согласия по конкретной оценке информации о транзакциях перед её добавлением в блокчейн. Это непросто – сетью пользуются тысячи людей, и необходимо удостовериться, что они достигнут согласия насчёт действительности новой добавляемой информации, и что злоумышленники не смогут саботировать реестр и переписать историю. Поэтому необходимо принять определённый механизм/алгоритм консенсуса. Такой протокол делает возможной слаженную работу участников сети по безопасному обновлению реестра.


По словам создателя Ethereum Виталика Бутерина, цель алгоритма консенсуса – «сделать возможным безопасное обновление состояния согласно определённым правилам смены состояний, где право производить смену состояний распределено между определённым экономическим множеством».

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

Первый алгоритм консенсуса, появившийся в криптовалютную эру благодаря блокчейну Биткойна, – это «доказательство выполнения работы» (Proof-of-Work, PoW). PoW требует, чтобы каждый участвующий в подтверждении пользователь доказал выполнение им вычислительных действий, чтобы предотвратить атаку на сеть в виде спама или DoS-атак. Каждый узел пытается решить сложные криптографические задачи, используя собственные вычислительные ресурсы, – тот, кто найдёт решение, получает право подтвердить транзакции и записать блок в блокчейн. Это значит, что узлы (также известные как майнеры) соревнуются друг с другом за создание следующего блока транзакций в блокчейне. Майнер-победитель, в свою очередь, получает криптовалютные токены в качестве вознаграждения за потраченные на поиск решения время и энергию. К примеру, майнеры Биткойна получают вознаграждения в биткойнах. Такая система вознаграждений мотивирует майнеров генерировать верное решение и обеспечивает безопасность сети. При этом, только что созданные монеты добавляются в обращение.

Основные недостатки PoW

Учитывая интенсивное использование майнингом вычислительных ресурсов, PoW считают затратным, расточительным и неэффективным. Работа каждый раз тысяч майнеров над единственным решением – это чрезмерное использование ресурсов, особенно ввиду того, что впоследствии ценность имеет лишь тот блок, в котором было найдено решение. Следовательно, с каждым новым добытым блоком накапливается масса практически бесполезных побочных продуктов.

Более того, майнинг – дело дорогостоящее. По некоторым оценкам, стоимость всего электричества, ежегодно уходящего на майнинг Биткойна, составляет порядка $500 млн. В одном исследовании всё энергопотребление майнинга Биткойна даже сравнили со средним потреблением электричества Ирландии. И это только Биткойн – есть масса новых криптовалют, использующих ту или иную разновидность алгоритма PoW.

Кроме того, в процессе майнинга, как правило, используется продвинутое и дорогое фирменное оборудование. В результате майнеры массово скупают это оборудование, что, в свою очередь, привело к активным разработкам производителями максимально продвинутого специализированного аппаратного обеспечения для майнинга. Возьмём, к примеру, интегральные схемы специального назначения (ASIC) – высокоспециализированное оборудование, специально разработанное для майнинга Биткойна и других криптовалют. Хотя ASIC существенно улучшают эффективность процесса майнинга, уникальный характер такого нишевого оборудования делает его достаточно дорогим. Разработки ASIC сейчас в значительной степени сосредоточены в Китае – стране, где электричество также сравнительно дёшево. Так как китайские производители ASIC существенно мотивированы просто майнить биткойны для себя – и действительно это делают, – это привело к тому, что, по оценкам, 60-70% всей вычислительной мощности Биткойна сосредоточено в этой единственной стране.

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

Доказательство доли владения (Proof-of-Stake, PoS)

Появление PoS в 2012 г. в виде проекта Peercoin было попыткой решить вышеупомянутые проблемы затрат, эффективности и уязвимости к централизации, связанные с доказательством выполнения работы. Основной принцип таков, что вместо покупки дорогого компьютерного оборудования, чтобы майнить блоки быстрее конкурентов, каждый «подтверждающий» узел сети покупает монеты, используемые в той или иной блокчейн-системе.

В алгоритме PoS токены выдаются подтверждающим узлам в самом начале существования сети. То есть, в отличие от PoW, с добавлением в реестр новых блоков токены не создаются (хотя есть блокчейны, использующие гибридный алгоритм PoW/PoS, допускающий майнинг PoW с последующим переходом к PoS). Каждые несколько секунд или минут выбирается узел, записывающий новый блок. Но чем больше у узла монет, тем больше его вес в определении того, что в реестре считается истиной. Следовательно, на выбор сильно влияют те, у кого больше всего монет, – чем больше они инвестировали в сеть, тем больше могут потерять, если что-то пойдёт не так. Ещё один влияющий фактор – время владения монетами, что указывает на то, инвестировал ли пользователь долгосрочно, – что явно более желательная позиция, чем кто-то, кто купил монеты лишь вчера.

Таким образом, те, чья доля в сети больше, считаются более надёжными и менее склонными атаковать сеть. Чтобы осуществить атаку, пользователю понадобилось бы купить 51% монет всей сети. Это дорого и бессмысленно – у пользователя нет мотивации атаковать сеть, в которую он столько вложил. Атаковать самого себя – явно нелогично. (Прим.ред.: Примечательно, что та же самая аргументация применима и к майнерам PoW. Вложившись в дорогостоящее оборудование, у них нет мотивации атаковать сеть, роняя цену монеты, которую они же и добывают).

Кроме того, PoS часто отдают предпочтение над PoW, так как вычислительной работы здесь требуется значительно меньше, а значит, это не так трудоёмко и расточительно. А так как вычислений меньше, то и затраты на PoS значительно ниже. Это устраняет главный барьер входа для тех, кто желает стать валидатором блоков. Отсутствие требований майнинга просто устраняет потребность в разработке специализированного оборудования. Вместо этого технология запросто может работать на обычных пользовательских компьютерах.

Проблема «ничего на кону»

Одна из чаще всего упоминаемых проблем доказательства доли владения известна как «ничего на кону». В блокчейнах с PoW существует стимул продолжать майнить в самой длинной цепочке реестра, поскольку эта цепочка будет считаться главной версией истины и той, которая даёт майнерам их вознаграждения. Таким образом, майнеры явно мотивированы майнить в этом единственном блокчейне.

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

Данная проблема особенно актуальна, когда в блокчейне происходит форк (как в случае Ethereum, от которого ответвился Ethereum Classic). В таких ситуациях валидаторы, использующие PoS, могут сделать ставки в обоих блокчейнах, вследствие чего становится проще изменить истину в их пользу и получить прибыль. Отчасти для решения этой проблемы Ethereum сейчас переходит с PoW на новую стратегию консенсуса под названием Casper, которая использует алгоритм PoS. Переход должен сделать обработку новых блоков в блокчейне намного более эффективной, причём будет использоваться механизм, наказывающий участников, пытающихся делать ставку в двух разных блокчейнах. Многие крупнейшие криптовалюты одна за другой представляют дальнейшие совершенствования модели PoS.

В числе самых популярных – алгоритм делегированного доказательства доли владения (Delegated Proof of Stake, DPoS), разработанный Дэном Ларимером, движущей силой нескольких высококлассных блокчейн-проектов, включая BitShares, Steemit и EOS. DPoS отличается от PoS тем, что процесс валидации выполняет группа делегатов, избранных пользователями сети и имеющих отдельные узлы для майнинга блоков. Поскольку эти делегаты считаются надёжными, это частично решает проблему «ничего на кону». А популярная китайская платформа NEO использует алгоритм под названием делегированная византийская отказоустойчивость (Delegated Byzantine Fault Tolerance), которая применяет процесс делегированного голосования для предотвращения раскола блокчейна надвое. Ripple, между тем, использует собственный «реестр консенсуса», позволяющий определять истину в системе не технологии, а участникам и истории. И продолжает появляться множество других алгоритмов консенсуса, каждый из которых решает уникальные проблемы того или иного применения блокчейна:

Обзор механизмов распределённого консенсуса

Нажмите, чтобы увеличить.
Перевод инфографики: bitnovosti.com / источник

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

Источник

Поделиться ссылкой:

Related

bitnovosti.com

Обзор: алгоритмы консенсуса в блокчейне

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

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

Proof-of-Work (PoW) был первым успешным децентрализованным алгоритмом консенсуса в блокчейне. PoW используется в Bitcoin, Ethereum (Ethereum планирует перейти на Proof-of-Stake), Litecoin, ZCash, Monero и на многих других платформах. Самый известный алгоритм работает следующим образом: в начале пользователи сети отправляют друг другу цифровые токены, затем все произведенные транзакции собираются в блоки и записываются в распределенный открытый реестр — блокчейн.

В PoW все транзакции доказываются с помощью трудных математических вычислений, достоверность которых может перепроверить любой пользователь сети. Май­не­ры ре­ша­ют за­да­чу, фор­ми­ру­ют новый блок и под­твер­жда­ют тран­зак­ции. За­да­чи с каждым разом становятся сложнее, так как ко­ли­че­ство поль­зо­ва­те­лей растет, и на­груз­ка на сеть становится больше. Хэш каж­до­го блока со­дер­жит хэш — выходные данные преды­ду­ще­го блока. Это по­вы­ша­ет без­опас­ность системы, и порядок созданных блоков нарушить невозможно. Пользователь должен первым правильно определить «nonce» — число, добавленное в конец строки для того, чтобы создать хеш, который начинается с необходимого количества нулей. Если май­нер сумел ре­шить за­да­чу, фор­ми­ру­ет­ся новый блок: в нем раз­ме­ща­ет­ся оче­ред­ной ком­плект тран­зак­ций, и они счи­та­ют­ся под­твер­жден­ны­ми.

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

Этот алгоритм является честным и понятным, ему можно доверять. Однако у PoW есть главный недостаток — потребление огромного количества энергии. В 2017 году на полное оформление одной транзакции в системе Bitcoin требовалось затратить в среднем 163 кВт/ч энергии. Таким количеством энергии можно в течение пяти с половиной дней полностью обеспечивать нужды семьи из трех человек, проживающей в небольшом одноэтажном доме. Кроме того, те майнеры, которые обладают более быстрыми и мощными ASIC, получают больше, чем остальные. В результате этого биткоин оказывается не таким децентрализованным, как задумывалось изначально.

Proof-of-Stake во всех реализациях для проверки транзакций требует от участников доли части монет, которые они хранят в сети. PoS является альтернативным механизмом PoW, впервые реализованным в 2012 году в криптовалюте PPCoin (переименована в PeerCoin). Идея Proof-of-Stake заключается в решении проблемы Proof-of-Work, связанной с большими затратами на электроэнергию.

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

Валидаторы ставят свои монеты на транзакции путем блокировки монет. Микшер, который используется для завершения блока, выбирается пропорционально значению, поставленному в сети. Proof-of-Stake предотвращает плохое поведение в сети с помощью перекладывания полномочий по проверке на самых активных и интересующихся пользователей. Алгоритм консенсуса доказательства владения доли используется в Peercoin, Decred и вскоре будет функционировать на Ethereum, в котором заранее прописывался переход с одного алгоритма на другой.

Делегированное подтверждение доли Delegated proof-of-stake (DPoS), которое было разработано Дэниелом Ларимером в 2014 году, только внешне похоже на имя Proof-of-stake, ведь детали реализации двух алгоритмов существенно отличаются друг от друга. В DPoS вместо ставки на монеты для проверки транзакций держатели токенов в ходе голосования выбирают валидаторов транзакций, которые будут формировать блоки. Вес каждого голоса определяется суммой активов голосующего. Держатели монет, в случае сомнений, могут перевыбирать кандидатов. Благодаря этому можно достичь высокой устойчивости сети. Если большая часть исполнителей вышла из строя, то сообщество тут же проголосует за их замену.

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

DPoS используется Steemit, EOS и BitShares. Новый крипто-проект Minter от блокчейн-сообщества DeCenter основан на алгоритме консенсуса делегированного подтверждения доли.

Византийская отказоустойчивость (Byzantine fault tolerance) носит весьма технический характер (как и другие консенсусные алгоритмы). Целью BFT является установление доверия между несвязанными сторонами сети. Концепция данного алгоритма консенсуса была представлена в научной работе Лесли Лэмпорта, Роберта Шостака и Маршала Писа еще в 1982 году.

BFT позволяет валидаторам совершать быстрые транзакции, управлять каждым состоянием сети и обмениваться сообщениями друг с другом, чтобы получить правильную запись транзакции и обеспечить честность. Данный алгоритм реализуется компанией Ripple, где валидаторы предварительно выбираются фондом Ripple, и Stellar, где любой может быть валидатором — доверие устанавливается сообществом. В отличие от блокчейнов, основанных на PoW, блокчейны BFT не подвергаются нападению, если только сами пользователи сети не координируют атаку. BFT считается выгодным алгоритмом, поскольку он масштабируем и охватывает транзакции с низкой стоимостью, но, как и DPoS, внедряет компонент централизации.

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

Например, сейчас набирают популярность направленные ациклические графы Directed acyclic graph (DAG), и, возможно, в ближайшем будущем будут активно использоваться в блокчейн-проектах, потому что они могут выступить в качестве потенциального решения проблем, связанных с масштабируемостью. DAG — ори­ен­ти­ро­ван­ный граф с дан­ны­ми на основе то­по­ло­ги­че­ской сор­ти­ров­ки. Его раз­ви­тие идет толь­ко в одном на­прав­ле­нии — от ран­них блоков к поздним. Из-за без­блоч­но­го устрой­ства все тран­зак­ции совершаются в сетях DAG, поэтому этот про­цесс за­ни­ма­ет на­мно­го мень­ше вре­ме­ни, чем в слу­чае блок­чей­нов, ос­но­ван­ных на PoW и PoS. В сети DAG нет май­не­ров. Под­твер­жде­ние осуществляется непо­сред­ствен­но в самих тран­зак­ци­ях, поэтому сдел­ки про­хо­дят почти мгно­вен­но.

Интересным с точки зрения экономики платформы является Proof-of-Importance (PoI). Алгоритм консенсуса используется в блокчейне NEM. Значимость каждого пользователя в сети определяется количеством средств, имеющихся у него в кошельке, и количеством проведенных транзакций. В отличие от PoS, который учитывает сумму имеющихся средств у пользователя, PoI принимает в расчет количество средств и активность пользователя в блокчейне. Такой подход побуждает активно использовать те средства, которые хранятся на счете.

Большинство платформ, несмотря на обилие алгоритмов консенсуса, по-прежнему используют Proof-of-Work, Proof-of-Stake и их модификации. Одним из наиболее оптимальных является алгоритм консенсуса Delegated Proof-of-Stake, плюсы которого заключаются в увеличенной скорости подписания блоков и большей энергоэффективности за счет ограниченного количества подписантов.

В настоящее время алгоритмы консенсуса должны находить компромисс между масштабируемостью и степенью централизации. Остается лишь наблюдать за тем, как механизмы приспособятся к реалиям, а сообщества адаптируются к внедрению технологических разработок. Кто сможет лучше всех остальных простимулировать широкомасштабное участие и стабильное управление проектов — покажет время.

Адаптация материала с Hackernoon.

decenter.org

Обновлено: 03.08.2019 — 05:15

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *