Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
SlideShare a Scribd company logo
Как приготовить
блокчейн
на Scala
и не обжечься
1
SAFE HARBOR
2
SAFE HARBOR
• Следующий доклад предназначен для
описания нашего общего направления в
разработке.
2
SAFE HARBOR
• Следующий доклад предназначен для
описания нашего общего направления в
разработке.
• Он предназначен только для информационных
целей.
2
SAFE HARBOR
• Следующий доклад предназначен для
описания нашего общего направления в
разработке.
• Он предназначен только для информационных
целей.
• На этот доклад не следует полагаться при
принятии решений о построении схожего
решения.
2
О себе
3
О себе
• Меня зовут Александр.
3
О себе
• Меня зовут Александр.
• Scala Software Engineer в Aeneas. Заодно и студент в КНУ
им. Шевченка !.
3
О себе
• Меня зовут Александр.
• Scala Software Engineer в Aeneas. Заодно и студент в КНУ
им. Шевченка !.
• Пишу на Scala (по работе и в свободное время), Java,
Kotlin, Haskell/Idris, JS и С++. Изучаю Rust.
3
О себе
• Меня зовут Александр.
• Scala Software Engineer в Aeneas. Заодно и студент в КНУ
им. Шевченка !.
• Пишу на Scala (по работе и в свободное время), Java,
Kotlin, Haskell/Idris, JS и С++. Изучаю Rust.
• Contributor в open-source проекты, такие как Scorex,
Korolev (Scala), TeaVM (Java).
3
О себе
• Меня зовут Александр.
• Scala Software Engineer в Aeneas. Заодно и студент в КНУ
им. Шевченка !.
• Пишу на Scala (по работе и в свободное время), Java,
Kotlin, Haskell/Idris, JS и С++. Изучаю Rust.
• Contributor в open-source проекты, такие как Scorex,
Korolev (Scala), TeaVM (Java).
• Пристально слежу за разработкой виртуальных машин и
операционных систем и собираюсь делать вклад в это в
будущем.
3
Мои контакты
FlyCreat1ve
fly_style
Fly-Style
4
Aeneas
5
Aeneas
5
Aeneas
• Aeneas - это публичная
модульная blockchain-
платформа.
5
Aeneas
• Aeneas - это публичная
модульная blockchain-
платформа.
• Её первостепенными
функциями являются:
инициирование проектов
добровольной финансовой
поддержки, размещение
заявок на политическое
лоббирование и
возможность их
исполнения лоббистскими
группами.
5
6
• Строгая статическая типизация.
• Сильная ФП-составляющая языка.
• Лаконичность языка.
• Совместимость с Java на уровне исходников.
• Масштабируемость языка (Scalable).
• Под капотом - JVM.
6
7
• Акторы - сущности, напоминающие потоки.
• Но главное отличие - у каждого актора своя
память.
• Общение путем передачи сообщений.
• Удобная сериализация.
• Дополнительно получаем кучу удобных методов
работы с различными сетевыми протоколами.
7
Почему Scorex 2?
8
Почему Scorex 2?
• Модульность.
8
Почему Scorex 2?
• Модульность.
• Akka & Akka-TCP под капотом.
8
Почему Scorex 2?
• Модульность.
• Akka & Akka-TCP под капотом.
• Небольшой объём кодовой базы.
8
Почему Scorex 2?
• Модульность.
• Akka & Akka-TCP под капотом.
• Небольшой объём кодовой базы.
• Легко разобраться, с чего начать.
8
Почему Scorex 2?
• Модульность.
• Akka & Akka-TCP под капотом.
• Небольшой объём кодовой базы.
• Легко разобраться, с чего начать.
• Широкий выбор сопутствующих вспомогательных
инструментов (БД, библиотека криптоалгоритмов).
8
Почему Scorex 2?
• Модульность.
• Akka & Akka-TCP под капотом.
• Небольшой объём кодовой базы.
• Легко разобраться, с чего начать.
• Широкий выбор сопутствующих вспомогательных
инструментов (БД, библиотека криптоалгоритмов).
• Знакомые разработчики "
8
Scorex 2 : 

Архитектура локального узла :
NodeViewHolder
9
Scorex 2 : 

