Jak vytvořit blockchain s Pythonem?

Věděli jste, že bitcoin je postaven na blockchainu? Dnes si vybudujeme Blockchain s Pythonem od nuly.

Co je Blockchain?

V roce 2008 se Bitcoinový papír byl publikován neznámým jednotlivcem nebo skupinou jménem Satoshi Nakamoto. Bitcoin vyšel jako peer-to-peer verze elektronické hotovosti, která umožňovala transakce, aniž by procházely centralizovanými institucemi (bankami). Většina lidí neví, že ve stejném článku Satoshi definoval distribuovaný způsob ukládání informací, dnes známý jako Blockchain.

Technologie blockchain

Zjednodušeně řečeno, Blockchain je sdílená, neměnná digitální účetní kniha, která ukládá transakce přes decentralizovanou síť počítačů.

Blockchain můžeme rozdělit na dva jednoduché pojmy:

  • Blok: Prostor, kde ukládáme transakce
  • Řetězec: Sada propojených záznamů

To definuje Blockchain jako řetězec propojených bloků, kde každý blok ukládá transakci provedenou se specifickými parametry.

Každý blok je postaven na jiném bloku a vytváří tak nevratný řetězec bloků. Jinými slovy, každý blok závisí na jiném. Výsledkem je robustní a neměnný systém, ve kterém může integritu kontrolovat kdokoli se správnými oprávněními.

Blockchain představuje zajímavou sadu funkcí:

  • Neměnnost historie
  • Stálost informací
  • Žádné chyby s uloženými daty

Mnoho systémů v současné době spoléhá na Blockchain, jako jsou kryptoměny, převod aktiv (NFT) a možná v blízké budoucnosti i hlasování.

Stojí za zmínku, že Python Blockchain nemusí být složitý program s tisíci řádky kódu. V jádru by to byl seznam vzájemně propojených transakcí.

Toto bylo samozřejmě stručné vysvětlení, ale pokud chcete úplného průvodce, vytvořili jsme kompletní návod na Blockchain pro začátečníky. Ujistěte se, že to zkontrolovat.

Bez dalšího zdržování pojďme vytvořit jednoduchý Blockchain s Pythonem.

Budování blockchainu s Pythonem

Než začneme, pojďme definovat, co budeme v tomto tutoriálu dělat:

  • Vybudujte jednoduchý blockchainový systém napsaný v Pythonu
  • Použijte náš Blockchain s předem stanovenými transakcemi reprezentovanými jako řetězce
  • Otestujte neměnnost našeho blockchainu

Nebudeme používat JSON, ale seznamy Pythonu. To nám umožní zjednodušit proces a zaměřit se na aplikaci klíčových konceptů blockchainu.

Co budete potřebovat k provedení tohoto návodu:

Vytvoření třídy Block

Otevřete svůj oblíbený editor kódu a vytvořte soubor main.py. Toto bude soubor, se kterým budeme pracovat.

Nyní import hashlib, modul, který nám umožňuje vytvářet jednosměrné šifrované zprávy. Kryptografické techniky, jako je hash, umožňují blockchainu vytvářet bezpečné transakce.

  Jak vytvořit vlastní widgety na iPhone

Hašovací funkce je algoritmus, který bere nějaká data (obvykle zakódovaný řetězec) a vrací jedinečný identifikátor, často pojmenovaný „výběr“ nebo „podpis“. Tato poslední část je životně důležitá; s hashovací funkcí malý rozdíl ve vstupu vytváří radikálně odlišný identifikátor jako výstup. To uvidíme později v akci.

Prozatím stačí importovat hashlib vestavěného modulu:

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

import hashlib

Tento modul obsahuje většinu hashovacích algoritmů, které budete potřebovat. Jen mějte na paměti, že budeme používat funkci hashlib.sha256().

Nyní se pojďme věnovat GeekCoinBlock, našemu zcela originálnímu názvu blockchainu.

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

Vím, že to může mít za následek neohrabaný kus kódu. Pojďme si jednotlivé části rozebrat v další části.

Vysvětlení GeekCoinBlock

Nejprve vytvoříme třídu s názvem GeekCoinBlock, obal pro objekty, které budou mít určité vlastnosti (atributy) a chování (metody).

Poté definujeme metodu __init__ (také nazývanou konstruktor), která se vyvolá pokaždé, když se vytvoří objekt GeekCoinBlock.

Tato metoda má tři parametry:

  • self (instance každého objektu)
  • previous_block_hash (odkaz na předchozí blok)
  • seznam_transakcí (seznam transakcí provedených v aktuálním bloku).

Uložíme předchozí hash a seznam transakcí a vytvoříme proměnnou instance block_data jako řetězec. To se nestává u skutečných kryptoměn, ve kterých ukládáme tento druh dat jako další hash, ale pro zjednodušení uložíme každý blok dat jako řetězec.

