Өөрийн блокчейн бүтээгээрэй

📖 12 мин уншина · 🐍 Python

✍️ Бичсэн, хянуулсан Karel HavlíčekШинэчлэгдсэн 2026🛡️ Редакцийн хувьд хараат бус

Quick Answer

Блокчэйныг ойлгох хамгийн сайн арга бол блокчлон бүтээх явдал юм. Python-ийн 50 орчим мөрөнд та биткойны аюулгүй байдлыг хангадаг ижил үндсэн санаанууд болох хэш, блокуудын гинж, ажлын нотолгоо олборлолт, хөндлөнгийн илрүүлэлт бүхий тоглоомын блокчэйн үүсгэж болно. Өмнө нь блокчейн мэдлэг шаардлагагүй.

⚠️ Энэ бол үйлдвэрлэлийн код биш сургалтын загвар юм. Энэ нь биткойны цаана байгаа өгөгдлийн бүтцийг заадаг - энэ нь найдвартай мөнгө биш бөгөөд хэзээ ч бодит үнэ цэнийг хадгалах ёсгүй.

Алхам 1 - Блок ба түүний хурууны хээ

Блок нь зарим өгөгдөл (гүйлгээ), өмнөх блокийн холбоос, "nonce" (бидний өөрчилж болох тоо) зэргийг агуулдаг. Түүний таних тэмдэг нь түүний бүх агуулгын 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 — Уул уурхай (Ажлын баталгаа)

Олборлолт гэдэг нь тогтоосон тооны тэгээс эхлэн дүрэмд нийцсэн хэшийг олох гэсэн үг юм. Томъёо байхгүй; та хэш таарах хүртэл nonce-г харгис хүчээр хийнэ. Шийдлийг шалгах нь тэр даруй боловч нэгийг нь олох нь ажил шаарддаг. Тэр тэгш бус байдал нь Ажлын нотлох баримтын зүрх юм.

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 - Үүнийг ажиллуулаад хуурч оролдоорой

Одоо хэд хэдэн блок нэмээд хуучин гүйлгээг өөрчил. Таныг өмнөх өгөгдлүүдийг өөрчлөх мөчид тэр блокийн хэш нь дараагийн блокийн хүлээж буйтай таарахгүй ба баталгаажуулалт нь шууд худал буцаана. Биткойны түүхийг чимээгүйхэн дахин бичиж чадахгүй байгаагийн учир нь энэ юм.

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!

🔑 Түлхүүр авах

Блокчэйн бол зөвхөн өгөгдлийн бүтцээс гадна дүрэм журам юм: блок бүрийг хэш болгож, сүүлчийнхтэй нь холбож, ажлын нотолгоог ашиглан блок нэмэхийг үнэтэй болгоно. Хуваарилах нь хэшийн гинжин хэлхээг тасалдаг бөгөөд энэ нь биткойн нь төв эрх мэдэлгүйгээр хуурамчаар үйлдэгдэхгүй хэвээр үлддэг.

Жинхэнэ Bitcoin юу нэмдэг вэ

Манай тоглоомын сүлжээ араг ясыг заадаг. Жинхэнэ биткойн нь дэлхийн хэмжээнд үе тэнгийн сүлжээ, хэн зоос зарцуулж болохыг нотлох тоон гарын үсэг, хүндрэлийн автомат тохируулга, UTXO загвар, хаах урамшуулал, хагасыг бууруулах, танихгүй хүмүүст итгэлцэлгүйгээр санал нийлэхийг зөвшөөрдөг зөвшилцлийн дүрмийг нэмдэг. Доорх манай тайлбарлагчид тус бүрийг судлаарай.

Байнга асуудаг асуултууд

Энэ Bitcoin шиг жинхэнэ блокчейн мөн үү?

Энэ нь Bitcoin-ийн үндсэн санааг хуваалцдаг хялбаршуулсан заах загвар юм - хэшлэх, гинжлэх, ажлын нотолгоо - гэхдээ биткойныг дэлхийн хэмжээнд аюулгүй болгодог сүлжээ, тоон гарын үсэг, эдийн засгийн урамшууллыг орхигдуулдаг. Энэ нь мөнгө урсгах биш сурах зорилготой юм.

Би програмист байх шаардлагатай юу?

Python-ийн талаар анхан шатны мэдлэгтэй байх нь тус болно, гэхдээ тайлбарыг бичсэн тул хэн ч логикийг дагаж болно. Та кодыг ажиллуулалгүй ч гэсэн ойлголтуудыг ойлгохын тулд үүнийг уншиж болно.

Яагаад уул уурхай зүгээр л тэг нэмдэг вэ?

Хэшийг хэд хэдэн тэгээр эхлүүлэхийг шаардах нь шалгахад хялбар боловч олоход хэцүү нөхцөл юм. Хүчин төгөлдөр хэшийг олох цорын ганц арга бол тааварлах (nonce-ийг өөрчлөх) бөгөөд энэ нь жинхэнэ уул уурхай нь эрчим хүч зарцуулдаг.

Жинхэнэ биткойнтой харьцуулахад юу дутагдаж байна вэ?

Жинхэнэ зангилаа сүлжээ, өмчлөлийг нотлох тоон гарын үсэг, үе тэнгийн протокол, хүндрэлийн тохируулга, UTXO загвар, блокийн урамшуулал. Энэхүү заавар нь өгөгдлийн бүтцийг заадаг; Бүрэн системийг манай тайлбарлагчаас үзнэ үү.

Үргэлжлүүлэн сур