Сложно ли построить блокчейн с нуля?

Опубликовано: 21/01/2021 Время на прочтение: 11 минут

Фото Даниэля фон Аппена на Unsplash

В Интернете есть множество ресурсов по блокчейну, но трудно понять их как новичков в этой быстро развивающейся технологии. однако эта статья немного отличается.

В Тхи сек статье я шаг ребенка с вами, и вы поймете основные понятия blockchain и как программировать один с помощью Python, J avascript или Go (Golang).

Я выбрал эти языки, потому что большинство людей с ними знакомо, особенно javascript и python. Но для скорости, выносливости и безопасности большинство основных механизмов блокчейна встроены в c / c ++ (Bitcoin, EOS), Go (Hyperledger Fabric, Ethereum), Java (Ethereum) и / или Ruby (Ethereum), а затем обеспечивают привязки к другим простым -использовать языки программирования.

Кроме того, некоторые движки блокчейнов сочетают в себе множество языков программирования для обеспечения надежности и простоты использования для разработчиков, Ethereum — лучший вариант использования.

Предпосылки:

  • Сеть
  • Криптография
  • Структура данных и алгоритмы
  • Распределенные системы
  • Javascript / Go / Python

Вам нужны только базовые концепции, которые можно разработать с использованием любого надежного языка программирования.

  1. Что такое блокчейн?

Вы не можете запрограммировать то, чего не понимаете, верно? Давайте разберемся, блокчейн — это не биткойн , блокчейн — это не цифровая валюта , блокчейн — это набор различных технологий, которые уже существовали раньше .

Так это человек с блокчейном?

Нет, терпи меня ».

Давайте упростим ситуацию на примере, потому что инженеры лучше разбираются в цифрах.

Возьмем базу данных MySQL, в которой хранится некоторая информация.

Автор: Ндай Синай

С помощью указанной выше базы данных мы можем:

  1. Выполните некоторые операции CRUD (создание, получение, обновление и удаление),
  2. Сохраните одну и ту же информацию дважды,
  3. Отбросить всю базу данных,
  4. Мы не можем передавать конфиденциальную информацию другим лицам,
  5. БД может быть централизованной (единая точка отказа, проблема безопасности),
  6. Невозможно доверять всему, что в нем хранится.
  7. Некоторые базы данных могут допускать отношения между таблицами (например, СУБД), а другие не могут этого допускать (например, базы данных NoSQL),
  8. База данных может быть взорвана злонамеренными людьми
  9. Нужен менеджер БД (он / она может изменить или скомпрометировать информацию)
  10. У пользователей нет власти над своими данными
  11. И т.д…

Так зачем, если нам нужно что-то другое, что-то надежное, что-то независимое от людей, что-то автоматическое, что-то неизменное? вот где вступает в действие блокчейн.

Блокчейн — это безопасная, надежная децентрализованная база данных и сеть в одном устройстве😎.

«Истину можно найти только в одном месте: в коде. ”

Блокчейн — это цепочка блоков, блоки похожи на таблицы в базе данных, но их нельзя удалить или обновить, блоки содержат информацию, называемую транзакциями, и другие дополнительные данные. блоки криптографически проверяются и объединяются в неизменяемую цепочку блоков, называемую цепочкой блоков или реестром .

Автор: Ндай Синай

Затем та же цепочка распределяется по всем узлам в сети через сеть P2P.

Автор: Ндай Синай

Таким образом, вместо централизованной базы данных все транзакции (данные), совместно используемые узлами, содержатся в блоках, которые объединяются в цепочку для создания реестра. Этот реестр представляет все данные в цепочке блоков. Все данные в реестре защищены криптографическим хешированием и цифровой подписью и проверяются алгоритмом консенсуса . Узлы в сети участвуют, чтобы гарантировать, что все копии данных, распределенные по сети, одинаковы.

