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