Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Blockchain simplified

CocoaHeads
October 31, 2017
100

Blockchain simplified

CocoaHeads

October 31, 2017
Tweet

More Decks by CocoaHeads

Transcript

  1. План • Как он устроен? • Демонстрация работы • Реализуем

    свой блокчейн • Что такое блокчейн? 2
  2. План • Как он устроен? • Демонстрация работы • Реализуем

    свой блокчейн • Что такое блокчейн? 3
  3. План • Как он устроен? • Демонстрация работы • Реализуем

    свой блокчейн • Что такое блокчейн? 4
  4. План • Как он устроен? • Демонстрация работы • Реализуем

    свой блокчейн • Что такое блокчейн? 5
  5. 6 Что такое блокчейн? • Внесение новых записей осуществляется в

    соответствии с консенсусом • История, которую нельзя (или очень сложно) подменить • Эта история хранится/создается/ведется всеми участниками • Как правило, такая система не имеет центра или его участие ограничено (частный блокчейн)
  6. 7 Что такое блокчейн? • Внесение новых записей осуществляется в

    соответствии с консенсусом • История, которую нельзя (или очень сложно) подменить • Эта история хранится/создается/ведется всеми участниками • Как правило, такая система не имеет центра или его участие ограничено (частный блокчейн)
  7. 8 Что такое блокчейн? • Внесение новых записей осуществляется в

    соответствии с консенсусом • История, которую нельзя (или очень сложно) подменить • Эта история хранится/создается/ведется всеми участниками • Как правило, такая система не имеет центра или его участие ограничено (частный блокчейн)
  8. 9 Что такое блокчейн? • Внесение новых записей осуществляется в

    соответствии с консенсусом • История, которую нельзя (или очень сложно) подменить • Эта история хранится/создается/ведется всеми участниками • Как правило, такая система не имеет центра или его участие ограничено (частный блокчейн)
  9. 11 Зачем нужен блокчейн? • То есть, блокчейн можно использовать

    везде, где речь идет о деньгах, имуществе, деловой репутации, соглашениях итп • Чтобы избежать мошенничества • Когда обеспечить достоверность истории важнее, чем обеспечить быстродействие системы
  10. 12 Зачем нужен блокчейн? • То есть, блокчейн можно использовать

    везде, где речь идет о деньгах, имуществе, деловой репутации, соглашениях итп • Чтобы избежать мошенничества • Когда обеспечить достоверность истории важнее, чем обеспечить быстродействие системы
  11. 13 Зачем нужен блокчейн? • То есть, блокчейн можно использовать

    везде, где речь идет о деньгах, имуществе, деловой репутации, соглашениях итп • Чтобы избежать мошенничества • Когда обеспечить достоверность истории важнее, чем обеспечить быстродействие системы
  12. 14 Genesis block Info Устройство блокчейна • Эта структура хранится

    у каждого участника распределенной сети • Структура (список/дерево), данные в которой нельзя изменить, можно только добавить новые данные в конец • Данные связаны хеш указателями
  13. 15 Genesis block Info Block 1 Info
 Genesis hash Устройство

    блокчейна • Эта структура хранится у каждого участника распределенной сети • Структура (список/дерево), данные в которой нельзя изменить, можно только добавить новые данные в конец • Данные связаны хеш указателями
  14. 16 Genesis block Info Block 1 Info
 Genesis hash Block

    2 Устройство блокчейна Info
 Block hash • Эта структура хранится у каждого участника распределенной сети • Структура (список/дерево), данные в которой нельзя изменить, можно только добавить новые данные в конец • Данные связаны хеш указателями
  15. 17 Genesis block Info Block 1 Info
 Genesis hash Block

    2 Устройство блокчейна Info
 Block hash • Эта структура хранится у каждого участника распределенной сети • Структура (список/дерево), данные в которой нельзя изменить, можно только добавить новые данные в конец • Данные связаны хеш указателями
  16. 18 Genesis block Info Block 1 Info
 Genesis hash Block

    2 Устройство блокчейна Info
 Block hash • Эта структура хранится у каждого участника распределенной сети • Структура (список/дерево), данные в которой нельзя изменить, можно только добавить новые данные в конец • Данные связаны хеш указателями
  17. • При изменении хеша становятся неактуальными указатели на предыдущие блоки

    • Любое изменение данных блока ведет к изменению хеша • Алгоритм хеширования (SHA256) устроен таким образом, что не получится искусственно подобрать новый блок с таким же хешем Почему данные нельзя изменить? 19
  18. • При изменении хеша становятся неактуальными указатели на предыдущие блоки

    • Любое изменение данных блока ведет к изменению хеша • Алгоритм хеширования (SHA256) устроен таким образом, что не получится искусственно подобрать новый блок с таким же хешем Почему данные нельзя изменить? 20
  19. • При изменении хеша становятся неактуальными указатели на предыдущие блоки

    • Любое изменение данных блока ведет к изменению хеша • Алгоритм хеширования (SHA256) устроен таким образом, что не получится искусственно подобрать новый блок с таким же хешем Почему данные нельзя изменить? 21
  20. 23 Что входит в блок? Транзакция Транзакция Транзакция Заголовок Транзакции

    Хеш заголовка пред. блока Слепок транзакций (хеш) Транзакция Транзакция
  21. 24 Что включает в себя транзакция? • Цифровая подпись -

    подтверждение воли инициатора • Публичный ключ получателя • Информацию, которую надлежит передать • Хеш указатель на предыдущие транзакции
  22. 25 Что включает в себя транзакция? • Цифровая подпись -

    подтверждение воли инициатора • Публичный ключ получателя • Информацию, которую надлежит передать • Хеш указатель на предыдущие транзакции
  23. 26 Что включает в себя транзакция? • Цифровая подпись -

    подтверждение воли инициатора • Публичный ключ получателя • Информацию, которую надлежит передать • Хеш указатель на предыдущие транзакции
  24. 27 Что включает в себя транзакция? • Цифровая подпись -

    подтверждение воли инициатора • Публичный ключ получателя • Информацию, которую надлежит передать • Хеш указатель на предыдущие транзакции
  25. 30 Транзакция A Блок 1 Транзакция C Блок 100 Транзакция

    B Блок 15 Транзакция D Блок 150 Как связаны транзакции?
  26. 31 Транзакция: Вова -> Петя 5 Bitcoins 10 Bitcoins 15

    Bitcoins Inputs Дима Слава 30 Bitcoins Всего у Вовы Рома
  27. 32 5 Bitcoins 10 Bitcoins 15 Bitcoins Inputs Дима Слава

    30 Bitcoins Всего у Вовы Рома Транзакция: Вова -> Петя
  28. 33 5 Bitcoins 10 Bitcoins 15 Bitcoins Inputs Петя Дима

    Слава 30 Bitcoins Всего у Вовы Outputs 5 Bitcoins Рома 25 Bitcoins Вова Транзакция: Вова -> Петя
  29. 34 5 Bitcoins 10 Bitcoins 15 Bitcoins Inputs Петя Дима

    Слава 30 Bitcoins Всего у Вовы Outputs 5 Bitcoins Рома 25 Bitcoins Вова Транзакция: Вова -> Петя Передающий распоряжается всеми своими деньгами
  30. 40 Обработка транзакций Валидация Проверка на наличие дубликатов Запрос тела

    Добавление в список сиротских транзакций Нет предыдущих
  31. 41 Обработка транзакций Валидация Проверка на наличие дубликатов Добавление в

    список необработанных транзакций Запрос тела Добавление в список сиротских транзакций Есть предыдущие Нет предыдущих
  32. 43 Проблемы • Какие блоки считаются валидными? • Кто и

    когда может добавлять блоки? • Какие могут быть нарушения? • Как с ними бороться?
  33. 44 Проблемы • Какие блоки считаются валидными? • Кто и

    когда может добавлять блоки? • Какие могут быть нарушения? • Как с ними бороться?
  34. 45 Проблемы • Какие блоки считаются валидными? • Кто и

    когда может добавлять блоки? • Какие могут быть нарушения? • Как с ними бороться?
  35. 46 Проблемы • Какие блоки считаются валидными? • Кто и

    когда может добавлять блоки? • Какие могут быть нарушения? • Как с ними бороться?
  36. 49 Общие правила • Сколько необработанных транзакций должно быть добавлено?

    • Не добавляем «сиротские» транзакции • Продолжаем только самую длинную цепочку • Обрабатываем только валидные блоки • Итд
  37. 50 Общие правила • Сколько необработанных транзакций должно быть добавлено?

    • Не добавляем «сиротские» транзакции • Продолжаем только самую длинную цепочку • Обрабатываем только валидные блоки • Итд
  38. 51 Общие правила • Сколько необработанных транзакций должно быть добавлено?

    • Не добавляем «сиротские» транзакции • Продолжаем только самую длинную цепочку • Обрабатываем только валидные блоки • Итд
  39. 52 Общие правила • Сколько необработанных транзакций должно быть добавлено?

    • Не добавляем «сиротские» транзакции • Продолжаем только самую длинную цепочку • Обрабатываем только валидные блоки • Итд
  40. 53 Общие правила • Сколько необработанных транзакций должно быть добавлено?

    • Не добавляем «сиротские» транзакции • Продолжаем только самую длинную цепочку • Обрабатываем только валидные блоки • Итд
  41. 59 Genesis block Block 2 Fraudlent 1 Actual Петя ->

    Вова: 200 Петя -> Вася: 200 Double Spending
  42. 60 Genesis block Block 2 Fraudlent 1 Actual Петя ->

    Вова: 200 Петя -> Вася: 200 Fraudlent 2 Double Spending
  43. 64 Proof of work Data X SHA 256 HASH =

    000000…1011101 + N zeroes Average 10 MINUTES
  44. 65 Способы достижения консенсуса • Proof of work (bitcoin) -

    вероятностный подбор хеша • Proof of stake - наличие ресурсов + вероятность • Proof of activity • Proof of burn • Иные способы
  45. 66 • Proof of work (bitcoin) - вероятностный подбор хеша

    • Proof of stake - наличие ресурсов + вероятность • Proof of activity • Proof of burn • Иные способы Способы достижения консенсуса
  46. 67 • Proof of work (bitcoin) - вероятностный подбор хеша

    • Proof of stake - наличие ресурсов + вероятность • Proof of activity • Proof of burn • Иные способы Способы достижения консенсуса
  47. 68 • Proof of work (bitcoin) - вероятностный подбор хеша

    • Proof of stake - наличие ресурсов + вероятность • Proof of activity • Proof of burn • Иные способы Способы достижения консенсуса
  48. 69 • Proof of work (bitcoin) - вероятностный подбор хеша

    • Proof of stake - наличие ресурсов + вероятность • Proof of activity • Proof of burn • Иные способы Способы достижения консенсуса
  49. 77 Получение блоков Передача связанным нодам Добавление в главную ветку

    Добавление во второстепенную ветку h’ > h longest h’ <= h longest Очистка пересекающихся tx
  50. 78 Получение блоков Передача связанным нодам Добавление в главную ветку

    Добавление во второстепенную ветку Добавление в ветку, которая становится главной Добавление tx из старой главной ветки h’ > h longest h’ <= h longest Очистка пересекающихся tx Передача связанным нодам h’ > h longest Очистка пересекающихся tx
  51. 79 Получение блоков Передача связанным нодам Добавление в главную ветку

    Добавление во второстепенную ветку Добавление в ветку, которая становится главной Добавление tx из старой главной ветки Добавление сиротского блока Запрос промежуточных блоков h’ > h longest h’ <= h longest Передача связанным нодам h’ > h longest Повторение процедуры для полученных блоков Очистка пересекающихся tx Очистка пересекающихся tx
  52. 80 Итого • Обрабатываем только валидные транзакции и блоки •

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

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

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

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

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

  58. Давайте сделаем свой блокчейн! • Не будет полностью децентрализован: компания

    HeadHunter выдает регистрацию • Не будет анонимным: регистрация под реальными именами + модерация • Создавать блоки будут только некоторые работодатели, которые за выполнение этой функции получают дополнительные сервисы от HeadHunter (например) • Будем хранить записи о трудовых отношениях, а также отзывы о работе или прохождении испытательного срока 86
  59. Давайте сделаем свой блокчейн! • Не будет полностью децентрализован: компания

    HeadHunter выдает регистрацию • Не будет анонимным: регистрация под реальными именами + модерация • Создавать блоки будут только некоторые работодатели, которые за выполнение этой функции получают дополнительные сервисы от HeadHunter (например) • Будем хранить записи о трудовых отношениях, а также отзывы о работе или прохождении испытательного срока 87
  60. Давайте сделаем свой блокчейн! • Не будет полностью децентрализован: компания

    HeadHunter выдает регистрацию • Не будет анонимным: регистрация под реальными именами + модерация • Создавать блоки будут только некоторые работодатели, которые за выполнение этой функции получают дополнительные сервисы от HeadHunter (например) • Будем хранить записи о трудовых отношениях, а также отзывы о работе или прохождении испытательного срока 88
  61. Давайте сделаем свой блокчейн! • Не будет полностью децентрализован: компания

    HeadHunter выдает регистрацию • Не будет анонимным: регистрация под реальными именами + модерация • Создавать блоки будут только некоторые работодатели, которые за выполнение этой функции получают дополнительные сервисы от HeadHunter (например) • Будем хранить записи о трудовых отношениях, а также отзывы о работе или прохождении испытательного срока 89
  62. Архитектура системы (обмен записями) 91 Работник Работодатель A Private key


    Public key инф. о событии валидация Private key
 Public key Identity =
  63. Архитектура системы (обмен записями) 92 Работник Работодатель A Работодатель B

    Работодатель C Private key
 Public key инф. о событии запись 
 Работодателя A запись 
 Работодателя A валидация валидация валидация Private key
 Public key Identity =
  64. Архитектура системы (обмен записями) 93 Работник Работодатель A Работодатель B

    Работодатель C Private key
 Public key инф. о событии запись 
 Работодателя A запись 
 Работодателя A валидация записи
 еще
 не включенные в блок валидация валидация Private key
 Public key Identity =
  65. Архитектура системы (обмен блоками) 94 Работодатель B Работодатель C Работодатель

    A валидация валидация блок
 Работодателя B блок
 Работодателя B
  66. 95 План • Подписи • Транзакции • Блоки • Структуры

    данных - блокчейн • Merkle Tree • Алгоритмы
  67. 96 План • Подписи • Транзакции • Блоки • Структуры

    данных - блокчейн • Merkle Tree • Алгоритмы
  68. 97 План • Подписи • Транзакции • Блоки • Структуры

    данных - блокчейн • Merkle Tree • Алгоритмы
  69. 98 План • Подписи • Транзакции • Блоки • Структуры

    данных - блокчейн • Merkle Tree • Алгоритмы
  70. 99 План • Подписи • Транзакции • Блоки • Структуры

    данных - блокчейн • Merkle Tree • Алгоритмы
  71. 100 План • Подписи • Транзакции • Блоки • Структуры

    данных - блокчейн • Merkle Tree • Алгоритмы
  72. Подписи 101 protocol DataConvertible { func toData() -> Data }

    struct Signed<T: DataConvertible> { let block: T let signature: Data } protocol SignatureChecker { func verify<T>(_ block: Signed<T>, publicKey: Data) -> Bool } protocol SignatureProvider { func sign<T>(_ signable: T, privateKey: Data) -> Signed<T> } extension Signed: DataConvertible {}
  73. Подписи 102 protocol DataConvertible { func toData() -> Data }

    struct Signed<T: DataConvertible> { let block: T let signature: Data } protocol SignatureChecker { func verify<T>(_ block: Signed<T>, publicKey: Data) -> Bool } protocol SignatureProvider { func sign<T>(_ signable: T, privateKey: Data) -> Signed<T> } extension Signed: DataConvertible {}
  74. Подписи 103 protocol DataConvertible { func toData() -> Data }

    struct Signed<T: DataConvertible> { let block: T let signature: Data } protocol SignatureChecker { func verify<T>(_ block: Signed<T>, publicKey: Data) -> Bool } protocol SignatureProvider { func sign<T>(_ signable: T, privateKey: Data) -> Signed<T> } extension Signed: DataConvertible {}
  75. Подписи 104 protocol DataConvertible { func toData() -> Data }

    struct Signed<T: DataConvertible> { let block: T let signature: Data } protocol SignatureChecker { func verify<T>(_ block: Signed<T>, publicKey: Data) -> Bool } protocol SignatureProvider { func sign<T>(_ signable: T, privateKey: Data) -> Signed<T> } extension Signed: DataConvertible {}
  76. Подписи 105 protocol DataConvertible { func toData() -> Data }

    struct Signed<T: DataConvertible> { let block: T let signature: Data } protocol SignatureChecker { func verify<T>(_ block: Signed<T>, publicKey: Data) -> Bool } protocol SignatureProvider { func sign<T>(_ signable: T, privateKey: Data) -> Signed<T> } CryptoSwift - sha256 SwCrypt - RSA extension Signed: DataConvertible {}
  77. Запись работника Работник Private key
 Public key Событие
 Дата Public

    key работника Public key работодателя Подпись работника Хеш предыдущей записи 107
  78. Запись работника Работник Private key
 Public key Событие
 Дата Public

    key работника Public key работодателя Подпись работника Хеш предыдущей записи - прохождение интервью - прием на работу - увольнение 108
  79. Запись работника (Swift) 109 extension EmployeeBlock: Signable { func toData()

    -> Data { return … } struct EmployeeBlock: DataHashable { let date: Date let employerPublicKey: Data let userPublicKey: Data let event: EmployeeEvent let previousHash: Data let hash: Data }
  80. Запись работодателя Работодатель Private key
 Public key 
 Данные работодателя

    Public key работодателя Подпись работодателя 111 Запись работника
  81. Запись работодателя Работодатель Private key
 Public key 
 Данные работодателя

    Public key работодателя Подпись работодателя 112 Запись работника Опциональные: - отзыв о работе
  82. Запись работодателя (Swift) 113 struct EmployerBlock: DataHashable { let employeeBlock:

    Signed<EmployeeBlock> let employersOpinion: String let employersPublicKey: Data let hash: Data } extension EmployerBlock: Signable { func toData() -> Data { return … }
  83. Merkle tree 116 tx1 hash tx2 hash tx3 hash tx4

    hash tx5 hash tx6 hash tx7 hash tx8 hash
  84. Merkle tree 117 tx1 hash tx1tx2 hash = sha256(tx1hash +

    tx2hash) A = tx1tx2 hash B = tx3tx4 hash C = tx5tx6 hash D = tx7tx8 hash tx2 hash tx3 hash tx4 hash tx5 hash tx6 hash tx7 hash tx8 hash
  85. Merkle tree 118 AB hash CD hash tx1 hash tx1tx2

    hash = sha256(tx1hash + tx2hash) A = tx1tx2 hash B = tx3tx4 hash C = tx5tx6 hash D = tx7tx8 hash tx2 hash tx3 hash tx4 hash tx5 hash tx6 hash tx7 hash tx8 hash
  86. Merkle tree 119 root hash AB hash CD hash tx1

    hash tx1tx2 hash = sha256(tx1hash + tx2hash) A = tx1tx2 hash B = tx3tx4 hash C = tx5tx6 hash D = tx7tx8 hash tx2 hash tx3 hash tx4 hash tx5 hash tx6 hash tx7 hash tx8 hash
  87. Merkle tree 120 root hash AB hash CD hash tx1

    hash A = tx1tx2 hash B = tx3tx4 hash C = tx5tx6 hash D = tx7tx8 hash tx2 hash tx3 hash tx4 hash tx5 hash tx6 hash tx7 hash tx8 hash
  88. Merkle tree 121 root hash AB hash CD hash tx1

    hash A = tx1tx2 hash B = tx3tx4 hash C = tx5tx6 hash D = tx7tx8 hash tx2 hash
  89. 123 Genesis block Block 2 Как хранить блоки? Block 3’

    Block 3 Массив листьев, каждый элемент хранит указатель на родителя вплоть до первого блока
  90. Структуры данных - блокчейн 124 private var orphanBlocks: [Data: BlockchainBlock]

    = [:] private var orphanTransactions: [Data: Signed<EmployerBlock>] = [:] private var unprocessedTransactions: [Data: Signed<EmployerBlock>] = [:] private var leafNodes: [ParentTreeNode<BlockchainBlock>] = []
  91. Структуры данных - блокчейн 125 private var orphanBlocks: [Data: BlockchainBlock]

    = [:] private var orphanTransactions: [Data: Signed<EmployerBlock>] = [:] private var unprocessedTransactions: [Data: Signed<EmployerBlock>] = [:] private var leafNodes: [ParentTreeNode<BlockchainBlock>] = []
  92. Структуры данных - блокчейн 126 private var orphanBlocks: [Data: BlockchainBlock]

    = [:] private var orphanTransactions: [Data: Signed<EmployerBlock>] = [:] private var unprocessedTransactions: [Data: Signed<EmployerBlock>] = [:] private var leafNodes: [ParentTreeNode<BlockchainBlock>] = []
  93. Структуры данных - блокчейн 127 private var orphanBlocks: [Data: BlockchainBlock]

    = [:] private var orphanTransactions: [Data: Signed<EmployerBlock>] = [:] private var unprocessedTransactions: [Data: Signed<EmployerBlock>] = [:] private var leafNodes: [ParentTreeNode<BlockchainBlock>] = []
  94. Структуры данных - блокчейн 128 private var orphanBlocks: [Data: BlockchainBlock]

    = [:] private var orphanTransactions: [Data: Signed<EmployerBlock>] = [:] private var unprocessedTransactions: [Data: Signed<EmployerBlock>] = [:] private var leafNodes: [ParentTreeNode<BlockchainBlock>] = []
  95. Добавление цепи 136 Genesis block Block 2 Block 3 Block

    4 Block 3’ Block 3’’ Block 4’’ Block 2 Block 5’’
  96. Добавление цепи 137 Genesis block Block 2 Block 3 Block

    4 Block 3’ Block 3’’ Block 4’’ Block 2 Block 5’’
  97. Добавление цепи 138 Genesis block Block 2 Block 3 Block

    4 Block 3’ Block 3’’ Block 4’’ Block 2 Block 5’’
  98. Добавление цепи 139 Genesis block Block 2 Block 3 Block

    4 Block 3’ Block 3’’ Block 4’’ Block 2 Block 5’’
  99. Добавление цепи 140 Genesis block Block 2 Block 3 Block

    4 Block 3’ Block 3’’ Block 4’’ Block 5’’