5 ключевых концепций, которые следует помнить в экосистеме блокчейн:

  1. Криптографический хеш и цифровая подпись
  2. Неизменяемый реестр
  3. P2P сеть
  4. Алгоритм консенсуса (PoW, PoS, PBFT, ETc…)
  5. Проверка блока (горное дело, ковка и т. Д.)

Я объясню эти концепции более подробно по ходу дела.

Преимущества использования блокчейна:

  1. Удалить организации-посредники
  2. Неизменяемый реестр
  3. Прозрачность
  4. безопасность

Когда использовать блокчейн?

блокчейн — это не серебряная пуля, поэтому используйте его, когда:

  1. Сохраненные данные не должны быть изменены (подтверждение существования)
  2. Данные не могут быть отклонены их владельцем (неотказ от авторства)
  3. Вы хотите децентрализации
  4. Вам нужен один источник правды
  5. Вы хотите высокой безопасности
  6. Вы не заботитесь о скорости (например, биткойну в среднем требуется 10 минут для проверки блока транзакций)

Примеры использования блокчейна

блокчейн выходит за рамки криптовалюты и биткойнов, блокчейн может использоваться в разных секторах:

  • Недвижимость: Земля в собственности
  • Здравоохранение: надежно записывайте данные пациента
  • Финансы: снижение налогов и посредников, борьба с отмыванием денег, трансграничные платежи
  • Цепочка поставок: отслеживание статей от поставщиков до клиентов (подлинность, создание оригинального контента)
  • Кибербезопасность: DDOS-атаки
  • Возвращение возможностей пользователю: владейте своими данными и делитесь ими безопасно, с кем хотите (DID)
  • Обмен криптовалюты
  • Механизм голосования

Платформы и приложения Blockchain

  • Биткойн
  • Ethereum
  • Ткань
  • EOS
  • И т.д…

Типы блокчейнов

  • Личное: используйте только для внутреннего использования и когда мы лучше знаем пользователей (например, Hyperledger Fabric).
  • Публично: все могут видеть, что происходит (Биткойн, Эфириум)
  • Гибрид: на случай, если вы хотите объединить первые два.

«Разговоры дешевы. Покажи мне код ». 😄

Есть два способа построить блокчейн:

  • Самый простой — использовать существующие готовые открытые источники блокчейна, такие как Ethereum, Fabric, EOS и т. Д. (Возможно, я сделаю одну статью по этому поводу)
  • Если ни один из них не соответствует вашим требованиям, создайте свой с нуля

В этой серии мы создадим его с нуля, чтобы вы могли полностью понять машину состояний блокчейна.

2. Как построить?

Хорошо, давайте теперь создадим первый детский блокчейн на трех разных языках программирования: Go, Python и Javascript . Эти прототипы могут помочь вам понять концепции, которые мы описали ранее.

Во-первых, мы создадим блок , во-вторых, мы добавим к нему данные (заголовок и тело) , в-третьих, мы будем хешировать блок и, наконец, что не менее важно, мы объединим все блоки в цепочку.

Блок содержит информацию, упомянутую ранее, но для упрощения мы собираемся удалить некоторые из них. углубимся в специфику!

In Go

Надеюсь, вы знакомы с программированием на Go, как я упоминал ранее, если не попытаетесь изучить основы: функции, методы, типы данных, структуры, элементы управления потоком, итерации и т. Д.

Создайте папку и добавьте в нее 2 файла, main.go и block.go

Структура папки:

go // папка
main.go // файл 1
block.go // файл 2

main.go

// используем основной пакет
package main
// импортируем fmt package import ( «fmt» ) func main () { fmt.Println («Я строю свой первый блокчейн») // распечатываем этот CreateBlock («Здесь будет показан слушатель», «тело будет показано здесь «) // вызов функции, которая создаст блок и передаст в него некоторые параметры. }

Если вы запустите эту программу, она покажет ошибку, потому что функция CreateBlock еще не определена, поэтому продолжайте и создайте ее в block.go

