Како направити блокчејн са Питхон-ом?

Да ли сте знали да је Битцоин изграђен на Блоцкцхаин-у? Данас ћемо изградити Блоцкцхаин са Питхон-ом од нуле.

Шта је блокчејн?

Године 2008 Битцоин папир је објавио непознати појединац или група по имену Сатоши Накамото. Битцоин је изашао као пеер-то-пеер верзија електронске готовине која је омогућавала трансакције без проласка кроз централизоване институције (банке). Већина људи не зна да је у том истом раду Сатоши дефинисао дистрибуирани начин чувања информација, данас познат као Блоцкцхаин.

Блоцкцхаин технологија

Једноставно речено, Блоцкцхаин је заједничка, непроменљива дигитална књига која чува трансакције преко децентрализоване мреже рачунара.

Блоцкцхаин можемо поделити на два једноставна појма:

  • Блок: Простор у којем чувамо трансакције
  • Ланац: Скуп повезаних записа

Ово дефинише Блоцкцхаин као ланац повезаних блокова, где сваки блок чува трансакцију направљену са одређеним параметрима.

Сваки блок је изграђен на врху другог блока, стварајући неповратни ланац блокова. Другим речима, сваки блок зависи од другог. Ово се испоставља у робустан и непроменљив систем у коме свако са исправним дозволама може да прегледа интегритет.

Блоцкцхаин уводи занимљив скуп функција:

  • Историја непроменљивости
  • Упорност информација
  • Нема грешака са сачуваним подацима

Многи системи се тренутно ослањају на Блоцкцхаин, као што су криптовалуте, пренос средстава (НФТ) и вероватно у блиској будућности гласање.

Вреди напоменути да Питхон Блоцкцхаин не мора бити сложен програм са хиљадама линија кода. У суштини, то би била листа трансакција повезаних једна са другом.

Наравно, ово је било кратко објашњење, али ако желите комплетан водич, направили смо комплетан водич о Блоцкцхаин-у за почетнике. Обавезно проверите.

Без даљег одлагања, хајде да направимо једноставан Блоцкцхаин са Питхон-ом.

Изградња блокчејна са Питхон-ом

Пре него што почнемо, хајде да дефинишемо шта ћемо да радимо у овом водичу:

  • Направите једноставан Блоцкцхаин систем написан у Питхон-у
  • Користите наш Блоцкцхаин са унапред успостављеним трансакцијама представљеним као стрингови
  • Тестирајте непромењивост нашег Блоцкцхаина

Нећемо користити ЈСОН већ Питхон листе. Ово ће нам омогућити да поједноставимо процес и фокусирамо се на примену кључних концепата Блоцкцхаина.

Шта ће вам требати да пратите овај водич:

Креирање класе Блок

Отворите свој омиљени уређивач кода и креирајте датотеку маин.пи. Ово ће бити датотека са којом ћемо радити.

Сада увоз хасхлиб, модул који нам омогућава да креирамо једносмерне шифроване поруке. Технике криптографије попут хеширања чине да Блоцкцхаин креира безбедне трансакције.

  Најбоље бежичне тастатуре за путовања

Хеш функција је алгоритам који узима неке податке (обично кодирани стринг) и враћа јединствени идентификатор, који се често назива „дигест“ или „потпис“. Овај последњи део је од виталног значаја; са хеш функцијом, мала разлика у улазу производи радикално другачији идентификатор као излаз. Видећемо ово на делу касније.

За сада, само увезите уграђени модул хасхлиб:

# main.py file
"""
A simple Blockchain in Python
"""

import hashlib

Овај модул укључује већину алгоритама хеширања који су вам потребни. Само имајте на уму да ћемо користити функцију хасхлиб.сха256().

Сада, хајде да пређемо на ГеекЦоинБлоцк, наше потпуно оригинално име блокчејна.

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()

Знам да ово може резултирати незграпним комадом кода. Хајде да разложимо сваки део у следећем одељку.

ГеекЦоинБлоцк објашњење

Прво, креирамо класу под називом ГеекЦоинБлоцк, омотач за објекте који ће имати одређене карактеристике (атрибуте) и понашања (методе).

Затим дефинишемо метод __инит__ (који се такође зове конструктор), који се позива сваки пут када се ГеекЦоинБлоцк објекат креира.