Архитектура локального узла :
NodeViewHolder
9
Минусы Scorex 2!
10
Минусы Scorex 2!
• Поверхностная документация!
10
Минусы Scorex 2!
• Поверхностная документация!
• Неочевидные решения в коде.
10
Минусы Scorex 2!
• Поверхностная документация!
• Неочевидные решения в коде.
• Akka => сложный дебаг кода акторов.
10
Минусы Scorex 2!
• Поверхностная документация!
• Неочевидные решения в коде.
• Akka => сложный дебаг кода акторов.
• Местами SOLID и не пахнет.
10
11
Баг подкрался незаметно
• … и не один.
• Посему данный доклад предназначен облегчить
жизнь всем, кто хочет попробовать сделать
blockchain на Scala + Scorex, и не наступить на
те грабли, что наступали (и продолжаем
наступать) мы.
12
13
1. lazy
14
1. lazy
class SimpleBlockChain(loadSettings: LoadSettings)
extends Application with ScorexLogging {
//…
override implicit val settings = SimpleSettings.read().scorexSettings
override val nodeViewHolderRef: ActorRef = actorSystem.actorOf(
Props(new AeneasNodeViewHolder(settings, simpleSettings.miningSettings)))
}
14
1. lazy
15
1. lazy
class SimpleBlockChain(loadSettings: LoadSettings)
extends Application with ScorexLogging {
//…
// Note : NEVER NEVER forget to mark override & implicit as LAZY!
override implicit lazy val settings = SimpleSettings.read().scorexSettings
override val nodeViewHolderRef: ActorRef = actorSystem.actorOf(
Props(new AeneasNodeViewHolder(settings, simpleSettings.miningSettings)))
}
15
1. lazy
class SimpleBlockChain(loadSettings: LoadSettings)
extends Application with ScorexLogging {
//…
// Note : NEVER NEVER forget to mark override & implicit as LAZY!
override implicit lazy val settings = SimpleSettings.read().scorexSettings
override val nodeViewHolderRef: ActorRef = actorSystem.actorOf(
Props(new AeneasNodeViewHolder(settings, simpleSettings.miningSettings)))
}
• Не забывайте о lazy для перегружаемых и
имплицитных свойств!
15
2. Запуск нескольких узлов
16
2. Запуск нескольких узлов
• Для отладки (да и для работы, собственно) вам
наверняка понадобится запускать несколько
экземпляров узлов.
16
2. Запуск нескольких узлов
• Для отладки (да и для работы, собственно) вам
наверняка понадобится запускать несколько
экземпляров узлов.
• И тут помехой вам стаёт … sbt : 

[error] server failed to start on 127.0.0.1:4714. java.net.BindException:
Address already in use.
16
2. Запуск нескольких узлов
• Для отладки (да и для работы, собственно) вам
наверняка понадобится запускать несколько
экземпляров узлов.
• И тут помехой вам стаёт … sbt : 

[error] server failed to start on 127.0.0.1:4714. java.net.BindException:
Address already in use.
• Он не способен запускать несколько
экземпляров «себя», и это давняя история.
16
2. Запуск нескольких узлов
17
2. Запуск нескольких узлов
• Немного погуглив, мы забили на попытки
запустить sbt, а вспомнили об отличном
компоновочном универсальном туле под
названием make.
17
2. Запуск нескольких узлов
• Немного погуглив, мы забили на попытки
запустить sbt, а вспомнили об отличном
компоновочном универсальном туле под
названием make.
• Сборка решения в jar-файл, запуск и очистка
происходит в специальном Makefile.
17
2. Запуск нескольких узлов
• Немного погуглив, мы забили на попытки
запустить sbt, а вспомнили об отличном
компоновочном универсальном туле под
названием make.
• Сборка решения в jar-файл, запуск и очистка
происходит в специальном Makefile.
• Также, если критичны логи в режиме реального
времени, можно запускать решения из Вашей
IDE (IntelliJ IDEA в нашем случае).
17
3. Синхронизация цепочек
18
3. Синхронизация цепочек
• После консенсуса или в случае минутного
простоя надо синхронизировать всю активную
сеть.
18
3. Синхронизация цепочек
• После консенсуса или в случае минутного
простоя надо синхронизировать всю активную
сеть.
• Для этого мы используем некое подобие
активного кэша в виде списка id-шников
последних 50 блоков. Известна эта структура в
Scorex 2 как SyncInfo.
18
3. Синхронизация цепочек
19
3. Синхронизация цепочек
case class AeneasSyncInfo(blockchainHeight : Long,
lastBlocks: Seq[ModifierId],
genesisBlock: ModifierId) extends SyncInfo {
require(lastBlocks.size <= AeneasSyncInfo.lastBlocksCount)
override def startingPoints: Seq[(ModifierTypeId, ModifierId)] = {
Seq(lastBlocks.map(block => PowBlock.ModifierTypeId -> block)).flatten
}
override type M = AeneasSyncInfo
override def serializer = VerySimpleSyncInfoSerializer
}
object AeneasSyncInfo {
val lastBlocksCount = 50
}
19
3. Ситуации синхронизации
для наглядности
20
3. Ситуации синхронизации
для наглядности
<= Older



