Разработчик криптографических протоколов и децентрализованных систем

Весна 2021

Цель курса — Подготовить квалифицированных разработчиков децентрализованных систем. Дать полное представление обо всех аспектах разработки децентрализованных систем: от базовых основных алгоритмов до архитектур конкретных проектов, методик разработки и аудита. С академической точки зрения курс находится на пересечении следующих IT-дисциплин: алгоритмы и структуры данных, криптография, базы данных, компьютерные сети, компиляторы и виртуальные машины, информационная безопасность.
 

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


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

Преподаватели

Сергей Прилуцкий Сергей Прилуцкий

Бывший ведущий разрабочик в Антиспаме@Mail.Ru, сейчас один из сооснователей компании MixBytes.io,...


Подробнее

Алгыс Иевлев Алгыс Иевлев

Cистемный разработчик C++, победитель олимпиад, разработчик имеющий признанный и проверенный опыт...


Подробнее

Программа

занятие Часы в ауд. + сам. работа

Лекция №1: Введение в блокчейн-технологии  
+ ДЗ №1

  • историческая справка
  • верхнеуровневое описание базовых криптоалгоритмов:
    • хеширование и обеспечение целостности и идентификации информации
    • public key infrastructure, ЭЦП, цифровое право владения информацией, криптографические доказательства
  • multiparty протоколы, распределенные БД
    • проблемы репликации, commit-rollback, write ahead log
  • задача ведения полностью криптографически верифицируемой БД
    • валидаторы, пользователи, транзакции, блоки транзакций
  • сцепление блоков при помощи хеширования, ветвления, проблема выбора основной цепочки
  • верхнеуровневое рассмотрение архитектуры Bitcoin
    • подпись транзакций
    • процессинг транзакции
    • state database
    • выбор цепочки
  • усложнение транзакций, верхнеуровневое рассмотрение сети Ethereum
    • процессинг сериализованных вызовов, детерминизм результатов, ограничения на ресурсы
  • общий паттерн работы блокчейн-сети со смарт-контрактами
Домашнее задание №1: ДЗ1 - классические white papers
Прочитать:
whitepaper Bitcoin
- whitepaper Ethereum

Результат нужно оформить на портале сообщением-ответом на вопрос "что есть криптовалюта". Сообщение должно содержать не более 4-х слов (без учета предлогов), юмор в тему приветствуется :)
4 ак. ч.

Лекция №2: Введение в смарт-контракты  
+ ДЗ №2

  • Исполнение кода в консенсусе: детерминизм, безопасность, особенности виртуальной машины, модели аккаунтов, балансов
  • Смарт-контракты: понятие, принципы работы, основные свойства, организация среды исполнения, ограничения на исполнение
  • Примеры кода
  • Смарт-контракты Ethereum: cхема работы, виртуальная машина EVM, концепция газа, окружение контракта, storage, вызовы других контрактов и библиотек
  • язык Solidity, структура кода, примеры, основные примитивы
  • Системы смарт-контрактов и безопасность: front-running, арифметические переполнения, типовые уязвимости кода и инфраструктуры
  • Базовые паттерны с примерами: Identity, multisig, сommit-reveal,  конечные автоматы, фабрики контрактов
Домашнее задание №2: ДЗ2
4 ак. ч.

Семинар №1: Разработка смарт-контрактов в Ethereum, язык Solidity  
+ ДЗ №3

  • разбор исходника простейшего контракта
  • сборка и запуск truffle-тестов учебного контракта
    • версии truffle, solidity, использование разный версий компилятора solc
  • тестовая инфраструктура, цикл разработки и отладки
    • truffle, ganache, remix
  • тестирование контрактов:
    • аккаунты и балансы нативного токена
    • обращение к контракту с разных аккаунтов
    • тестирование ошибок процессинга: require, assert, out of gas
  • программируем один из примеров:
    • token
  • тесты, рекомендации по прохождению логических ветвей в контрактах (call, return, require, assert, if) 
  • (optional) запуск standalone ноды Ethereum, обозревателя блоков BlockScout
  • (optional) разработка простого DApp на Node.JS, взаимодествующего с разработанным контрактом
Домашнее задание №3: ДЗ3 - пишем смарт-контракт и тесты к нему
Разработать контракт и тесты с использованием фреймворка truffle, как было показано на знаятии. Логику контракта выбрать из нижеприведенного списка. Задание делать в своем публичном репозитарии, в README - обязательно описание как скомпилировать код и запустить тесты. Тесты, покрывающие много логических ветвей (каждый "require", каждый "if") - плюс. Screencast работы с задеплоенным в testnet контрактом - плюс.