Овај метод има три параметра:

  • селф (инстанца сваког објекта)
  • превиоус_блоцк_хасх (референца на претходни блок)
  • трансакција_лист (листа трансакција направљених у тренутном блоку).

Чувамо претходну хеш и листу трансакција и креирамо променљиву инстанце блоцк_дата као стринг. Ово се не дешава са правим криптовалутама, у којима чувамо ту врсту података као још један хеш, али ради једноставности, сваки блок података ћемо чувати као стринг.

Коначно, креирамо блоцк_хасх, који ће други блокови користити за наставак ланца. Ево где хасхлиб добро дође; уместо да креирамо прилагођену хеш функцију, можемо користити унапред изграђен сха256 да направимо непроменљиве блокове.

Ова функција прима кодиране стрингове (или бајтове) као параметре. Зато користимо метод блоцк_дата.енцоде(). Након тога, позивамо хекдигест() да вратимо кодиране податке у хексадецимални формат.

Знам да све ово може бити неодољиво, па хајде да се играмо са хасхлибом на Питхон љусци.

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'

Као што видите, мала промена у уносу попут „Питхон је сјајан“ у „Питхон није сјајан“ може произвести потпуно другачији хеш. Све ово има везе са интегритетом Блоцкцхаин-а. Ако унесете неку малу промену у блоцкцхаин, његов хеш ће се драматично променити. То је разлог зашто је изрека „Не можете покварити Блоцкцхаин“ истинита.

  Шта је мрежна безбедност? Како то функционише и зашто је важно

Користећи нашу блок класу

Касније ћемо изградити целу Блоцкцхаин класу, али за сада, хајде да користимо нашу Блоцк класу да креирамо ланац блокова (Блоцкцхаин).

У истој датотеци направите неколико трансакција састављених од једноставних стрингова ускладиштених у променљивим, на пример:

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"

Наравно, ГЦ се односи на ГеекЦоин

Сада направите први блок нашег Блоцкцхаина користећи класу ГеекЦоинБлоцк и одштампајте његове атрибуте. Узмите у обзир да ће параметар превиоус_хасх блока генезе (први блок који претходи другим блоковима) увек бити неки произвољни стринг или хеш, у овом случају, „фирстблоцк“.

block1 = GeekCoinBlock('firstblock', [t1, t2])

print(f"Block 1 data: {block1.block_data}")
print(f"Block 1 hash: {block1.block_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]

Ово је опет огроман део кода. Хајде да разложимо сваки део:

  • селф.цхаин — Листа на којој су снимљени сви блокови. Сваком блоку можемо приступити преко индекса листе.
  • генерате_генесис_блоцк — Додајте генезу или први блок у ланац. Претходни хеш блока је „0“, а листа трансакција је једноставно „Генесис Блоцк“.
  • цреате_блоцк_фром_трансацтион — Ово нам омогућава да додамо блокове у ланац са само листом трансакција. Било би веома неугодно креирати блок ручно сваки пут када желимо да снимимо трансакцију
  • дисплаи_цхаин — Штампа ланац блокова са фор петљом
  • ласт_блоцк — Својство које нам омогућава приступ последњем елементу ланца. Користили смо га на методи цреате_блоцк_фром_трансацтион.

Хајде да тестирамо овај Блоцкцхаин.

# 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()

Сада покрените датотеку маин.пи.

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

Честитам! 🙌 Управо сте креирали једноставан Питхон Блоцкцхаин од нуле.

Сада можете ојачати непроменљивост Блоцкцхаин-а коришћењем геттера и сеттера и имплементирати друге функције као што су доказ о раду, рударење или било који други концепт који смо објаснили у чланку о основама Битцоин рударства.

Закључак

Блоцкцхаин је технологија иза биткоина, етеријума и сваке друге криптовалуте. У овом чланку сте научили како да креирате Блоцкцхаин са Питхон-ом користећи хеш алгоритме као што су сха256, класе и објекти.

Ваш изазов је да направите рударски систем, а зашто не, имплементирајте га помоћу РЕСТ АПИ-ја користећи оквире као што су Дјанго или Фласк.

Многи људи зарађују богатство од криптовалута. Замислите само шта бисте могли да урадите ако га сами креирате. 🤑

Кееп Цодинг! 👨‍💻