Younger =>
20
3. Синхронизация цепочек
21
3. Синхронизация цепочек
• Мы рекомендуем сравнивать SyncInfo
пришедший c другого пира и SyncInfo
текущего узла, который можно получить,
вызвав метод syncInfo().

21
3. Синхронизация цепочек
• Мы рекомендуем сравнивать SyncInfo
пришедший c другого пира и SyncInfo
текущего узла, который можно получить,
вызвав метод syncInfo().

• Это не так очевидно, к сожалению, так как в
других проектах используется перебор истории
(оверхед по памяти) и другие более экзотичные
способы.
21
4. Работа с сетью
22
4. Работа с сетью
• Реализация работы с TCP присутствует! ☺
22
4. Работа с сетью
• Реализация работы с TCP присутствует! ☺
• Сперва мы по недосмотру ринулись
реализовывать свой велосипед.
22
4. Работа с сетью
• Реализация работы с TCP присутствует! ☺
• Сперва мы по недосмотру ринулись
реализовывать свой велосипед.
• Но очередная ревизия кода помогла нам не
идти этим путем.
22
4. Работа с сетью
• Реализация работы с TCP присутствует! ☺
• Сперва мы по недосмотру ринулись
реализовывать свой велосипед.
• Но очередная ревизия кода помогла нам не
идти этим путем.
• Из минусов - много тудушек в коде, и полное
отсутствие документации.
22
4. Работа с сетью :

крупно (1)
23
4. Работа с сетью :

крупно (1)
• NetworkController – ключевой класс при работе
с сетью, ему подконтрольны все события,
происходящие с сетью.
23
4. Работа с сетью :

крупно (1)
• NetworkController – ключевой класс при работе
с сетью, ему подконтрольны все события,
происходящие с сетью.
• PeerManager – контроль за подключениями.
23
4. Работа с сетью :

крупно (1)
• NetworkController – ключевой класс при работе
с сетью, ему подконтрольны все события,
происходящие с сетью.
• PeerManager – контроль за подключениями.
• PeerConnectionHandler – держатель логики
процесса подключения пиров.
23
4. Работа с сетью :

крупно (1)
• NetworkController – ключевой класс при работе
с сетью, ему подконтрольны все события,
происходящие с сетью.
• PeerManager – контроль за подключениями.
• PeerConnectionHandler – держатель логики
процесса подключения пиров.
• SendingStrategy – стратегия посылки сообщений.
23
4. Работа с сетью :

крупно (2)
24
4. Работа с сетью :

крупно (2)
• ConnectedPeer
24
4. Работа с сетью :

крупно (2)
• ConnectedPeer
• Message
24
4. Работа с сетью :

крупно (2)
• ConnectedPeer
• Message
• MessageSpec – спецификация сообщения.
24
4. Работа с сетью :

крупно (2)
• ConnectedPeer
• Message
• MessageSpec – спецификация сообщения.
• SendToNetwork(message, sendingStrategy)
24
4. Работа с сетью :

