ສ້າງ Blockchain ຂອງທ່ານເອງ

📖 12 ນາທີອ່ານ · 🐍 Python

✍️ ຂຽນ ແລະທົບທວນໂດຍ Karel Havlíčekອັບເດດ 2026🛡️ ບັນນາທິການເອກະລາດ

Quick Answer

ວິທີທີ່ດີທີ່ສຸດທີ່ຈະເຂົ້າໃຈ blockchain ແມ່ນການສ້າງຫນຶ່ງ. ໃນປະມານ 50 ສາຍຂອງ Python ທ່ານສາມາດສ້າງ blockchain ຂອງຫຼິ້ນທີ່ເຮັດວຽກດ້ວຍການ hashing, ຕ່ອງໂສ້ຂອງຕັນ, ການຂຸດຄົ້ນບໍ່ແຮ່ຫຼັກຖານສະແດງ, ແລະການຊອກຄົ້ນຫາ tamper - ແນວຄວາມຄິດຫຼັກດຽວກັນທີ່ຮັບປະກັນ Bitcoin. ບໍ່ມີຄວາມຮູ້ກ່ຽວກັບ blockchain ມາກ່ອນ.

⚠️ ນີ້ແມ່ນຮູບແບບການຮຽນຮູ້, ບໍ່ແມ່ນລະຫັດການຜະລິດ. ມັນສອນໂຄງສ້າງຂໍ້ມູນທີ່ຢູ່ເບື້ອງຫລັງ Bitcoin - ມັນບໍ່ແມ່ນເງິນທີ່ປອດໄພແລະບໍ່ຄວນຖືມູນຄ່າທີ່ແທ້ຈິງ.

ຂັ້ນຕອນທີ 1 — ຕັນ ແລະລາຍນິ້ວມືຂອງມັນ

ບລັອກເກັບຂໍ້ມູນບາງຢ່າງ (ການເຮັດທຸລະກໍາ), ການເຊື່ອມຕໍ່ກັບບລັອກທີ່ຜ່ານມາ, ແລະ "nonce" (ຕົວເລກທີ່ພວກເຮົາສາມາດປ່ຽນແປງໄດ້). ຕົວຕົນຂອງມັນແມ່ນ SHA-256 hash ຂອງເນື້ອຫາທັງຫມົດຂອງມັນ - ປ່ຽນລັກສະນະຫນຶ່ງແລະ hash ປ່ຽນແປງຢ່າງສົມບູນ. ແຮຊນັ້ນແມ່ນລາຍນິ້ວມືທີ່ເຫັນໄດ້ຊັດເຈນຂອງບລັອກ.

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 - ການຂຸດຄົ້ນບໍ່ແຮ່ (ຫຼັກຖານສະແດງການເຮັດວຽກ)

ການຂຸດຄົ້ນບໍ່ແຮ່ຫມາຍເຖິງການຊອກຫາ hash ທີ່ສອດຄ່ອງກັບກົດລະບຽບ - ທີ່ນີ້, ເລີ່ມຕົ້ນດ້ວຍຈໍານວນທີ່ກໍານົດໄວ້ຂອງສູນ. ບໍ່ມີສູດ; ທ່ານ brute-force nonce ຈົນກ່ວາ hash ເຫມາະ. ການກວດສອບການແກ້ໄຂແມ່ນທັນທີ, ແຕ່ການຊອກຫາຫນຶ່ງໃຊ້ເວລາເຮັດວຽກ. asymmetry ທີ່ເປັນຫົວໃຈຂອງຫຼັກຖານສະແດງການເຮັດວຽກ.

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 — ຕ່ອງ​ໂສ້​ຕັນ​ໄດ້​

ແຕ່ລະທ່ອນໄມ້ໃຫມ່ເກັບຮັກສາ hash ຂອງອັນທີ່ຜ່ານມາ, ເຊື່ອມໃຫ້ເຂົາເຈົ້າເຂົ້າໄປໃນລະບົບຕ່ອງໂສ້ທີ່ເລີ່ມຕົ້ນດ້ວຍຕັນ "genesis" ຍາກລະຫັດ. ເນື່ອງຈາກວ່າທຸກຕັນຫມັ້ນສັນຍາກັບຫນຶ່ງກ່ອນມັນ, ຄໍາສັ່ງໄດ້ຖືກແກ້ໄຂແລະປະຫວັດສາດແມ່ນເຊື່ອມຕໍ່ກັນ.

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 — ດໍາເນີນການມັນແລະພະຍາຍາມ cheat

ຕອນນີ້ເພີ່ມທ່ອນໄມ້ບໍ່ຫຼາຍປານໃດແລະຫຼັງຈາກນັ້ນຂັດກັບທຸລະກໍາເກົ່າ. ເວລາທີ່ທ່ານປ່ຽນຂໍ້ມູນທີ່ຜ່ານມາ, ແຮຊຂອງບລັອກນັ້ນບໍ່ກົງກັບສິ່ງທີ່ບລັອກຕໍ່ໄປຄາດຫວັງ - ແລະການກວດສອບຈະກັບມາເປັນຜິດທັນທີ. ນີ້ແມ່ນ, ໃນຂະຫນາດນ້ອຍ, ເປັນຫຍັງທ່ານບໍ່ສາມາດຂຽນປະຫວັດສາດຂອງ Bitcoin ໄດ້ຢ່າງງຽບໆ.

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!

🔑 ເອົາກະແຈ

