Якщо ми подивимося на тенденції останніх кількох років, то ми постійно чули про блокчейн, але не дуже багато про особливості.
Ми всі знаємо, що такі криптовалюти, як Bitcoin, Ethereum, Dogecoin, Matic та інші, покладаються на технологію блокчейн. Блокчейн очолив значні події, які революціонізували численні галузі у 2021 році та проклали шлях до нових досягнень.
Блокчейн — це засіб зберігання даних у спосіб, який важко або неможливо відредагувати, зламати чи обдурити. Це цифровий реєстр транзакцій, які дублюються і поширюються по всій мережі комп’ютерних систем блокчейну.
Це новаторська технологія баз даних, яка працює практично на всіх криптовалютах. Блокчейн робить неймовірно складним зламати або обдурити систему, поширюючи ідентичні копії бази даних по всій мережі.
Хоча зараз біткойн є найпоширенішим використанням блокчейну, ця технологія може служити дуже широкому спектру застосувань.
Криптовалюти та блокчейни стають все більш популярними в останні роки, і очікується, що ця тенденція збережеться.
У цьому підручнику ми створимо простий блокчейн з JavaScript. Це дасть вам базове розуміння того, як працює блокчейн.
Давайте назвемо це MelodyCoin і приступимо до дії!
Створення блоку
Для початку ми створимо новий файл JavaScript, в який розмістимо весь наш код.
Давайте назвемо його main.js і почнемо з опису того, як мають виглядати блокчейн і блоки.
Створіть клас Block і надайте йому функцію Object() { [власний код] } для початку.
Ви повинні вказати дату та хеш попереднього блоку під час створення нового блоку:
Ось визначення для кожної властивості:
- Мітка часу вказує, коли був створений блок. Ви можете використовувати будь-який формат, який ви виберете (у цьому випадку, мітка часу UNIX).
- Будь-яка форма даних, яку ви бажаєте підключити до цього блоку, може бути включена в параметр data. Якщо ви хочете створити криптовалюту, ви можете зберігати дані транзакції, такі як відправник/одержувач і сума грошей, переміщена тут.
- Попередній хеш — це рядок, який містить хеш попереднього блоку. Це те, що створить ланцюжок блоків, які будуть мати вирішальне значення для забезпечення цілісності нашого блокчейну пізніше.
Створення хешів
Кожен блок посилається на попередній блок (тому властивість previousHash). Тобто для кожного блоку потрібен хеш. Хеш схожий на відбиток пальця. Для кожного блоку він індивідуальний.
Хеш блоку можна обчислити, передаючи весь його вміст через хеш-функцію.
Отже, почнемо з реалізації функції, яка обчислює хеш поточного блоку.
Отже, у класі Block ми визначаємо функцію обчислення Hash:
Однак хеш SHA256 не підтримується JavaScript і має бути отриманий із зовнішньої бібліотеки.
Crypto-js — це фантастичний пакет, який включає безпечні реалізації кількох алгоритмів хешування.
Потім ми можемо імпортувати його в наш код main.js.
Тепер, коли у нас є наша функція обчисленняHash(), давайте використаємо її у нашій функції Block:
Після опису того, як виглядає блок, ми можемо визначити, як має виглядати блокчейн. Тож давайте створимо новий клас.
У цьому сценарії блокчейн є дуже простим об’єктом, який має ланцюжок властивостей. Це масив, що містить усі блоки в ланцюжку.
Перш ніж ми зможемо додавати блоки, ми повинні спочатку створити те, що відомо як «блок генезису». Це перший блок у ланцюжку, і він унікальний тим, що не може вказувати на попередній блок (він перший!).
Отже, щоб побудувати блок genesis, я додам функцію до нашого класу під назвою createGenesisBlock (). Поверніться до функції Object() { [власний код] } нашого класу Blockchain.
Тепер ми можемо включити блок genesis будь-коли, коли створюємо новий екземпляр Blockchain:
Методи блокчейна
Тепер давайте додамо методи до нашого класу Blockchain, які дозволять нам робити такі речі, як додавати нові блоки та отримувати останній блок.
Функція getLatestBlock є найпростішою. Він просто повертає кінцевий член масиву ланцюга:
Техніка addBlock трохи більш задіяна.
Перш ніж ми зможемо додати новий блок до нашого ланцюжка, ми повинні спершу належним чином встановити попереднє поле хеша цього блоку.
Він повинен бути встановлений на хеш останнього доданого блоку до нашого ланцюжка. Нам також потрібно обчислити хеш нового блоку:
Тестування
Давайте подивимося, як вийшов наш MelodyCoin.
Для цього створіть екземпляр блокчейну. Додамо ще пару блоків:
Ми зробили там два нових блоки. Давайте подивимося, як зараз виглядає наш блокчейн.
MelodyCoin буде зведено до рядків і відформатовано з чотирма пробілами:
Перевірте цілісність блокчейна
Блокчейни є фантастичними, тому що після додавання блоку його неможливо змінити, не скасувавши залишок ланцюжка.
Однак у мене немає способу перевірити цілісність нашого блокчейну за допомогою цієї реалізації.
Давайте введемо функцію isChainValid в наш блокчейн. Якщо ланцюжок є законним, він поверне true; інакше він поверне false:
Перевірка цілісності
Тепер ми можемо перевірити цілісність нашого блокчейну. Якщо ми виконаємо його зараз, це підтвердить, що наш ланцюжок справжній.
Давайте тепер спробуємо підробити наш блокчейн. Давайте змінимо блок 2 і перезапишемо його вміст (припустимо, ми передали 100 монет замість чотирьох).
Коли ми виконуємо це, ми бачимо, що програмне забезпечення розпізнає наші зусилля по втручанню в ланцюжок.
Однак ви можете повірити, що для мене є інший спосіб втрутитися в це. Я змінив вміст у блоці, але не перерахував хеш. Тож ви можете спробувати проявити кмітливість і перерахувати хеш цього самого блоку.
Це все, що було в нашій крихітній установці блокчейну! Це дозволяє нам додавати нові блоки та виявляти підробку даних у ланцюжку.
Є дві проблеми з нашим невеликим блокчейном, які ми повинні вирішити:
- Сучасні комп’ютери надзвичайно швидкі і можуть додати тисячі блоків до нашого ланцюжка за секунди. Ми, очевидно, не хочемо, щоб хтось розсилав наш блокчейн.
- Наш блокчейн все ще вразливий для фальсифікації. Ви можете оновити вміст блоку, а потім просто перерахувати хеші (і попередні хеші) для всіх наступних блоків. Навіть якщо ви з цим возитесь, ви отримаєте законний ланцюг.
Для вирішення цих проблем блокчейни використовують техніку, відому як «доказ роботи». Ви повинні продемонструвати, що ви використали значну кількість обчислювальних ресурсів для створення блоку за допомогою цього підходу. Це також називається видобуток.
Підтвердження роботи вимагає, щоб хеш блоку починався з певної кількості нулів. Але як дізнатися, чи відповідає ваш хеш цьому правилу?
Вміст блоку визначає його хеш. Тому ми завжди отримуємо той самий хеш, за умови, що ми не змінюємо вміст.
Кожен блок повинен мати значення nonce, додане до нього як рішення. По суті, це деякі випадкові дані, які ми можемо оновлювати, поки хеш нашого блоку не почнеться з достатньої кількості нулів. Оскільки ви не можете змінити вихід хеш-функції, вам доведеться протестувати багато різних комбінацій і сподіватися на краще.
Ознайомтеся з майнінгом у блокчейні
Давайте почнемо з того, що включимо одноразовий номер до нашого класу Block. Одноразове значення — це єдине значення в нашому блоці, яке ми можемо змінити, щоб вплинути на хеш блоку.
Ми не можемо змінити мітку часу чи дані.
Далі давайте напишемо функцію mineBlock(), яка буде здійснювати фактичний видобуток блоку. Ця функція буде надіслана потрібну складність як параметр і продовжуватиме виконуватися, доки хеш нашого блоку не почнеться з достатньою кількістю нулів.
Я щойно створив базовий цикл while, який працюватиме до тих пір, поки наш хеш не почнеться з достатньою кількістю нулів. Ми використовуємо складність, щоб визначити, скільки нулів потрібно. При складності 5 наш хеш повинен починатися з 5 нулів.
Коли наш хеш не містить достатньо нулів, ми підвищуємо одноразовий термін на одиницю і перераховуємо хеш. І якщо ми знаходимо хеш, який відповідає складності, ми реєструємо його на консолі.
Є ще одна річ, яку нам потрібно зробити. Ми насправді не беремо до уваги змінну nonce в нашому методі CalculateHash, тому ось вона:
Клас блокчейн
Давайте перевіримо цей новий підхід у нашому класі блокчейну і подивимося, як він піде.
Для початку я визначу складність нашого блокчейну у функції Object(). Ми визначаємо його тут, оскільки ми можемо використовувати його десь пізніше.
Потім функцію addBlock потрібно змінити таким чином, щоб вона видобувала блок перед додаванням його в наш ланцюжок.
Використовуйте блокчейн
Тепер давайте використаємо наш новий блокчейн з алгоритмом підтвердження роботи. Тут додайте пару операторів console.log.
Коли ми виконуємо цей код, ми можемо помітити, що процес видобутку більше не є особливо швидким.
Алгоритму потрібен деякий час, щоб згенерувати блоки з хешами, які починаються з трьох нулів (як налаштовано за складністю).
Отже, на цьому наша базова настройка блокчейну завершилася.
Ми можемо регулювати, як швидко нові блоки додаються в наш блокчейн завдяки механізму підтвердження роботи.
Це найважливіша функція безпеки в блокчейнах. А тепер, коли ви зрозуміли, як це працює, приступайте до створення власного!
залишити коментар