крупно (2)
• ConnectedPeer
• Message
• MessageSpec – спецификация сообщения.
• SendToNetwork(message, sendingStrategy)
• DataFromPeer(spec, data, source)
24
5. Первый запуск нового узла
в функционирующей сети
25
5. Первый запуск нового узла
в функционирующей сети
Для того, чтобы полноценным узлом
можно было пользоваться, необходимо
скачать полную(!) копию валидного(!!!)
блокчейна.
25
Проблема №1 : 

поиск пиров
26
Проблема №1 : 

поиск пиров
• Мы временно счастливо забили на это дело $
26
Проблема №1 : 

поиск пиров
• Мы временно счастливо забили на это дело $
• Дело в том, что для начальных этапов мы
введем так называемые well-known пиры,
которые будут такими же участниками сети, но
будут иметь право раздавать валидный
блокчейн.
26
Проблема №1 : 

поиск пиров
• Мы временно счастливо забили на это дело $
• Дело в том, что для начальных этапов мы
введем так называемые well-known пиры,
которые будут такими же участниками сети, но
будут иметь право раздавать валидный
блокчейн.
• С процессом распространения платформы мы
будем валидировать проявившие себя узлы.
26
Проблема №2 : 

процесс скачивания
27
Проблема №2 : 

процесс скачивания
• Было преодолено много боли, но мы в итоге с
помощью знаний из пункта №4 таки разработали
скачивание при начале работы полного узла.
27
Проблема №2 : 

процесс скачивания
• Было преодолено много боли, но мы в итоге с
помощью знаний из пункта №4 таки разработали
скачивание при начале работы полного узла.
• В первую очередь, надо было обойти навязанный
нам способ инициализации локального узла : 



private var nodeView : NodeView = restoreState()

.getOrElse(genesisState)

27
Ещё крупнее
28
Что у нас в планах
29
Что у нас в планах
• Наладить интеграционное тестирование.
29
Что у нас в планах
• Наладить интеграционное тестирование.
• Имплементация консенсуса.
29
Что у нас в планах
• Наладить интеграционное тестирование.
• Имплементация консенсуса.
• Имплементация транзакций и включение их в
блоки.
29
Что у нас в планах
• Наладить интеграционное тестирование.
• Имплементация консенсуса.
• Имплементация транзакций и включение их в
блоки.
• Возможно, какой-то research относительно
уплотнения хранилища (AVL-trees, но это не
точно).
29
Q/A?
30

More Related Content