Дополнения "[на проект]" предлагают вариант дополнительных функций, которые позволят развивать это ДЗ далее, как курсовой проект

Варианты:
  • коллективная покупка товара за ETH с произвольных адресов
    • [на проект] - с “заказом” в контракт отправляется ipfs_hash от файлом-строкой, где указан  адрес заказчика. Файл зашифровывается только для получателя платежа (его публичным ключом). После покупки поставщик сможет расшифровать адреса каждого покупателя своим приватным ключом. 
  • голосование за заданную строку заранее фиксированным набором голосующих (< 10)
    • [на проект] с homomorphic сбором голосов как в waves, т.е. нельзя увидеть кто как голосовал, но в конце головования можно публично проверить сумму голосов
  • governance токен: распределяет входящие ETH на несколько адресов в долях, пропорциональных балансам governance токена
    • [на проект] - сделать все административные функции (удобное добавление новых участников, перераспределение долей)
  • своя идея контракта,  утвержденная преподавателем. Предлагаемая логика должна использовать взаиморасчеты в ETH или ERC20 токенах и не менее 3-х участвующих сторон
4 ак. ч.

Лекция №3: Симметричные криптосистемы  
+ ДЗ №4

  • Симметричные и асимметричные криптосистемы
  • Критерии качества шифров, рассеивание и перемешивание информации, концепция абсолютно стойкого шифра, одноразовый блокнот, внутреннее устройство алгоритмов шифрования, сеть Фейстеля, SP-сеть, примеры алгоритмов: ГОСТ-28147-89 и AES
  • Режимы симметричного блочного шифрования, детерминированные последовательности блоков
  • генераторы псевдо-случайных и случайных чисел, гаммирование, поточные шифры 
  • Криптографическое хеширование, современные стандарты: SHA-256, Keccak, Blake2, требования к безопасности и атаки на алгоритмы
  • Использование хеширования в криптографических схемах: 
    • аутентификация (hash onions, web-сессии)
    • контроль целостности (filesystems, torrents)
    • content addressing (by hash), merkle tree, sparse merkle tree
    • antispam proof-of-work scheme by Adam Back
  • примеры протоколов
Домашнее задание №4: ДЗ4 - псевдослучайное распределение
 
Сделать программу - консольное приложение, используя языки: С/C++, Rust, Python, Go, Node.JS. Код должен быть оформлен в  отдельный репозитарий на GitHub c инструкцией в README.md как собрать и запустить код в консоли под Ubuntu 18.04

Программа принимает три параметра командной строки, типа:
./program --file <filename> --numbilets 20 --parameter 42
Параметры: имя файла с ФИО студентов, число билетов, параметр, меняющий распределение. Затем, программа равномерно и детерминировано выдает в консоль строку из файла + номер билета. Номера билетов детерминированно связаны с ФИО и параметром, меняющим распределение. 

Входные данные (параметры командной строки):
1) файл, где каждая строка - это ФИО студента, типа:
Иванов Иван Иванович
Ярцев Ярослав Ярославович
...
Петров Петр Петрович
2) число билетов N (билеты нумеруются с 1 до N (включая N))
3) численный параметр, детерминированно меняющий распределение (при его изменении распределение номеров билетов максимально изменяется). При использовании одного и того же параметра, одна и та же строка Фамилия-Имя из файла всегда генерирует один и тот же номер билета

Выходные данные: вывод в STDOUT строк вида:
Иванов Иван Иванович: 21
Ярцев Ярослав Ярославович: 12
...
Петров Петр Петрович: 11
 
4 ак. ч.

Лекция №4: Асимметричные криптосистемы  
+ ДЗ №5

  • общая характеристика асимметричной криптографии
  • односторонние функции, алгоритм выработки общего секретного ключа Диффи-Хеллмана
  • PKI, секретная передача информации, схема электронной подписи
  • основные ассиметричные криптосистемы: RSA, ECC
  • PKI, атаки man-in-the-middle, системы криптографических сертификатов, HTTPS, квалифицированная ЭЦП
  • клептографические атаки, post-quantum проблемы асимметричных криптосистем 
Домашнее задание №5: ДЗ5