Nakonec vytvoříme block_hash, který ostatní bloky použijí k pokračování řetězce. Zde se hodí hashlib; místo vytvoření vlastní hashovací funkce můžeme použít předpřipravenou sha256 k vytvoření neměnných bloků.

Tato funkce přijímá zakódované řetězce (nebo bajty) jako parametry. Proto používáme metodu block_data.encode(). Poté zavoláme hexdigest(), abychom vrátili zakódovaná data do hexadecimálního formátu.

Vím, že tohle všechno může být ohromující, takže si pojďme hrát s hashlibem na shellu Pythonu.

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'

Jak vidíte, mírná změna ve vstupu jako „Python je skvělý“ na „Python není skvělý“ může vytvořit úplně jiný hash. To vše souvisí s integritou blockchainu. Pokud do blockchainu zavedete nějakou malou změnu, jeho hash se dramaticky změní. To je důvod, proč je pravdivé rčení „Blockchain nemůžete poškodit“.

  Kde je ovládací panel na Macu?

Pomocí naší blokové třídy

Později vytvoříme celou třídu Blockchain, ale prozatím použijme třídu Block k vytvoření řetězce bloků (Blockchain).

Ve stejném souboru vytvořte několik transakcí složených z jednoduchých řetězců uložených v proměnných, například:

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 samozřejmě odkazuje na GeekCoin

Nyní vytvořte první blok našeho Blockchainu pomocí třídy GeekCoinBlock a vytiskněte jeho atributy. Vezměte v úvahu, že parametr previous_hash bloku genesis (první blok, který předchází ostatním blokům) bude vždy nějaký libovolný řetězec nebo hash, v tomto případě „firstblock“.

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

print(f"Block 1 data: {block1.block_data}")
print(f"Block 1 hash: {block1.block_hash}")

Potom uděláme totéž s druhým blokem, ale předáme hash prvního bloku jako argument 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}")

Pojďme spustit a analyzovat výstup, který získáme z tohoto kusu kódu. Ještě jednou zadejte svůj terminál:

❯ 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

Prozatím vidíte pouze text a některé hashe 64 znaků, ale to v podstatě obnovuje mechanismus blockchainu.

Začnete blokem geneze, základem všech ostatních bloků.

Každý může ověřit integritu řetězce, a proto je blockchain tak bezpečný systém. Pokud například mírně upravíme obsah transakce, řekněte:

t2 = "Mark sends 2.3 GC to James" -> t2 = "Mark sends 3.2 GC to James" 

Vidíme dramatickou změnu v hash bloků.

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

Na tomto se můžete podívat na aktuální projekt úložiště GitHub.

Kódování blockchainu

Založit integritu našeho systému na ručně kódovaných proměnných není tak chytré, takže potřebujeme jiný přístup.

Máme bloky. Je čas vybudovat třídu, která je spojí do blockchainu.

Začněme smazáním našich předchozích transakcí a blokovaných objektů a poté pomocí níže uvedeného kódu.

# 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]

To je opět obrovský kus kódu. Pojďme si jednotlivé části rozebrat:

  • self.chain — Seznam, kde jsou zaznamenány všechny bloky. Ke každému bloku můžeme přistupovat prostřednictvím indexů seznamu.
  • create_genesis_block — Připojte genezi nebo první blok k řetězci. Předchozí hash bloku je „0“ a seznam transakcí je jednoduše „Genesis Block“.
  • create_block_from_transaction — To nám umožňuje přidávat bloky do řetězce pouze se seznamem transakcí. Bylo by velmi nepříjemné vytvářet blok ručně pokaždé, když chceme zaznamenat transakci
  • display_chain — Vytiskne řetězec bloků se smyčkou for
  • last_block — Vlastnost, která nám umožňuje přístup k poslednímu prvku řetězce. Použili jsme ji u metody create_block_from_transaction.
  Nástroje pro detekci a prevenci podvodů pro online podnikání

Pojďme otestovat tento blockchain.

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

Nyní spusťte soubor 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

Gratulujeme! 🙌 Právě jste vytvořili jednoduchý Python Blockchain od nuly.

Nyní můžete posílit neměnnost Blockchainu pomocí getterů a nastavovačů a implementovat další funkce, jako je proof-of-work, mining nebo jakýkoli jiný koncept, který jsme vysvětlili v článku o základech těžby bitcoinů.

Závěr

Blockchain je technologie, která stojí za bitcoiny, etheriem a každou další kryptoměnou. V tomto článku jste se naučili, jak vytvořit Blockchain s Pythonem pomocí hashovacích algoritmů, jako je sha256, třídy a objekty.

Vaší výzvou je vytvořit těžební systém, a proč ne, implementovat jej pomocí REST API pomocí rámců jako Django nebo Flask.

Mnoho lidí vydělává jmění na kryptoměnách. Jen si představte, co byste mohli udělat, kdybyste si jeden vytvořili sami. 🤑

Pokračujte v kódování! 👨‍💻