How to cook a blockchain and not get burned

  • 3. SAFE HARBOR • Следующий доклад предназначен для описания нашего общего направления в разработке. 2
  • 4. SAFE HARBOR • Следующий доклад предназначен для описания нашего общего направления в разработке. • Он предназначен только для информационных целей. 2
  • 5. SAFE HARBOR • Следующий доклад предназначен для описания нашего общего направления в разработке. • Он предназначен только для информационных целей. • На этот доклад не следует полагаться при принятии решений о построении схожего решения. 2
  • 7. О себе • Меня зовут Александр. 3
  • 8. О себе • Меня зовут Александр. • Scala Software Engineer в Aeneas. Заодно и студент в КНУ им. Шевченка !. 3
  • 9. О себе • Меня зовут Александр. • Scala Software Engineer в Aeneas. Заодно и студент в КНУ им. Шевченка !. • Пишу на Scala (по работе и в свободное время), Java, Kotlin, Haskell/Idris, JS и С++. Изучаю Rust. 3
  • 10. О себе • Меня зовут Александр. • Scala Software Engineer в Aeneas. Заодно и студент в КНУ им. Шевченка !. • Пишу на Scala (по работе и в свободное время), Java, Kotlin, Haskell/Idris, JS и С++. Изучаю Rust. • Contributor в open-source проекты, такие как Scorex, Korolev (Scala), TeaVM (Java). 3
  • 11. О себе • Меня зовут Александр. • Scala Software Engineer в Aeneas. Заодно и студент в КНУ им. Шевченка !. • Пишу на Scala (по работе и в свободное время), Java, Kotlin, Haskell/Idris, JS и С++. Изучаю Rust. • Contributor в open-source проекты, такие как Scorex, Korolev (Scala), TeaVM (Java). • Пристально слежу за разработкой виртуальных машин и операционных систем и собираюсь делать вклад в это в будущем. 3
  • 15. Aeneas • Aeneas - это публичная модульная blockchain- платформа. 5
  • 16. Aeneas • Aeneas - это публичная модульная blockchain- платформа. • Её первостепенными функциями являются: инициирование проектов добровольной финансовой поддержки, размещение заявок на политическое лоббирование и возможность их исполнения лоббистскими группами. 5
  • 17. 6
  • 18. • Строгая статическая типизация. • Сильная ФП-составляющая языка. • Лаконичность языка. • Совместимость с Java на уровне исходников. • Масштабируемость языка (Scalable). • Под капотом - JVM. 6
  • 19. 7
  • 20. • Акторы - сущности, напоминающие потоки. • Но главное отличие - у каждого актора своя память. • Общение путем передачи сообщений. • Удобная сериализация. • Дополнительно получаем кучу удобных методов работы с различными сетевыми протоколами. 7
  • 22. Почему Scorex 2? • Модульность. 8
  • 23. Почему Scorex 2? • Модульность. • Akka & Akka-TCP под капотом. 8
  • 24. Почему Scorex 2? • Модульность. • Akka & Akka-TCP под капотом. • Небольшой объём кодовой базы. 8
  • 25. Почему Scorex 2? • Модульность. • Akka & Akka-TCP под капотом. • Небольшой объём кодовой базы. • Легко разобраться, с чего начать. 8
  • 26. Почему Scorex 2? • Модульность. • Akka & Akka-TCP под капотом. • Небольшой объём кодовой базы. • Легко разобраться, с чего начать. • Широкий выбор сопутствующих вспомогательных инструментов (БД, библиотека криптоалгоритмов). 8
  • 27. Почему Scorex 2? • Модульность. • Akka & Akka-TCP под капотом. • Небольшой объём кодовой базы. • Легко разобраться, с чего начать. • Широкий выбор сопутствующих вспомогательных инструментов (БД, библиотека криптоалгоритмов). • Знакомые разработчики " 8
  • 28. Scorex 2 : 
 Архитектура локального узла : NodeViewHolder 9
  • 29. Scorex 2 : 
 Архитектура локального узла : NodeViewHolder 9
  • 31. Минусы Scorex 2! • Поверхностная документация! 10
  • 32. Минусы Scorex 2! • Поверхностная документация! • Неочевидные решения в коде. 10
  • 33. Минусы Scorex 2! • Поверхностная документация! • Неочевидные решения в коде. • Akka => сложный дебаг кода акторов. 10
  • 34. Минусы Scorex 2! • Поверхностная документация! • Неочевидные решения в коде. • Akka => сложный дебаг кода акторов. • Местами SOLID и не пахнет. 10
  • 35. 11
  • 36. Баг подкрался незаметно • … и не один. • Посему данный доклад предназначен облегчить жизнь всем, кто хочет попробовать сделать blockchain на Scala + Scorex, и не наступить на те грабли, что наступали (и продолжаем наступать) мы. 12
  • 37. 13
  • 39. 1. lazy class SimpleBlockChain(loadSettings: LoadSettings) extends Application with ScorexLogging { //… override implicit val settings = SimpleSettings.read().scorexSettings override val nodeViewHolderRef: ActorRef = actorSystem.actorOf( Props(new AeneasNodeViewHolder(settings, simpleSettings.miningSettings))) } 14
  • 41. 1. lazy class SimpleBlockChain(loadSettings: LoadSettings) extends Application with ScorexLogging { //… // Note : NEVER NEVER forget to mark override & implicit as LAZY! override implicit lazy val settings = SimpleSettings.read().scorexSettings override val nodeViewHolderRef: ActorRef = actorSystem.actorOf( Props(new AeneasNodeViewHolder(settings, simpleSettings.miningSettings))) } 15
  • 42. 1. lazy class SimpleBlockChain(loadSettings: LoadSettings) extends Application with ScorexLogging { //… // Note : NEVER NEVER forget to mark override & implicit as LAZY! override implicit lazy val settings = SimpleSettings.read().scorexSettings override val nodeViewHolderRef: ActorRef = actorSystem.actorOf( Props(new AeneasNodeViewHolder(settings, simpleSettings.miningSettings))) } • Не забывайте о lazy для перегружаемых и имплицитных свойств! 15
  • 44. 2. Запуск нескольких узлов • Для отладки (да и для работы, собственно) вам наверняка понадобится запускать несколько экземпляров узлов. 16
  • 45. 2. Запуск нескольких узлов • Для отладки (да и для работы, собственно) вам наверняка понадобится запускать несколько экземпляров узлов. • И тут помехой вам стаёт … sbt : 
 [error] server failed to start on 127.0.0.1:4714. java.net.BindException: Address already in use. 16
  • 46. 2. Запуск нескольких узлов • Для отладки (да и для работы, собственно) вам наверняка понадобится запускать несколько экземпляров узлов. • И тут помехой вам стаёт … sbt : 
 [error] server failed to start on 127.0.0.1:4714. java.net.BindException: Address already in use. • Он не способен запускать несколько экземпляров «себя», и это давняя история. 16
  • 48. 2. Запуск нескольких узлов • Немного погуглив, мы забили на попытки запустить sbt, а вспомнили об отличном компоновочном универсальном туле под названием make. 17
  • 49. 2. Запуск нескольких узлов • Немного погуглив, мы забили на попытки запустить sbt, а вспомнили об отличном компоновочном универсальном туле под названием make. • Сборка решения в jar-файл, запуск и очистка происходит в специальном Makefile. 17
  • 50. 2. Запуск нескольких узлов • Немного погуглив, мы забили на попытки запустить sbt, а вспомнили об отличном компоновочном универсальном туле под названием make. • Сборка решения в jar-файл, запуск и очистка происходит в специальном Makefile. • Также, если критичны логи в режиме реального времени, можно запускать решения из Вашей IDE (IntelliJ IDEA в нашем случае). 17
  • 52. 3. Синхронизация цепочек • После консенсуса или в случае минутного простоя надо синхронизировать всю активную сеть. 18
  • 53. 3. Синхронизация цепочек • После консенсуса или в случае минутного простоя надо синхронизировать всю активную сеть. • Для этого мы используем некое подобие активного кэша в виде списка id-шников последних 50 блоков. Известна эта структура в Scorex 2 как SyncInfo. 18
  • 55. 3. Синхронизация цепочек case class AeneasSyncInfo(blockchainHeight : Long, lastBlocks: Seq[ModifierId], genesisBlock: ModifierId) extends SyncInfo { require(lastBlocks.size <= AeneasSyncInfo.lastBlocksCount) override def startingPoints: Seq[(ModifierTypeId, ModifierId)] = { Seq(lastBlocks.map(block => PowBlock.ModifierTypeId -> block)).flatten } override type M = AeneasSyncInfo override def serializer = VerySimpleSyncInfoSerializer } object AeneasSyncInfo { val lastBlocksCount = 50 } 19
  • 57. 3. Ситуации синхронизации для наглядности <= Older
 
 Younger => 20
  • 59. 3. Синхронизация цепочек • Мы рекомендуем сравнивать SyncInfo пришедший c другого пира и SyncInfo текущего узла, который можно получить, вызвав метод syncInfo().
 21
  • 60. 3. Синхронизация цепочек • Мы рекомендуем сравнивать SyncInfo пришедший c другого пира и SyncInfo текущего узла, который можно получить, вызвав метод syncInfo().
 • Это не так очевидно, к сожалению, так как в других проектах используется перебор истории (оверхед по памяти) и другие более экзотичные способы. 21
  • 61. 4. Работа с сетью 22
  • 62. 4. Работа с сетью • Реализация работы с TCP присутствует! ☺ 22
  • 63. 4. Работа с сетью • Реализация работы с TCP присутствует! ☺ • Сперва мы по недосмотру ринулись реализовывать свой велосипед. 22
  • 64. 4. Работа с сетью • Реализация работы с TCP присутствует! ☺ • Сперва мы по недосмотру ринулись реализовывать свой велосипед. • Но очередная ревизия кода помогла нам не идти этим путем. 22
  • 65. 4. Работа с сетью • Реализация работы с TCP присутствует! ☺ • Сперва мы по недосмотру ринулись реализовывать свой велосипед. • Но очередная ревизия кода помогла нам не идти этим путем. • Из минусов - много тудушек в коде, и полное отсутствие документации. 22
  • 66. 4. Работа с сетью :
 крупно (1) 23
  • 67. 4. Работа с сетью :
 крупно (1) • NetworkController – ключевой класс при работе с сетью, ему подконтрольны все события, происходящие с сетью. 23
  • 68. 4. Работа с сетью :
 крупно (1) • NetworkController – ключевой класс при работе с сетью, ему подконтрольны все события, происходящие с сетью. • PeerManager – контроль за подключениями. 23
  • 69. 4. Работа с сетью :
 крупно (1) • NetworkController – ключевой класс при работе с сетью, ему подконтрольны все события, происходящие с сетью. • PeerManager – контроль за подключениями. • PeerConnectionHandler – держатель логики процесса подключения пиров. 23
  • 70. 4. Работа с сетью :
 крупно (1) • NetworkController – ключевой класс при работе с сетью, ему подконтрольны все события, происходящие с сетью. • PeerManager – контроль за подключениями. • PeerConnectionHandler – держатель логики процесса подключения пиров. • SendingStrategy – стратегия посылки сообщений. 23
  • 71. 4. Работа с сетью :
 крупно (2) 24
  • 72. 4. Работа с сетью :
 крупно (2) • ConnectedPeer 24
  • 73. 4. Работа с сетью :
 крупно (2) • ConnectedPeer • Message 24
  • 74. 4. Работа с сетью :
 крупно (2) • ConnectedPeer • Message • MessageSpec – спецификация сообщения. 24
  • 75. 4. Работа с сетью :
 крупно (2) • ConnectedPeer • Message • MessageSpec – спецификация сообщения. • SendToNetwork(message, sendingStrategy) 24
  • 76. 4. Работа с сетью :
 крупно (2) • ConnectedPeer • Message • MessageSpec – спецификация сообщения. • SendToNetwork(message, sendingStrategy) • DataFromPeer(spec, data, source) 24
  • 77. 5. Первый запуск нового узла в функционирующей сети 25
  • 78. 5. Первый запуск нового узла в функционирующей сети Для того, чтобы полноценным узлом можно было пользоваться, необходимо скачать полную(!) копию валидного(!!!) блокчейна. 25
  • 79. Проблема №1 : 
 поиск пиров 26
  • 80. Проблема №1 : 
 поиск пиров • Мы временно счастливо забили на это дело $ 26
  • 81. Проблема №1 : 
 поиск пиров • Мы временно счастливо забили на это дело $ • Дело в том, что для начальных этапов мы введем так называемые well-known пиры, которые будут такими же участниками сети, но будут иметь право раздавать валидный блокчейн. 26
  • 82. Проблема №1 : 
 поиск пиров • Мы временно счастливо забили на это дело $ • Дело в том, что для начальных этапов мы введем так называемые well-known пиры, которые будут такими же участниками сети, но будут иметь право раздавать валидный блокчейн. • С процессом распространения платформы мы будем валидировать проявившие себя узлы. 26
  • 83. Проблема №2 : 
 процесс скачивания 27
  • 84. Проблема №2 : 
 процесс скачивания • Было преодолено много боли, но мы в итоге с помощью знаний из пункта №4 таки разработали скачивание при начале работы полного узла. 27
  • 85. Проблема №2 : 
 процесс скачивания • Было преодолено много боли, но мы в итоге с помощью знаний из пункта №4 таки разработали скачивание при начале работы полного узла. • В первую очередь, надо было обойти навязанный нам способ инициализации локального узла : 
 
 private var nodeView : NodeView = restoreState()
 .getOrElse(genesisState)
 27
  • 87. Что у нас в планах 29
  • 88. Что у нас в планах • Наладить интеграционное тестирование. 29
  • 89. Что у нас в планах • Наладить интеграционное тестирование. • Имплементация консенсуса. 29
  • 90. Что у нас в планах • Наладить интеграционное тестирование. • Имплементация консенсуса. • Имплементация транзакций и включение их в блоки. 29
  • 91. Что у нас в планах • Наладить интеграционное тестирование. • Имплементация консенсуса. • Имплементация транзакций и включение их в блоки. • Возможно, какой-то research относительно уплотнения хранилища (AVL-trees, но это не точно). 29