Сделать программу - консольное приложение, используя языки: С/C++, Rust, Python, Go, Node.JS. Код должен быть оформлен в  отдельный репозитарий на GitHub c инструкцией в README.md как собрать и запустить код в консоли под Ubuntu 18.04. К заданию должен быть приложен скриншот или текст вывода одного или нескольких прогонов программы(!).
Программа эмулирует работу автомобильного брелока, открывающего машину, с использованием ЭЦП в условиях, когда канал связи полностью доступен любому прослушивающему (в том числе и в течение большого времени и попыток), также атакующий может повторить прослушанные данные. 
То, что передается в реальном протоколе по сети в программе просто записывается в переменную и передается функции следующего шага в виде параметров, типа:

let handhsake_data = trinket_generate_hasndshake(...);
printf(“...trinket->car send data: ....”, handhsake_data);

let challenge_data = car_process_handshake(handshake_data);
printf(“... car->trinket send data: ...”, challenge_data);

let response_data = trinket_process_challenge(challenge_data);
printf(“...trinket->car send data: ....”, response_data);


Возможны различные варианты построения протокола, вот один из них:
  1. Handshake. На этом этапе брелок отправляет машине код команды (любые данные, в истинности которых машина должна удостовериться) 
  2. Challenge. Машина отправляет брелоку данные, с которыми брелок должен что-то сделать, что докажет машине, что это именно ее брелок
  3. Response. Брелок делает то, что нужно, отправляя машние доказательство того, что это именно он отправил Handshake
  4. Машина проверяет доказательство и исполняет команду

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


Пример вывода программы:
 
0: (registration) 0xXXXXXXXXXXXX (pubkey1 written to trinked), 0xXXXXXXXXXXXXXX (pubkey2 written to car)
1: (handshake) trinket -> car, 0xXXXXXX (id command), 0xXXXXXXX (challenge for car)
2: (challenge) car -> trinket: 0xXXXXXX(challenge for trinket), 0xXXXXXXX (confirm challenge for car)
3: (response) trinket->car: 0xXXXXXXX (confirm challenge for trinket)
4: (action) car: check response - ok, OPEN DOOR

Логика, последовательность шагов, внутренние данные - все это вы проектируете сами, единственное требование - генерация и проверка ЭЦП. Рекомендуется сначала спроектировать протокол с пустыми mock-нутыми функциями generate_sig() и verify_sig() и лишь в конце использовать криптографичекую билиотеку.

P.S. плз, помните, что нам проверять задание, не надо строить проекты из десятков файлов с обработкой любых параметров. 
4 ак. ч.

Лекция №5: Peer-to-peer сети и сетевой консенсус  

  • Peer-to-peer (p2p) сети, историческая справка: p2p networks, (eDonkey, KaZaaa, BitTorrent), блокчейны
  • Общая схема работы децентрализованной сети, сообщения, маршруты, DHT (Distributed Hash Table)
  • Протокол Kademlia, метрики расстояния
  • IPFS и проблемы distributed storage
  • изоляция пиров, проблемы диагностики
  • mixed networks: TOR, i2p), Onion Routing, кольцевые подписи для построение анонимизированных маршрутов
  • p2p сеть, как транспорт для работы в децентрализованных сетях
  • проблем синхронизации узлов в отказоустойчивых системах: понятие логического времени на примере 2-commit/3-commit схем, paxos
  • консенсус и границы достижения консенсуса, общие черты систем с и без византийских узлов, связь с CAP теоремой
  • общие проблемы построения дец. сетей: системы репликации в СУБД, CAP теорема, порядок транзакций
  • связь name-систем, сертификатов, ЭЦП и p2p сетей для идентификации пользователей в децентрализованных сетях
4 ак. ч.

Лекция №6: Продвинутая криптография  
+ ДЗ №6

  • Threshold-протоколы, протокол разделения секрета Фиата-Шамира
  • BLS-подписи, 
  • протокол подбрасывания монеты
  • другие важные для децентрализованных систем протоколы
  • отказоустойчивая передача и хранение данных на основе избыточности, коды Рида - Соломона
  • Zero-knowledge протоколы, свойства: soundness, completeness, zero-knowledge. Протоколы знания секретной экспоненты, pairings на эллиптических кривых, кольцевые подписи, multi-party computations. Succinct proofs, zkSNARKS/STARKS
Домашнее задание №6: ДЗ7
 
Сделать программу - консольное приложение, используя языки: С/C++, Rust, Python, Go, Node.JS. Код должен быть оформлен в  отдельный репозитарий на GitHub c инструкцией в README.md как собрать и запустить код в консоли под Ubuntu 18.04. К коду должен быть приложен скриншот одного из запусков в консоли.

