---
tags: stepik-blockchain-kolotov
title: Блокчейн. Часть 1
---
# Недостатки централизованных систем (1001)
На данный момент блокчейн лучше всего подходит для криптовалют.
- Имеется возможность подменить данные
- **Пример:** Приходит человек в банк, а на его счету 0 копеек, логи чистые, и никто ничего не сможет доказать
- В случае некорректных его действий падает фактор доверия
- **Пример:** Блокировка всего и всех счетов из-за долга в 1 копейку на длительный период
## Возможное решение проблемы
Хранение информации обо всех транзакциях у всех участников системы
- Решаемые проблемы
- Нелегитимные блокировки счетов
- Возникающие проблемы:
- Проблема консенсуса при синхронизации истории
- Массовая подмена данных
### Возможные модификации
1. Хранение в транзакции ссылок на предыдущую транзакцию
- Позволяет быстро перейти из текущей транзакции в предыдущие
- Создает возможность удаления транзакции подменой ссылки на предыдущую транзакцию
2. Подписывать каждую транзакцию цифровой подписью
- Обеспечивает неизменность транзакции, т.к. при подмене ссылки на предыдущую транзакцию изменится хэш и цифровая подпись станет нелегитимной и потребуется переподписание
- Не решает проблему подмены данных при массовом сговоре
## Предложение Сатоши Накомото
Тезисы:
- Вместо использования ссылок на прошлые блоки использовать хэши этих блоков
- Для подмены или удаления транзакции придется изменить все последующие транзакции и прийти к консенсусу
- Для каждой транзакции должно быть подобрано такое число $nonce$ (соль), чтобы хэш транзакции, к которой приклеили этот $nonce$, удовлетворял определенному условию (например, $nonce \leqslant D$, где $D$ -- Difficulty *(сложность)*) -- так называемый *Proof of Work*
- Для изменения цепи придется пересчитывать каждую транзакцию и перебирать $nonce$ отдельно для каждой транзакции
# Отличия Биткоина от Эфириума
- Биткоин оперирует хэшами транзакций
- Изменение состояния баланса на адресах пользователей описывается транзакциями
- **Например**: Пользователю A пришло 50 шекелей в транзакции 01. Он хочет перевести пользователю B 10 шекелей, и потому создает 2 транзакции: перевод 10 шекелей пользователю B и перевод 40 шекелей себе (пользователю A)
- Возмонжо отследить хождение конкретных монет. **Например:** кто-то выделил грант в 50 шекелей, и хочет убедиться, что расход был целевым. С помощью такой избыточности информации он может проследить полное хождение этих 50 шекелей по кошелькам.
- Транзакции, монеты которых не были потрачены, хранятся в Unspent Transaction Output *(UTXO-лист)*
- Ethereum оперирует конкретными балансами
- Каждая транзакция имеет данные об отправителе, получателе и сумме
- Невозможно отследить хождение конкретных монет
- Проверка доступности монет проходит проверкой всех предыдущих транзакций
# Блок
## Основная информация
- Является собранием некоторого количества транзакций (лимитировано размером блока)
- Размер транзакции зависит от ее типа. **Например:** Из 1 транзакции создается несколько транзакций.
- Difficulty задается и Nonce просчитывается для блока, а не для конкретной транзакции
- При вычислении хэша вычисляется хеш только заголовка
- Блоки связаны друг с другом хешами (создается цепочка блоков -- Block-Chain)
- В BTC -- чистый SHA3
- В ETH -- keccak256
## Merkle Root и Merkle Tree
### Merkle Root
Поле в заголовке блока, которое содержит хэш всех транзакций, входящих в блок
### Merkle Tree
- Древовидная структура, в каждой вершине которой хранится хэш от суммы хэшей детей.
- Конкатенация и хэширование производится на каждом уровне из одной стороны в другую. Если блоку не досталось пары, попытка задействовать его будет предпринята уровнем выше. В худшем случае оставшийся блок будет объединен с хэшем, группирующим остальные вершины.
- Значение, хранящееся в корне дерева, и называется *Merkle Root*
### Предназначения
1. Прохэшировать все транзакции в блоке (найти *Merkle Root*)
2. Нахождение блока, в котором находятся транзакция
### Little и Big Endian
- **Big Endian** -- байты записываются в порядке убывания номера разряда
- $10 = 00 00 00 0A_{16}$
- $258 = 00 00 02 00_{16}$
- **Little Endian** -- байты числа записываются в порядке возрастания номера разряда
- $10 = 0A 00 00 00_{16}$
- $258 = 00 02 00 00_{16}$
# Адрес
1. При регистрации вам присвается рандомный *Secret Key* $K$ *(размерность - 256 бит)* -- число в интервале $[1; 2^{256} -1]$, говорящее о том, что вы являетесь владельцем счета
2. С помощью произведения на Eliptic Curve точки $G$ (определенной для всей сети) на приватный ключ $K$ и получаем точку $P$ *(размерность - 256 бит)*, являющаяся *Public Key*.
3. От публичного ключа берется хэш, а от него последние 20 байт. Это -- адрес в блокчейн-сети
- В Bitcoin конечный результат кодируется в Base58, тем самым возможно подобрать такое $K$, чтобы конечный адрес был похож на какое-либо слово
# Цифровая подпись
Имеется 2 функции:
- `sign(msg, K) -> S` *($msg$ -- сообщение (в данном случае о транзакции), $K$ -- секретный ключ, $S$ -- подпись)* -- фукнция, возвращающая цифровую подпись сообщения $msg$
- `verify(msg, P, S) -> bool` *($msg$ -- сообщение, $P$ -- публичный ключ, $S$ -- подпись)* -- функция, проверяющая валидность цифровой подписи
Транзакция представляет из себя сообщение, в котором говорится, напримиер, "перевожу 20 шекелей клиенту B", подписанное подписью клиента A.
# Майнинг, и для чего он нужен. Консенсус
## Сокращения
- **Транзакция** -- *(TX)*
- **Блок** -- *(BLOCK)*
- **История блока** -- *(HISTORY)*
Алгоритмы консенсуса нужны для определения правильности TX, BLOCK и HISTORY для всех узлов
## Действия каждого узла для достижения консенсуса при формировании блоков
1. Проверка TX на валидность
- Все поля заполнены верно
2. Включение TX в BLOCK
- Все TX проверяются на возможность этой TX *(напр., проверка на доступность средств, )*
3. Проверка BLOCK на валидность
- Отсутствие транзакций, уже включенных в другой блок
4. Каждый узел пытается подобрать nonce для своего блока (в каждом из которых свой список транзакций). В совокупности параметров (производительность, множество транзакций в блоке) достигается псевдослучайность выбора узла, выпускающего блок
5. Блок распространяется по остальными узлам, они проверяют блок и начитают подбирать следующий
## Репутация сети
Основная цель **майнинга**, генерации блоков за вознограждение -- экономическая мотивация майнеров генерировать блоки и обеспечивая транзакциим
В случае выпуска майнером *плохого* блока (его не признали, он не валиден) единственный метод наказания -- отвержение блока и, тем самым, затраты энергии идут на смарку.
В случае атаки 51%, попытокк махинировать с транзакциями остальные участники сети видят, что он мухлюет, они могут покинуть сеть и, при сбыте монет, обвалить курс и обесценив усилия махинатора
## Ограниченность ресурсов Bitcoin
В начале работы сети BTC вознограждение за майнинг было 50 BTC/block.
В 2012 -- 25 BTC/block;
В 2016 -- 12,5 BTC/block;
В 2020 -- 6,25 BTC/block;
В итоге каждые 4 года вознограждение за майнинг уменьшается в 2 раза и к 21хх году награждение дойдет до 0.
# Теорема CAP в теории баз данных
**Consistancy -- Availiability -- Perfomance**
Оба 3 составляющие совместить невозможно, только 2 из них
## Методы достижения
### Доступность
- Регулируется частота выпуска блока (BTC -- раз в 15 минут, в ETH -- 20 секунд)
- Страдает Perfomance, т.к. скорость транзакций в среднем 6-7 в секунду (BTC)
# Ветвление и кластеризация
Из-за несвязности графа сети может произойти ситуация, в которой две удаленные ноды выпускают блок n, и при его распространении нужно решить, какой правилен. Это явление называется **fork**, или *ветвление*.
## Консенсус в Bitcon
Для решения данной проблемы принимается решение отложить вынесение вердикта, и по итогу часть сети начинает работать на одной ветви, другая -- на второй.
Когда наступает ситуация, что одна из нод знает, что в одной ветви - 2 блока, в другой 1, то она принимает за основную ветвь более длинную, и таким образом распространяется ветвь, в которой больше блоков.
**Правило:** мы продолжаем более длинную цепочку, а кроткую -- отбрасываем.
## Консенсус в Ethereum
**Правило**: *GHOST* -- обнаружение наиболее тяжелых цепочек.
До принятия консенсуса каждый блок знает о своем отце *(блок, от которого он порожден)* и дядях *(блоки, которые имеют номер n-1)*.
**Тяжелая цепочка** -- цепочка, у которой наибольшее число *uncle*-блоков. За каждый *Uncle*-блок, который был отброшен, майнеры получают часть награды в качестве экономической мотивации из-за большой частоты
## Новомодоные и сырые методы достижения консенсуса
1. Offchain-транзакции (*Lightning Network AKA Raiden Network*)
- Контролируются *Payment-channel*
- Применяется при наличии доверительных отношений
- Первая часть полной транзакции -- внесение депозита в одной транзакции
- С течением времени человек, который внес депозит, передает уведомления об оказании услуг
- При прекращении прихождения уведомлений прекращается оказание услуг
- Депозит возвращается за вычетом уведомленного
2. Sharding
- Устанавливается какое-то условие, по которому пользователи сети делятся, и в соответтсвии с этим делением пользователи обслуживаются определенными шардами (кластерами)
3. Plasma
- Имеется несколько блокчейнов для разных нужд, и они взаимодействуют друг с другом
## Альтернативные способы принятия решений о формирвоании истории блоков
- **Proof of Stake**
- Решение о выпуске могли принимать только системы, имеющие некоторый баланс
- Это экономически мотивирует принимать правильные решения, т.к. в обратом случае обесценивается имеющийся у него баланс
- **Невозможен при пустом блокечейне**, обязательно один блок должен быть выпущен и выплачена за него награда (если блокчейн не предусматривает другого)
- PoS экономи ресурсы (электроэнергию, компьютерные часы)
- **Proof of Authority** *(доказательство правды)*
- Используется в блокчейнах с ограниченным количеством участников
- Заранее определены узлы, имеющие право майнить
- Происходит монополизация управления блокчейном у определенных узлов
# Основные тезисы
1. Блокчейн -- база данных
- Простейшая единица записи -- транзакция
- Между транзакциями имеется криптографически защищенная числом *nonce* связь на основе хэшей с определенными свойствами
2. Криптография на математике элептических кривых
- Используется пара ключей -- private и public
- Публичный ключ формирует адрес в блокчейн-сети
- Публичный ключ -- производная от приватного (*public* = *точка на элептической кривой* \* *private key*)
3. Базовые примитивы
- Блок -- группа транзакций
- **Merkle Tree** позволяет в заголовке блока хранить хэш от транзакций
- Хэш блока организует связь между блоками
- Хэш блока должен быть меньше, чем число *difficulty*
4. Скорость распространения информации
- Уменьшение количества транзакций в блоке приводит к дестабилизации блокчейна
- Майнер строит и валидирует цепочку блоков
- Майнер за качественную работу получает соответсвующее вознаграждение
5. Консенсус - путь к согласию об установке единой истории состояния блокчейна
- BTC: Определение самой длинной цепочки
- ETH: Определение самой тяжелой цепочки алгоритмом GHOST
- Алтернативные методы
- Proof of Stake -- право выпускать блок в соответствии с имеющейся долей в сети
- Proof of Authority -- моноползиация права на выпуск блоков определенными узлами