blockchain ແມ່ນພຽງແຕ່ໂຄງສ້າງຂໍ້ມູນບວກກັບກົດລະບຽບ: hash ແຕ່ລະ block, ເຊື່ອມຕໍ່ມັນກັບສຸດທ້າຍ, ແລະເຮັດໃຫ້ການເພີ່ມ blocks ຄ່າໃຊ້ຈ່າຍໂດຍຜ່ານຫຼັກຖານສະແດງການເຮັດວຽກ. Tampering ທໍາລາຍລະບົບຕ່ອງໂສ້ຂອງ hashes - ເຊິ່ງເປັນວິທີທີ່ Bitcoin ຄົງຢູ່ຢ່າງເຫັນໄດ້ຊັດເຈນໂດຍບໍ່ມີອໍານາດສູນກາງ.

ສິ່ງທີ່ Bitcoin ທີ່ແທ້ຈິງເພີ່ມ

ລະບົບຕ່ອງໂສ້ toy ຂອງພວກເຮົາສອນ skeleton ໄດ້. Bitcoin ທີ່ແທ້ຈິງເພີ່ມເຄືອຂ່າຍ peer-to-peer ທົ່ວໂລກຂອງ nodes, ລາຍເຊັນດິຈິຕອນທີ່ພິສູດວ່າໃຜສາມາດໃຊ້ຫຼຽນ, ການປັບຄວາມຫຍຸ້ງຍາກອັດຕະໂນມັດ, ຮູບແບບ UTXO, ລາງວັນຕັນແລະເຄິ່ງຫນຶ່ງ, ແລະກົດລະບຽບການຕົກລົງທີ່ປ່ອຍໃຫ້ຄົນແປກຫນ້າຕົກລົງໂດຍບໍ່ມີຄວາມໄວ້ວາງໃຈ. ສຳຫຼວດແຕ່ລະຕົວອະທິບາຍຂອງພວກເຮົາຂ້າງລຸ່ມນີ້.

ຄຳຖາມທີ່ມັກຖາມເລື້ອຍໆ

ນີ້ແມ່ນ blockchain ທີ່ແທ້ຈິງຄື Bitcoin?

ມັນແມ່ນຮູບແບບການສອນທີ່ງ່າຍດາຍທີ່ແບ່ງປັນແນວຄວາມຄິດຫຼັກຂອງ Bitcoin - ການຕີ, ການສ້າງລະບົບຕ່ອງໂສ້, ແລະຫຼັກຖານສະແດງການເຮັດວຽກ - ແຕ່ອອກຈາກເຄືອຂ່າຍ, ລາຍເຊັນດິຈິຕອນ, ແລະແຮງຈູງໃຈທາງເສດຖະກິດທີ່ເຮັດໃຫ້ Bitcoin ປອດໄພໃນຂອບເຂດທົ່ວໂລກ. ມັນແມ່ນເພື່ອການຮຽນຮູ້, ບໍ່ແມ່ນການແລ່ນເງິນ.

ຂ້ອຍຈໍາເປັນຕ້ອງເປັນນັກຂຽນໂປລແກລມບໍ?

ຄວາມຄຸ້ນເຄີຍພື້ນຖານກັບ Python ຊ່ວຍໃຫ້, ແຕ່ຄໍາອະທິບາຍໄດ້ຖືກຂຽນເພື່ອໃຫ້ທຸກຄົນສາມາດປະຕິບັດຕາມເຫດຜົນ. ທ່ານສາມາດອ່ານມັນເພື່ອເຂົ້າໃຈແນວຄວາມຄິດເຖິງແມ່ນວ່າໂດຍບໍ່ມີການແລ່ນລະຫັດ.

ເປັນຫຍັງການຂຸດຄົ້ນບໍ່ແຮ່ພຽງແຕ່ເພີ່ມສູນ?

ການຮຽກຮ້ອງໃຫ້ມີ hash ເພື່ອເລີ່ມຕົ້ນດ້ວຍຈໍານວນສູນແມ່ນເປັນເງື່ອນໄຂທີ່ງ່າຍຕໍ່ການກວດສອບແຕ່ຍາກທີ່ຈະຊອກຫາ. ວິທີດຽວທີ່ຈະຊອກຫາ hash ທີ່ຖືກຕ້ອງແມ່ນເພື່ອຮັກສາການຄາດເດົາ (ການປ່ຽນແປງ nonce), ເຊິ່ງແນ່ນອນວ່າການຂຸດຄົ້ນບໍ່ແຮ່ທີ່ແທ້ຈິງມີຄ່າໃຊ້ຈ່າຍພະລັງງານ.

ສິ່ງທີ່ຂາດຫາຍໄປເມື່ອທຽບກັບ Bitcoin ທີ່ແທ້ຈິງ?

ເຄືອຂ່າຍທີ່ແທ້ຈິງຂອງ nodes, ລາຍເຊັນດິຈິຕອນພິສູດຄວາມເປັນເຈົ້າຂອງ, ອະນຸສັນຍາ peer-to-peer, ການປັບຄວາມຫຍຸ້ງຍາກ, ຮູບແບບ UTXO, ແລະລາງວັນຕັນ. tutorial ນີ້ສອນໂຄງສ້າງຂໍ້ມູນ; ເບິ່ງຜູ້ອະທິບາຍຂອງພວກເຮົາສໍາລັບລະບົບເຕັມ.

ສືບຕໍ່ຮຽນຮູ້