Программа, разделяет секретную строку в hex формате длиной 256 bit (например, приватный ключ ECDSA secp256k1) на N частей по схеме Шамира и восстанавливает его при предъявлении любых T частей.

Аргументы командной строки:
Единственный аргумент указывающий режим работы программы:
  • ./your-program split - режим разделения
  • ./your-program recover - режим восстановления
# разделение секрета:
./program split
# восстановление секрета
./program recover

Входные данные - mode split (stdin):
1 строчка - Приватный ключ (P_KEY)
2 строчка - Два числа N, T, где 2 < T <= N < 100

Выходные данные - mode split (stdout):
N строк, в каждой строке содержится кусочек разделенного секрета(в виде string)
stdin:
0xb04a9a2d251cd...6bd566468
3 2

stdout:
0x2b0a36a4058f8a..b0a36405f
0x6d0a362b58f8aa..40a4058f8
0x40a05f86a4058f..8a2b83a6d


Входные данные - mode recover (stdin):
T или более строк с кусочками секрета(в каждой строке кусок секрета в том же формате что и вывод программы в режиме split)

Выходные данные - mode recover (stdout):
Приватный ключ (P_KEY), в таком же виде что и перед разделением
stdin:
0x2b0a36a4058f8a..b0a36405f
0x6d0a362b58f8aa..40a4058f8
0x40a05f86a4058f..8a2b83a6d

stdout:
0xb04a9a2d251cd...6bd566468
 
4 ак. ч.

Лекция №7: Архитектура блокчейнов, сеть Bitcoin  

  • Задача ведения единого ledger в недоверенной p2p сети
  • Подписи транзакций, адреса в сети, примерный дизайн блокчейн-сети
  • Bitcoin, схема работы сети, алгоритм работы ноды, целостность блоков и работа с цепочкой
  • Bitcoin, структура блока. Требования к хешам блоков, сложность сети, nonce, майнинг
  • Bitcoin, структура транзакции, модель UTXO  based consensus networks модель передачи value, комиссия сети
  • pay-to-script адреса, Bitcoin Script, передача владения
  • Атаки на консенсус PoW сети: double spend, атака 51%, проблемы холодного старта
  • Bitcoin, Litecoin, Ethereum, Monero, требования к алгоритмам хеширования и их развитие, рассмотрение популярных PoW алгоритмов: SHA-256, Scrypt, Ethash, X11, майнинговое оборудование
  • Интересные реализации proof-of-work консенсусов, использующих другие варианты “work”: PrimeCoin, Storj, аудит сетевого трафика
4 ак. ч.

Лекция №8: Алгоритмы консенсуса  

  • Byzantine Fault Tolerance как основное требование к консненсусам современных блокчейнов, требования к safety и liveness
  • Задача византийских генералов, базовые примитивы для построения BFT консенсусов
  • алгоритм Practical BFT
  • Консенсусы типа proof-of-authority (PoA), безопасность и производительность PoA алгоритмов 
  • Валидаторы, орагнизация governance сетей, тестовые и приватные блокчейны
  • Консенсус типа proof-of-stake (PoS), наивный PoS, атаки nothing-at-stake, long-distance, консенсусы типа Delegated Proof Of Stake (DPoS)
  • Экономическая безопасность консенсусов типа proof-of-stake (PoS), slashing, sybil атаки, атаки большим стейком, механизмы защиты
  • Примеры реальных алгоритмов типа proof-of-stake (PoS): рассмотрение вариантов DPoS в POA Ethereum, EOS, TON, Cosmos, Tezos
4 ак. ч.

Лекция №9: Паттерны и алгоритмы в блокчейн-разработке  
+ ДЗ №7

  • Вестинг и crowfunding контракты
  • Оракулы и получения данных из внешнего мира
  • Contracts factory pattern
  • Commit-reveal, фронтраннинг, проблемы саботажа протоколов
  • Голосования и аукционы
  • Prediction markets
  • Token Currated Registries
  • Bonding curves, liquidity-based pools
  • DEX, order matching
  • Flash loans
  • Publicly verifiable Random Beacon и генерация случайных чисел в блокейнах(optional)
  • zkSNARKs/STARKs в разработке смарт-контрактов(optional)
Домашнее задание №7: ДЗ10 - проектирование курсовой работы
Подготовить стартовый репозитарий и README.md с верхнеуровневым описанием проекта, который собираетесь сделать в качестве курсового. 
4 ак. ч.

