Sestavte si svůj vlastní blockchain
📖 12 min přečteno · 🐍 Python
Quick Answer
Nejlepší způsob, jak porozumět blockchainu, je vytvořit si ho. V přibližně 50 řádcích Pythonu můžete vytvořit fungující hračkářský blockchain s hašováním, řetězem bloků, těžbou důkazů o práci a detekcí manipulace – stejnými základními myšlenkami, které zajišťují bitcoiny. Nejsou potřeba žádné předchozí znalosti blockchainu.
⚠️ Toto je model učení, nikoli produkční kód. Učí datovou strukturu za bitcoiny – nejsou to bezpečné peníze a nikdy by neměly mít skutečnou hodnotu.
Krok 1 — Blok a jeho otisk
Blok obsahuje nějaká data (transakce), odkaz na předchozí blok a „nonce“ (číslo, které můžeme změnit). Jeho identita je SHA-256 hash veškerého jeho obsahu – změňte jeden znak a hash se změní úplně. Tento hash je otisk bloku, který je viditelný z důvodu manipulace.
import hashlib, json, time
class Block:
def __init__(self, index, transactions, previous_hash, nonce=0):
self.index = index
self.timestamp = time.time()
self.transactions = transactions
self.previous_hash = previous_hash
self.nonce = nonce
def hash(self):
# A block's fingerprint = SHA-256 of all its contents.
payload = json.dumps({
"index": self.index,
"timestamp": self.timestamp,
"transactions": self.transactions,
"previous_hash": self.previous_hash,
"nonce": self.nonce,
}, sort_keys=True).encode()
return hashlib.sha256(payload).hexdigest()Krok 2 – Těžba (doklad o práci)
Těžba znamená najít hash, který splňuje pravidlo — zde počínaje nastaveným počtem nul. Neexistuje žádný vzorec; brutálně vynutíte nonce, dokud hash nezapadne. Kontrola řešení je okamžitá, ale najít nějaké dá práci. Tato asymetrie je srdcem Proof of Work.
DIFFICULTY = 4 # require this many leading zeros
def mine(block):
# Proof of Work: keep changing the nonce until the hash
# starts with DIFFICULTY zeros. There is no shortcut —
# you just have to guess, which is what costs energy.
target = "0" * DIFFICULTY
while not block.hash().startswith(target):
block.nonce += 1
return block.hash()Krok 3 — Řetězení bloků
Každý nový blok ukládá hash předchozího a svařuje je do řetězce, který začíná pevně zakódovaným blokem „geneze“. Protože se každý blok odevzdá tomu předcházejícímu, objednávka je pevná a historie je propojena.
class Blockchain:
def __init__(self):
# The genesis block — the very first, hard-coded block.
genesis = Block(0, [{"note": "genesis"}], "0")
mine(genesis)
self.chain = [genesis]
def add_block(self, transactions):
prev = self.chain[-1]
block = Block(len(self.chain), transactions, prev.hash())
mine(block) # do the work
self.chain.append(block)
return blockKrok 4 — Ověření řetězu
Chcete-li řetězci důvěřovat, znovu jej zkontrolujte: každý blok musí ukazovat na skutečný hash předchozího bloku a každý blok musí splňovat pravidlo prokazování práce. Pokud některá kontrola kdekoli selže, řetězec je neplatný.
def is_valid(chain):
for i in range(1, len(chain)):
current, previous = chain[i], chain[i - 1]
# 1) Each block must point to the real hash of the one before it.
if current.previous_hash != previous.hash():
return False
# 2) Each block must satisfy the proof-of-work rule.
if not current.hash().startswith("0" * DIFFICULTY):
return False
return TrueKrok 5 — Spusťte to a zkuste podvádět
Nyní přidejte několik bloků a poté manipulujte se starou transakcí. Ve chvíli, kdy změníte minulá data, hash tohoto bloku již neodpovídá tomu, co očekává další blok – a ověření okamžitě vrátí hodnotu False. To je, v miniatuře, důvod, proč nemůžete tiše přepsat historii bitcoinu.
bc = Blockchain()
bc.add_block([{"from": "Alice", "to": "Bob", "amount": 5}])
bc.add_block([{"from": "Bob", "to": "Carol", "amount": 2}])
print("Chain valid?", is_valid(bc.chain)) # True
# Now try to cheat: tamper with an old transaction.
bc.chain[1].transactions[0]["amount"] = 5000
print("Chain valid?", is_valid(bc.chain)) # False — tampering is caught!🔑 Klíč s sebou
Blockchain jsou jen datové struktury plus pravidla: hashujte každý blok, propojte jej s posledním a zdražujte přidávání bloků prostřednictvím důkazu o práci. Manipulace přerušuje řetězec hashů – přesně tak zůstává bitcoin bez centrální autority viditelný.
Co skutečný bitcoin přidává
Náš hračkářský řetězec učí kostru. Skutečný bitcoin přidává globální síť uzlů typu peer-to-peer, digitální podpisy, které dokazují, kdo může utrácet coiny, automatickou úpravu obtížnosti, model UTXO, blokové odměny a půlky a pravidla konsensu, která umožňují cizím lidem souhlasit bez důvěry. Prozkoumejte každý v našich níže uvedených vysvětleních.
Často kladené otázky
Je to skutečný blockchain jako bitcoin?▼
Jedná se o zjednodušený model výuky, který sdílí základní myšlenky bitcoinu – hašování, řetězení a dokazování práce – ale vynechává sítě, digitální podpisy a ekonomické pobídky, díky nimž je bitcoin bezpečný v globálním měřítku. Je to pro učení, ne pro peníze.
Musím být programátor?▼
Základní znalost Pythonu pomáhá, ale vysvětlení jsou napsána tak, aby každý mohl sledovat logiku. Můžete si jej přečíst, abyste porozuměli konceptům i bez spuštění kódu.
Proč těžba jen přidává nuly?▼
Požadavek, aby hash začínal počtem nul, je snadno kontrolovatelná, ale těžko dohledatelná podmínka. Jediný způsob, jak najít platný hash, je neustále hádat (měnit nonce), což je přesně důvod, proč skutečná těžba stojí energii.
Co chybí oproti skutečnému bitcoinu?▼
Skutečná síť uzlů, digitální podpisy prokazující vlastnictví, protokol peer-to-peer, úprava obtížnosti, model UTXO a blokové odměny. Tento tutoriál učí datovou strukturu; celý systém najdete v našich vysvětlovačích.