Да ли сте знали да је Биткоин саздан на принципима блокчејн технологије? Данас ћемо заједно, корак по корак, изградити једноставан блокчејн користећи програмски језик Пајтон.
Шта је то блокчејн?
Године 2008, непознати аутор или група под псеудонимом Сатоши Накамото објавили су Биткоин рад. Биткоин се појавио као дигитална валута која омогућава директне трансакције између корисника, заобилазећи традиционалне финансијске посреднике попут банака. Оно што већина људи не зна, јесте да је у истом том раду Сатоши дефинисао и дистрибуирани начин чувања података, који данас познајемо као блокчејн.
Блокчејн технологија
У најједноставнијим терминима, блокчејн је јавна, непроменљива дигитална књига која евидентира трансакције на децентрализованој мрежи рачунара.
Блокчејн се може разумети кроз два основна појма:
- Блок: Простор за складиштење података о трансакцијама.
- Ланац: Низ повезаних блокова.
Дакле, блокчејн је ланац повезаних блокова, где сваки блок садржи трансакције које су извршене са одређеним параметрима.
Сваки блок се надовезује на претходни, формирајући непроменљив низ. Другим речима, сваки блок зависи од свог претходника. Ова структура обезбеђује поуздан и транспарентан систем, где свако са одговарајућим приступом може проверити интегритет података.
Блокчејн доноси низ кључних предности:
- Историја података је непромењива.
- Подаци су трајно сачувани.
- Нема могућности грешке са сачуваним подацима.
Бројни системи данас користе блокчејн, укључујући криптовалуте, трансфер власништва (НФТ) и, вероватно у будућности, гласачке системе.
Важно је напоменути да Пајтон имплементација блокчејна не мора да буде сложен програм са хиљадама линија кода. У суштини, то је листа трансакција која је међусобно повезана.
Ово је био кратак увод, али ако желите детаљније објашњење, направили смо комплетан водич за почетнике. Обавезно га погледајте.
Без даљег одлагања, кренимо са изградњом једноставног блокчејна у Пајтону.
Креирање блокчејна користећи Пајтон
Пре него што почнемо са кодирањем, дефинишимо наше циљеве:
- Израдићемо једноставан систем блокчејна у Пајтону.
- Користићемо наш блокчејн са претходно дефинисаним трансакцијама, које ће бити представљене као текстуални низови.
- Тестираћемо непроменљивост нашег блокчејна.
Нећемо користити Џејсон, већ Пајтон листе. Ово ће нам помоћи да поједноставимо процес и фокусирамо се на кључне концепте блокчејна.
Шта вам је потребно да бисте пратили овај водич:
Израда класе Блок
Отворите свој омиљени уређивач кода и креирајте фајл `main.py`. То ће бити фајл у коме ћемо радити.
Сада учитајте `hashlib`, модул који омогућава креирање једносмерних шифрованих порука. Криптографске технике попут хеширања омогућавају да блокчејн креира сигурне трансакције.
Функција хеширања је алгоритам који преузима податке (обично кодирани стринг) и враћа јединствену ознаку, која се често назива „дигест“ или „потпис“. Ова ознака је од изузетне важности; са функцијом хеширања, чак и мала промена у улазу ствара потпуно другачији излазни идентификатор. Касније ћемо видети то у пракси.
За сада, само учитајте уграђени модул `hashlib`:
# main.py file """ A simple Blockchain in Python """ import hashlib
Овај модул укључује већину алгоритама хеширања који су вам потребни. Важно је запамтити да ћемо користити функцију `hashlib.sha256()`.
Сада пређимо на `GeekCoinBlock`, наше потпуно оригинално име за блокчејн.
class GeekCoinBlock: def __init__(self, previous_block_hash, transaction_list): self.previous_block_hash = previous_block_hash self.transaction_list = transaction_list self.block_data = f"{' - '.join(transaction_list)} - {previous_block_hash}" self.block_hash = hashlib.sha256(self.block_data.encode()).hexdigest()
Знам да ово може изгледати компликовано. Хајде да размотримо сваки део у наставку.
Објашњење класе GeekCoinBlock
Прво, креирамо класу под називом `GeekCoinBlock`, која представља објект са одређеним карактеристикама (атрибутима) и понашањима (методама).
Затим дефинишемо метод `__init__` (конструктор), који се позива сваки пут када се креира нови `GeekCoinBlock` објект.
Овај метод прима три параметра:
- `self` (инстанца сваког објекта)
- `previous_block_hash` (референца на хеш претходног блока)
- `transaction_list` (листа трансакција у текућем блоку).
Чувамо претходни хеш и листу трансакција и креирамо променљиву инстанце `block_data` као текстуални низ. У правим криптовалутама, ове податке чувамо као хеш, али ради једноставности, у нашем случају ћемо податке блока чувати као текст.
На крају, креирамо `block_hash`, који ће други блокови користити да се надовежу на ланац. Овде `hashlib` долази у игру; уместо да креирамо сопствену функцију хеширања, можемо користити унапред изграђену функцију `sha256` да би креирали непроменљиве блокове.
Ова функција прима кодиране стрингове (или бајтове) као параметре. Зато користимо метод `block_data.encode()`. Након тога, позивамо `hexdigest()` да вратимо кодиране податке у хексадецималном облику.
Знам да све ово може деловати збуњујуће, па хајде да се мало поиграмо са `hashlib` у Пајтон интерпретатору.
In [1]: import hashlib In [2]: message = "Python is great" In [3]: h1 = hashlib.sha256(message.encode()) In [4]: h1 Out[4]: <sha256 ... object @ 0x7efcd55bfbf0> In [5]: h1.hexdigest() Out[5]: 'a40cf9cca ... 42ab97' In [6]: h2 = hashlib.sha256(b"Python is not great") In [7]: h2 Out[7]: <sha256 ... object @ 0x7efcd55bfc90> In [8]: h2.hexdigest() Out[8]: 'fefe510a6a ... 97e010c0ea34'
Као што видите, мала промена у улазу попут „Python is great“ у „Python is not great“ резултира потпуно другачијим хешом. Ово је кључно за интегритет блокчејна. Ако мало измените блок у блокчејну, његов хеш ће се драстично променити. Зато је тврдња „Не можете сломити блокчејн“ тачна.
Коришћење наше класе Блок
Касније ћемо изградити целу класу `Blockchain`, али за сада, користимо нашу класу `Block` да створимо ланац блокова (блокчејн).
У истом фајлу креирајте неколико трансакција састављених од једноставних низова, на пример:
class GeekCoinBlock: ... t1 = "Noah sends 5 GC to Mark" t2 = "Mark sends 2.3 GC to James" t3 = "James sends 4.2 GC to Alisson" t4 = "Alisson sends 1.1 GC to Noah"
Наравно, GC се односи на `GeekCoin`.
Сада креирајте први блок нашег блокчејна користећи класу `GeekCoinBlock` и одштампајте његове атрибуте. Запамтите да ће параметар `previous_hash` блока генезе (првог блока) бити произвољан стринг или хеш, у овом случају „firstblock“.
block1 = GeekCoinBlock('firstblock', [t1, t2]) print(f"Block 1 data: {block1.block_data}") print(f"Block 1 hash: {block1.block_hash}")
Затим урадимо исто са другим блоком, али проследимо хеш првог блока као аргумент `previous_hash`.
block2 = GeekCoinBlock(block1.block_hash, [t3, t4]) print(f"Block 2 data: {block2.block_data}") print(f"Block 2 hash: {block2.block_hash}")
Покренимо код и погледајмо шта добијамо. Укуцајте у терминал:
❯ python main.py Block 1 data: Noah sends 5 GC to Mark - Mark sends 2.3 GC to James - firstblock Block 1 hash: 01e4e15242a9601725f4a86ca01fbddaaec7105b442955bb0efcadbfc759806d Block 2 data: James sends 4.2 GC to Alisson - Alisson sends 1.1 GC to Noah - 01e4e15242a9601725f4a86ca01fbddaaec7105b442955bb0efcadbfc759806d Block 2 hash: 448c4306caf7f6937b0307f92f27fbea3bb73b3470363dee5026a1209dadcfa8
За сада видите само текст и хеш од око 64 карактера, али ово је срж механизма блокчејна.
Почињете са блоком генезе, основом свих осталих блокова.
Свако може да потврди интегритет ланца, и зато је блокчејн тако сигуран систем. На пример, ако мало изменимо садржај трансакције:
t2 = "Mark sends 2.3 GC to James" -> t2 = "Mark sends 3.2 GC to James"
Приметићемо драстичну промену у хешевима блокова.
Block 1 data: Noah sends 5 GC to Mark - Mark sends 3.2 GC to James - firstblock Block 1 hash: 7a990bf1d70230bf2dad6160496c0b3046da7a17b1281fd1d4c63d4eac58e78c Block 2 data: James sends 4.2 GC to Alisson - Alisson sends 1.1 GC to Noah - 7a990bf1d70230bf2dad6160496c0b3046da7a17b1281fd1d4c63d4eac58e78c Block 2 hash: 569b977306ce88b53e001dca7ba00c03a51c60d6df4650e7657dcd136f2da0ac
Овај тренутни пројекат можете видети у ГитХаб репозиторијуму.
Кодирање блокчејна
Није паметно да наш системски интегритет зависи од ручно кодираних променљивих, па је потребан други приступ.
Имамо блокове. Сада је време да направимо класу која ће их повезати у блокчејн.
Почнимо са брисањем претходних трансакција и објеката блокова и користимо код испод.
# main.py class Blockchain: def __init__(self): self.chain = [] self.generate_genesis_block() def generate_genesis_block(self): self.chain.append(GeekCoinBlock("0", ['Genesis Block'])) def create_block_from_transaction(self, transaction_list): previous_block_hash = self.last_block.block_hash self.chain.append(GeekCoinBlock(previous_block_hash, transaction_list)) def display_chain(self): for i in range(len(self.chain)): print(f"Data {i + 1}: {self.chain[i].block_data}") print(f"Hash {i + 1}: {self.chain[i].block_hash}n") @property def last_block(self): return self.chain[-1]
Опет, ово је велики комад кода. Размотримо сваки део:
- `self.chain` – Листа у коју се чувају сви блокови. Сваком блоку можемо приступити помоћу индекса листе.
- `generate_genesis_block` – Додаје генезу или први блок у ланац. Претходни хеш блока је „0“, а листа трансакција је једноставно „Genesis Block“.
- `create_block_from_transaction` – Ово нам омогућава да додамо блок у ланац са само листом трансакција. Било би веома непрактично ручно креирати блок сваки пут када желимо да забележимо трансакцију.
- `display_chain` – Штампа ланац блокова користећи фор петљу.
- `last_block` – Својство које омогућава приступ последњем елементу ланца. Користили смо га у методи `create_block_from_transaction`.
Хајде да тестирамо овај блокчејн.
# main.py import hashlib class GeekCoinBlock: ... class Blockchain: ... t1 = "George sends 3.1 GC to Joe" t2 = "Joe sends 2.5 GC to Adam" t3 = "Adam sends 1.2 GC to Bob" t4 = "Bob sends 0.5 GC to Charlie" t5 = "Charlie sends 0.2 GC to David" t6 = "David sends 0.1 GC to Eric" myblockchain = Blockchain() myblockchain.create_block_from_transaction([t1, t2]) myblockchain.create_block_from_transaction([t3, t4]) myblockchain.create_block_from_transaction([t5, t6]) myblockchain.display_chain()
Сада покрените фајл `main.py`.
Data 1: Genesis Block - 0 Hash 1: 39331a6a2ea1cf31a5014b2a7c9e8dfad82df0b0666e81ce04cf8173cc5aed3e Data 2: George sends 3.1 GC to Joe - Joe sends 2.5 GC to Adam - 39331a6a2ea1cf31a5014b2a7c9e8dfad82df0b0666e81ce04cf8173cc5aed3e Hash 2: 98cf363aecb33989aea0425a3c1287268bd86f63851bc08c0734a31db08506d5 Data 3: Adam sends 1.2 GC to Bob - Bob sends 0.5 GC to Charlie - 98cf363aecb33989aea0425a3c1287268bd86f63851bc08c0734a31db08506d5 Hash 3: 6f1cfcc3082488b97db8fdf8ed33f9ac7519be3e285a37a6fcc2f1904f373589 Data 4: Charlie sends 0.2 GC to David - David sends 0.1 GC to Eric - 6f1cfcc3082488b97db8fdf8ed33f9ac7519be3e285a37a6fcc2f1904f373589 Hash 4: 869df2f03c9860767d35b30a46233fbeea89a3000ae5019d1491e3829d1ab929
Честитам! 🙌 Управо сте креирали једноставан Пајтон блокчејн од нуле.
Сада можете ојачати непроменљивост блокчејна помоћу гетера и сетера, имплементирати друге функције као што је доказ о раду, рударење или било који други концепт који смо разматрали у тексту о основама Биткоин рударења.
Закључак
Блокчејн је технологија која стоји иза Биткоина, Етеријума и свих осталих криптовалута. У овом тексту сте научили како да направите блокчејн у Пајтону, користећи алгоритме хеширања попут `sha256`, класе и објекте.
Ваш изазов је да изградите систем рударења, а зашто не бисте га имплементирали са REST API користећи оквире као што су Django или Flask.
Многи људи су се обогатили захваљујући криптовалутама. Замислите само шта бисте могли да урадите ако је сами направите. 🤑
Наставите са кодирањем! 👨💻