Лекция №10: Обзор сопровождающего блокчейны ПО  
+ ДЗ №8

  • Эксплуатация и тестирование блокчейн-сетей, 
  • Обзор существующих сетей и особенности инфраструктуры: Ethereum, EOS, Polkadot, POA Network, DAOBet, FreeTON
  • Описание типового ПО сопровождающего блокчейны:
    • oбозреватели блоков, рассмотрение Etherscan, BlockScout, основные компоненты обозревателя блоков,
    • криптовалютные кошельки, обзор решений: Electrum(Bitcoin), Metamask (Ethereum), Myst(Ethereum), Scatter(EOS)
    • мосты между блокчейнами: уровни безопасности и доверия, custodial, validator-based, atomic-swap based.
    • автоматические действия - стейкинг, автоконфирм мультисиг транзакций
  • Запуск и эксплуатация блокчейнов, проблемы тестирования производительности и устойчивости блокчейн-сетей, метрики мониторинга.
  • Средства автоматизированного аудита кода: Mythril, Slither, примеры аудитов и реальных ошибок
  • Инструменты для развертывания блокчейн-сетей, обзор инструментов для тестирования блокчейнов: Hyperledger Caliper, MixBytes Tank
Домашнее задание №8: ДЗ11 - полная инфраструктура DApp
Необходимо разработать в своем едином репозитарии GitHub простейший DApp который:
  • принимает от пользователя бинарный файл (например, PNG)  и загружает его в IPFS (в свою ноду)
  • хеш загруженного файла отправляет на хранение в простой смарт-контракт, хранящий mapping (address => ipfs_hash)
  • по запросу, получает ipfs_hash из контракта (используя текущий адрес), достает его из IPFS, и демонстрирует в браузере

Проект дожен работать на локальных dev-версиях софта: Ethereum нода, IPFS нода, node.js запущенный локально.
В README должна быть рабочая инструкция как с нуля запустить проект на локальной машине (запуск локальной ноды, деплой контракта в нее, запуск локальной  IPFS ноды, запуск и конфигурирование DApp (указание в нем адреса контракта и location IPFS ноды) и описание последовательности действий чтобы воспроизвести цепочку “залить файл, записать в контракт, прочитать из контракта, скачать и показать файл”. Несмотря на простоту контракта, тесты должны быть представлены хотя бы минимально.
4 ак. ч.

Лекция №11: Архитектуры и масштабирование блокчейнов  

  • Решение проблем ускорения и масштабирования блокчейнов
    • EOS: cхема работы, контракты, WebAssembly, концепция ресурсов, storage 
  • Ограничения блокчейн-сетей: число валидаторов, время процессинга транзакций, tradeoffs speed/security
  • Масштабирование блокчейнов: шардинг, многоуровневые архитектуры, Lightning, Plasma, L2 solutions, проблемы построения
  • Рассмотрение двухуровненвых архитектур наиболее перспективных проектов многоуровневых блокчейнов:
    • Polkadot
      • Parity Substrate
    • Cosmos
      • Application Cosmos
    • Telegram Open Network
      • FreeTON network
    • Ethereum 2.0
      • текущее состояние
  • Succinct proofs и zkSNARKS/STARKS для масштабирования блокчейнов, Rollups
4 ак. ч.

Смешанное занятие №1: Разработка под альтернативные блокчейны  

  • Разработка под EOS, С++/WebAssembly (4 часа)
    • обзор стека EOS
    • демонстрация разработки под EOS - код контрактов, тестовое окружение и тесты, стандартные решения, описание вспомогательного ПО
  • Разработка под Parity Substrate, Rust/WebAssembly (4 часа)
    • обзор стека Substrate/Polkadot
    • демонстрация разработки под Substrate - код runtime, тестовое окружение и тесты, станадртные решения, описание вспомогательного ПО
4 ак. ч.

Контрольное занятие №1: Защита проекта  

Сдача курсовых проектов:
 
  • < 10 min pitch video, включающее помимо описания идеи проекта screencast, доказывающий работоспособность логики проекта, если есть DApp - демонстрацию его работы
  • публичный, правильно оформленный код на Github 
    • c полным качественным README.md по логике работы проекта
    • с полными тестами (обработано максимальное число логических ветвей)
    • если есть DApp или IPFS - с инструкциями как запустить
  • (optional plus) уже запущенный, доступный в паблике DApp с уже задеплоенными в тестовую сеть контрактами и заранее сконфигурированными примерами
Регламент сдачи:
  • выделяется 10 min на доклад, video демонстрируется публично в zoom
    • вопросы по докладам задаются в публичный чат с указанием кого спрашиваю

 
4 ак. ч.

РАСПИСАНИЕ

Полное расписание