Tuyển sinh 🎓 Mình nhận đào tạo lập trình giải thuật thi đấu: thi vào lớp 10 chuyên tin · thi học sinh giỏi tin học cấp tỉnh/thành · thi vào đội tuyển quốc gia · Olympic tin học sinh viên / ICPC · phỏng vấn thuật toán. Bấm vào đây để xem thông tin khóa học → Xem khóa học
Thi thử miễn phí
🏆 Thi thử HSG Tin học tuần này trên ClueOJ
Mở công khai cho mọi người · đề do thầy Nguyễn Việt Nam Sơn biên soạn
Lịch thi, đề cũ & lời giải →

Bài 14: Blockchain và Bitcoin hoạt động thế nào? Hàm băm và bằng chứng công việc

Bài 14: Blockchain và Bitcoin hoạt động thế nào? Hàm băm và bằng chứng công việc

Bitcoin là một hệ thống tiền điện tử không có ngân hàng trung tâm nào quản lý. Vậy làm sao để không ai sửa được sổ sách giao dịch? Câu trả lời nằm ở một cấu trúc dữ liệu đơn giản: chuỗi các khối nối với nhau bằng hàm băm.

Blockchain và Bitcoin: hàm băm và bằng chứng công việc

Bài thứ mười bốn của chuyên mục "Thuật toán trong đời sống". Bài viết chỉ giải thích khía cạnh thuật toán, không phải lời khuyên đầu tư.

1. Hàm băm: "dấu vân tay" của dữ liệu

Hàm băm (hash function) biến một dữ liệu bất kỳ thành một chuỗi có độ dài cố định. Hàm SHA-256 mà Bitcoin dùng luôn cho ra 256 bit (64 chữ số hệ 16). Hàm băm tốt có ba tính chất:

  • Tất định: cùng đầu vào thì luôn cùng kết quả.
  • Hiệu ứng tuyết lở: chỉ sửa 1 ký tự, kết quả thay đổi hoàn toàn.
  • Một chiều: biết kết quả, gần như không thể tìm ngược lại đầu vào – cách duy nhất là thử.

Học sinh lập trình thi đấu đã gặp ý tưởng này trong kỹ thuật hash xâu để so sánh hai xâu thật nhanh. SHA-256 là phiên bản "mật mã" mạnh hơn rất nhiều.

2. Chuỗi khối: mỗi trang sổ ghi dấu vân tay của trang trước

Ngày 31/10/2008, một người (hoặc nhóm người) lấy tên Satoshi Nakamoto gửi lên một nhóm thư điện tử về mật mã học bài viết mô tả "một hệ thống tiền điện tử ngang hàng hoàn toàn, không cần bên thứ ba tin cậy". Khối đầu tiên (genesis block) được tạo ngày 3/1/2009.

Giao dịch được gom thành các khối. Mỗi khối lưu mã băm của khối trước. Nếu kẻ gian sửa một giao dịch cũ, mã băm của khối đó thay đổi, khối sau "trỏ" vào một mã băm không còn tồn tại → cả chuỗi bị phát hiện là giả.

3. Bằng chứng công việc (Proof of Work)

Vậy sao kẻ gian không tính lại mã băm cho tất cả các khối sau? Vì Bitcoin đặt thêm một điều kiện "khó": mã băm của khối phải nhỏ hơn một ngưỡng – nói đơn giản là phải bắt đầu bằng nhiều chữ số 0. Cách duy nhất là thử lần lượt một con số gọi là nonce cho đến khi may mắn tìm ra. Sách trắng của Bitcoin viết: bằng chứng công việc là quét tìm một giá trị mà khi băm (ví dụ bằng SHA-256), kết quả bắt đầu bằng một số bit 0.

Mô phỏng đào khối bằng Python (hashlib)
import hashlib, time

def sha256(text):
    return hashlib.sha256(text.encode()).hexdigest()

def mine(data, prev_hash, zeros):
    # Bằng chứng công việc: tìm nonce sao cho hash bắt đầu bằng `zeros` chữ số 0
    nonce = 0
    while True:
        h = sha256(f"{prev_hash}|{data}|{nonce}")
        if h.startswith("0" * zeros):
            return nonce, h
        nonce += 1

chain, prev = [], "0" * 64
for data in ["An chuyen Binh 5 coin", "Binh chuyen Chi 2 coin", "Chi chuyen Dung 1 coin"]:
    t = time.time()
    nonce, h = mine(data, prev, 5)
    chain.append((data, prev, nonce, h))
    print(f"{data:24s} nonce={nonce:8d} hash={h[:16]}... ({time.time() - t:.2f}s)")
    prev = h