block.go

package main import ( «fmt» // это поможет нам печатать на экране ) func CreateBlock (Header, Body string) { fmt.Println (Header, » n», Body) // Показать содержимое блока }

Прелесть Go в том, что вам не нужно импортировать или экспортировать функции, просто объявляйте их заглавными буквами, и Go найдет их для вас😃. теперь откройте терминал и перейдите в созданную папку, запустите go build, затем запустите. go в Windows, ./go в Linux и Macbook.

Ндай Кабуло Синай

Мы только что создали простую программу Go, которая вызывает функцию и передает некоторые строковые данные. Давайте продолжим и сделаем еще приятные вещи. давайте добавим еще 2 файла, blockchain.go и structure.go, так что теперь у нас есть 4 файла: main.go, block.go, structure.go и blockchain.go

Я буду добавлять к каждой строке кода несколько комментариев, чтобы вы поняли, что я делаю.

структуры.go

package main // Импортируем основной пакет // Создаем структуру данных Block // Блок содержит эту информацию: type Block struct { Timestamp int64 // время создания блока PreviousBlockHash [] byte // хэш предыдущего блока MyBlockHash [] byte // хэш текущего блока AllData [] byte // данные или транзакции (информация о теле) } // Подготовка структуры данных Blockchain: type Blockchain struct { Blocks [] * Block // помните, что цепочка блоков серия блоков }

block.go

package main import ( // Нам понадобятся эти библиотеки: «байты» // нужно преобразовать данные в байты для отправки по сети, компьютер лучше понимает байтовый (8-битный) язык «crypto / sha256» // крипто-библиотека для хеширования данных «strconv» // для преобразования «time» // время для нашей временной метки ) // Теперь давайте создадим метод для генерации хеш-кода блока // Мы просто объединим все данные и хэшируем их, чтобы получить хэш блока func (block * Block) SetHash () { timestamp: = [] byte (strconv.FormatInt (block.Timestamp, 10)) // получить время и преобразовать его в уникальную серию заголовков цифр : = байты. Join ([] [] byte {timestamp, block.PreviousBlockHash, block.AllData}, [] byte {}) // объединяем хэш данных всех блоков : = sha256.Sum256 (заголовки) // хэш целого блока. MyBlockHash = hash [:] // теперь устанавливаем хэш блока } // Создаем функцию для генерации нового блока и возвращаем этот блок func NewBlock (строка данных, prevBlockHash [] byte) * Block { block: = & Block {time.Now () .Unix (), prevBlockHash, [] byte {}, [] byte (data)} // блок получен block.SetHash () // блок хэширован return block // блок возвращается со всей информацией в нем } / * давайте теперь создадим функцию блока генезиса, которая вернет первый блок. Генезисный блок — это первый блок в цепочке * / func NewGenesisBlock () * Block { return NewBlock («Genesis Block», [] byte {}) // генезисный блок создается с некоторыми данными в нем }

blockchain.go

package main // создаем метод, который добавляет новый блок в блокчейн func (blockchain * Blockchain) AddBlock (data string) { PreviousBlock: = blockchain.Blocks [len (blockchain.Blocks) -1] // предыдущий блок необходим , так что давайте возьмем это newBlock: = NewBlock (data, PreviousBlock.MyBlockHash) // создаем новый блок, содержащий данные и хэш предыдущей цепочки блоков.Blocks = append (blockchain.Blocks, newBlock) // добавляем этот блок в цепочка для создания цепочки блоков } / * Создайте функцию, которая возвращает всю цепочку блоков, и сначала добавьте к ней генезис. блок генезиса — это первый добытый блок, поэтому давайте создадим функцию, которая вернет его, поскольку он еще не существует * / func NewBlockchain () * Blockchain {// функция создана return & Blockchain {[] * Block {NewGenesisBlock ( )}} // генезис-блок добавляется в цепочку первым }

main.go

// Пора собрать все вместе и протестировать основной импорт пакета ( «fmt» // только для печати чего-либо на экране ) func main () { newblockchain: = NewBlockchain () // Инициализировать блокчейн // создать 2 блока и добавить 2 транзакции newblockchain.AddBlock («первая транзакция») // первый блок, содержащий один tx newblockchain.AddBlock («Вторая транзакция») // второй блок, содержащий один tx // Теперь распечатайте все блоки и их содержимое для _, block: = range newblockchain.Blocks {// итерация для каждого блока fmt.Printf («Хеш блока% x n», block.MyBlockHash) // вывод хеш- кода блока fmt.Printf («Хеш предыдущего блока:% x n «, block.PreviousBlockHash) // распечатать хэш предыдущего блока fmt.Printf (» Все транзакции:% s n «, block.AllData) // распечатать транзакции } // наша цепочка блоков будет напечатана }

Давайте запустим его сейчас, а затем иди и построй. Go

Результат: Ндай Синай

Вуаля! Легко, правда?

К сожалению, наши блоки в цепочке блоков не имеют идентификаторов и временных меток, поэтому давайте добавим эту информацию, изменив файл main.go, тогда файл будет выглядеть так:

// Пора собрать все вместе и протестировать основной импорт пакета ( «fmt» // только для печати чего-либо на экране ) func main () { newblockchain: = NewBlockchain () // Инициализировать блокчейн // создать 2 блока и добавить 2 транзакции newblockchain.AddBlock («первая транзакция») // первый блок, содержащий один tx newblockchain.AddBlock («Вторая транзакция») // второй блок, содержащий один tx // Теперь распечатайте все блоки и их содержимое для i, block: = range newblockchain.Blocks {// итерация для каждого блока fmt.Printf («ID блока:% d n», i) // печать идентификатора блока fmt.Printf («Timestamps:% d n», block.Timestamp + int64 (i)) // выводим метку времени блока, чтобы сделать их разными, мы просто добавляем значение i fmt.Printf («Хеш блока:% x n», block.MyBlockHash) // выводим хеш блок fmt.Printf («Хеш предыдущего блока:% x n», block.PreviousBlockHash) // распечатать хэш предыдущего блока fmt.Printf («Все транзакции:% s n», block.AllData ) // распечатываем транзакции } // наш блокчейн будет напечатан }

Сохраняем код и снова запускаем, идем сборка, запускаем ./go

Окончательный результат: Ндай Синай

Как видите, блокчейн хорошо структурирован. За исключением блока генезиса, каждый блок содержит свой хэш и хеш предыдущего блока, что делает его неизменяемым. Если данные в блоке изменены, хеш автоматически изменится, и блок будет отброшен. У блока генезиса нет предыдущего хеша, потому что он первый, предыдущего блока нет.

Все сделано! поздравляю, вы только что создали свой детский блокчейн в Go 😉

В следующих эпизодах мы будем постепенно выполнять требования блокчейна. Блокчейн — это шедевр, который нужно спроектировать так, как он должен быть.

Щелкните здесь, чтобы увидеть версию Javascript.

«А Blockchain инженер это профессионал , который понимает , тщательно принципы blockchain, безопасности и программного обеспечения для проектирования, разработки, технического обслуживания, испытаний и оценки blockchain основных двигателей и программного обеспечения , в то время как Blockchain Разработчик является профессионалом , который строит программу на blockchain , что работает на разных типах компьютеров. Большинство разработчиков блокчейнов используют открытые платформы и фреймворки блокчейнов, такие как ethereum, hyperledger fabric, EOS и т. Д. »

Кем ты хочешь быть?

Если вы обнаружите опечатки или ошибки при запуске кода, свяжитесь со мной:

LinkedIn: Синай Ндай Кабуло

Insta: sinai_nk



прокрутка вверх