Проблема консенсуса: кто решает, что верно

Главный вопрос децентрализованной сети: как тысячам незнакомцев без начальника договориться об одной общей истории?

«Согласие без главного — это не магия, а набор честных правил, которые невыгодно нарушать.»

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

Проблема двойной траты

Представь, что у Ани есть одна монета. Она почти одновременно отправляет её и Боре, и Васе. Какая транзакция настоящая? В мире без центра это серьёзная угроза — двойная трата (double spending). Если сеть не договорится, один и тот же актив можно потратить дважды, и доверие рухнет.

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

Как работает под капотом

        Конфликт без консенсуса

   Аня (1 монета)
      |--> tx1: Аня -> Боря (1 монета)
      |--> tx2: Аня -> Вася (1 монета)

   Сеть должна выбрать ОДНУ как настоящую.
   Консенсус решает, какая попадёт в блок,
   а вторая будет отвергнута как недействительная.

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

Попробуй сам ▶ Запусти код прямо здесь — он работает в браузере:

# Очень упрощённая защита от двойной траты.
balances = {'Аня': 1, 'Боря': 0, 'Вася': 0}
spent = set()  # какие монеты уже потрачены (по отправителю)

def apply(tx):
    sender, receiver, amount = tx
    if balances.get(sender, 0) < amount:
        return 'отклонено: недостаточно средств'
    if sender in spent:
        return 'отклонено: двойная трата!'
    balances[sender] -= amount
    balances[receiver] += amount
    spent.add(sender)
    return 'принято'

print('tx1', apply(('Аня', 'Боря', 1)))
print('tx2', apply(('Аня', 'Вася', 1)))  # та же монета
print('Балансы:', balances)

Каким должен быть хороший консенсус

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

Частые заблуждения

  • «Консенсус — это голосование людей». Нет, это автоматические правила, которые исполняют программы-узлы.
  • «Двойную трату невозможно даже попытаться». Попытаться можно, но сеть отвергнет вторую транзакцию.
  • «Все блокчейны используют один и тот же консенсус». Их много: proof-of-work, proof-of-stake и другие — у каждого свои компромиссы.

Важно понимать (риски)

Любой консенсус — это компромисс между безопасностью, скоростью и децентрализацией (это называют «трилеммой»). Улучшая одно, обычно жертвуешь другим. Когда тебе обещают блокчейн «быстрый, дешёвый, децентрализованный и абсолютно безопасный одновременно», стоит насторожиться: чудес не бывает, где-то спрятан компромисс. В следующих уроках мы разберём два главных подхода и увидим их цену.

Византийские генералы: классическая аналогия

У проблемы консенсуса есть знаменитая иллюстрация — «задача византийских генералов». Несколько армий окружили город, и их генералы должны договориться: атаковать всем вместе или всем отступить. Если ударит только часть — они проиграют. Беда в том, что гонцы между лагерями могут опаздывать, теряться, а некоторые генералы и вовсе могут быть предателями, рассылающими противоречивые приказы. Как честным генералам прийти к единому решению в таких условиях?

Блокчейн решает ровно эту задачу для компьютеров: как сети честных узлов согласовать единую историю, если связь ненадёжна, а часть участников может действовать злонамеренно. Решение, устойчивое к таким «предателям», называют византийской отказоустойчивостью. Proof-of-Work и Proof-of-Stake — это два разных способа достичь её, делая нечестное поведение либо слишком дорогим, либо прямо убыточным. Понимая эту аналогию, легче увидеть, что блокчейн — не про деньги как таковые, а про согласие в недоверчивой среде.

Итоги

  • Консенсус решает, как узлы без начальника договариваются об общей истории.
  • Главная угроза — двойная трата одного актива.
  • Хороший консенсус устойчив к обману, согласован и живуч.
  • Любой консенсус — компромисс между безопасностью, скоростью и децентрализацией.
Проверьте себя
1. Что такое двойная трата?
AСлишком высокая комиссия
BПопытка потратить один и тот же актив дважды
CОтправка денег не на тот адрес
DДвойное хеширование блока
2. Что описывает «трилемма блокчейна»?
AТри типа кошельков
BКомпромисс между безопасностью, скоростью и децентрализацией
CТри вида хешей
DТри уровня комиссий