# Kẻ gian sửa giao dịch đầu tiên -> hash thay đổi -> khối sau không còn khớp
data, p, nonce, h = chain[0]
fake = sha256(f"{p}|An chuyen Binh 500 coin|{nonce}")
print("Hash moi cua khoi 1:", fake[:16], "| khoi 2 dang tro toi:", chain[1][1][:16])
print("Chuoi con hop le?", fake == chain[1][1])

Kết quả chạy:

An chuyen Binh 5 coin    nonce=  707890 hash=00000aa4670cafb0... (0.90s)
Binh chuyen Chi 2 coin   nonce=  914959 hash=00000697dfdd1089... (1.15s)
Chi chuyen Dung 1 coin   nonce=  770337 hash=00000faf307e68ce... (1.03s)
Hash moi cua khoi 1: 578ced15400d5bbb | khoi 2 dang tro toi: 00000aa4670cafb0
Chuoi con hop le? False

Với 5 chữ số 0 (hệ 16), trung bình phải thử 165 ≈ 1 triệu lần. Mỗi chữ số 0 thêm vào làm công việc tăng gấp 16 lần. Muốn sửa một khối cũ, kẻ gian phải đào lại khối đó và mọi khối sau, nhanh hơn cả phần còn lại của mạng lưới cộng lại – điều gần như bất khả thi. Quy tắc của mạng: chuỗi có nhiều công việc nhất được coi là đúng.

4. Độ khó tự điều chỉnh

Theo tài liệu cho nhà phát triển Bitcoin, cứ mỗi 2016 khối, mạng lưới xem 2016 khối đó mất bao lâu và điều chỉnh độ khó, với giá trị lý tưởng là 1.209.600 giây (hai tuần).

Tính nhẩm: 1.209.600 giây ÷ 2016 khối = 600 giây = 10 phút mỗi khối. Nếu máy đào mạnh lên và khối được tìm ra nhanh hơn, độ khó tăng; ngược lại thì giảm.

5. Cái giá của bằng chứng công việc

Hàng triệu tỷ phép băm mỗi giây tiêu tốn rất nhiều điện. Một nghiên cứu của Đại học Cambridge (công bố 4/2025) ước tính Bitcoin tiêu thụ khoảng 138 TWh điện mỗi năm, tương đương khoảng 0,5% điện năng toàn cầu. Vì lý do này, Ethereum đã chuyển sang cơ chế khác (Proof of Stake) vào 15/9/2022 và theo ethereum.org, mức tiêu thụ năng lượng giảm khoảng 99,95%.

6. Bạn học được gì từ đây?

  • Hàm băm là công cụ cực mạnh – từ so sánh xâu trong thi đấu đến bảo vệ hệ thống tài chính.
  • Một số bài toán "dễ kiểm tra, khó tìm" là nền tảng của an toàn thông tin.
  • Mọi thiết kế đều có đánh đổi: an toàn hơn thì tốn tài nguyên hơn.

Bài tập luyện tập

Lưu ý: bài viết chỉ nhằm giải thích thuật toán. Tiền điện tử có rủi ro cao; bài viết không phải lời khuyên đầu tư.

Nguồn tham khảo

Tự học thuật toán: khó ở đâu?
Đọc xong một bài giải là bước đầu. Phần lớn học sinh tự học sẽ gặp những trở ngại sau:
  • Không biết học gì trước, học gì sau, học lan man nên kiến thức bị hổng.
  • Bí bài không ai gỡ, ngồi cả buổi vẫn không ra rồi bỏ cuộc.
  • Code chạy được nhưng không đủ điểm, không biết sai ở đâu, chậm ở đâu.
  • Không có đề thi thử và người chấm, nên không biết mình đang ở mức nào.
  • Dễ nản giữa chừng khi không có ai theo sát.
Học cùng thầy Nam Sơn, các trở ngại đó được gỡ bỏ:
  • Lộ trình 111 buổi video sắp sẵn từ dòng code đầu tiên đến đề HSG thật của các tỉnh.
  • Thầy trực tiếp gỡ bí, chữa bài cho từng em qua nhóm Zalo riêng.
  • Hệ thống chấm bài tự động 24/7 và thi thử HSG hằng tuần để biết chính xác mình đang ở đâu.
  • Đóng học phí một lần, thầy kèm lâu dài: từ thi chuyên Tin đến HSG quốc gia và cả khi lên đại học.

Nhận xét