建立自己的區塊鏈
📖 12 最小閱讀量 · 🐍 Python
Quick Answer
理解區塊鏈的最好方法就是建立一個。在大約 50 行 Python 中,你可以創建一個帶有哈希、區塊鏈、工作量證明挖掘和篡改檢測的工作玩具區塊鏈——這與保護比特幣的核心思想相同。無需具備區塊鏈知識。
⚠️ 這是一個學習模型,而不是生產程式碼。它講述了比特幣背後的資料結構——它不是安全的貨幣,永遠不應該擁有真正的價值。
步驟 1 — 一個區塊及其指紋
一個區塊保存一些資料(交易)、前一個區塊的連結和一個「隨機數」(我們可以更改的數字)。它的身份是其所有內容的 SHA-256 哈希值 - 更改一個字符,哈希值就會完全改變。該雜湊值是該區塊的防篡改指紋。
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()步驟 2 — 挖礦(工作量證明)
挖掘意味著找到滿足規則的哈希值 - 在這裡,從一組零開始。沒有公式;你會暴力破解隨機數,直到哈希值匹配為止。檢查解決方案是即時的,但找到解決方案需要工作。這種不對稱性是工作量證明的核心。
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()第 3 步-連結塊
每個新區塊都儲存前一個區塊的雜湊值,將它們焊接到以硬編碼「創世」區塊開頭的鏈中。因為每個區塊都提交給它之前的區塊,所以順序是固定的並且歷史記錄連結在一起。
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 block第 4 步 — 驗證鏈
要信任一條鏈,您需要重新檢查它:每個區塊必須指向前一個區塊的真實雜湊值,並且每個區塊必須滿足工作量證明規則。如果任一檢查在任何地方失敗,則該鏈無效。
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 True第 5 步 — 運行它並嘗試作弊
現在增加幾個區塊,然後篡改舊交易。當您變更過去的資料時,該區塊的雜湊值不再與下一個區塊所期望的值相符 - 並且驗證立即傳回 False。這就是為什麼你不能悄悄地改寫比特幣歷史的縮影。
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!🔑 重點
區塊鏈只是資料結構加上規則:對每個區塊進行哈希處理,將其連結到最後一個區塊,並透過工作量證明來增加添加區塊的成本。篡改會破壞哈希鏈——這正是比特幣在沒有中央權威的情況下保持防篡改的方式。
真正的比特幣增加了什麼
我們的玩具鏈教骨架。真正的比特幣增加了全球點對點的節點網路、證明誰可以花幣的數位簽名、自動難度調整、UTXO模型、區塊獎勵和減半,以及讓陌生人在不信任的情況下達成一致的共識規則。請在下面的解釋中探索每一個。
常見問題
這是像比特幣一樣真正的區塊鏈嗎?▼
這是一個簡化的教學模型,分享了比特幣的核心思想——哈希、連結和工作量證明——但忽略了使比特幣在全球範圍內安全的網路、數位簽章和經濟激勵措施。是為了學習,不是為了賺錢。
我需要成為一名程式設計師嗎?▼
對 Python 的基本熟悉會有所幫助,但編寫解釋是為了讓任何人都可以遵循邏輯。即使不運行程式碼,您也可以閱讀它來理解概念。
為什麼挖礦只加零?▼
要求哈希值以多個零開頭是一個易於檢查但很難找到的條件。找到有效哈希的唯一方法是不斷猜測(改變隨機數),這正是真正的挖礦消耗能源的原因。
與真實的比特幣相比,缺少什麼?▼
真實的節點網路、證明所有權的數位簽章、點對點協議、難度調整、UTXO 模型和區塊獎勵。本教程教授資料結構;請參閱我們的完整系統的解釋。