📌 Tóm tắt nhanh
Hash function là hàm một chiều không đảo ngược: nhận input bất kỳ và trả về digest cố định độ dài. Trong blockchain, hash function tạo ra tính bất biến (mỗi block chứa hash của block trước), làm nền tảng PoW mining puzzle, và tổ chức transaction trong Merkle Tree. SHA-256 là của Bitcoin, Keccak-256 là của Ethereum.
1Hash Function là gì?
Hash function (hàm băm) là hàm toán học nhận đầu vào (input) bất kỳ kích thước và trả về một chuỗi cố định độ dài gọi là hash, digest, hoặc fingerprint.
Ví dụ với SHA-256, bất kể input là 1 byte hay 1 GB, output luôn là 256 bit (64 ký tự hex):
Ba điều bạn thấy ở trên: (1) output luôn dài 64 ký tự hex, (2) thay đổi chữ hoa/thường tạo output hoàn toàn khác, (3) input dài bao nhiêu cũng cho output cùng độ dài.
2Năm thuộc tính bảo mật của Hash Function
Không phải mọi hàm băm đều phù hợp với blockchain. Các cryptographic hash function phải đáp ứng năm thuộc tính bảo mật nghiêm ngặt:
1. Deterministic — Tất định
Cùng input luôn cho cùng output, không bao giờ ngẫu nhiên. Mọi node trên mạng tính SHA256(block_header) phải được cùng kết quả để đồng thuận.
2. Preimage Resistance — Kháng đảo
Biết hash output, không thể tính ngược ra input gốc trong thời gian hợp lý. Đây là tính "một chiều" (one-way). Nếu không có preimage resistance, kẻ tấn công có thể tạo data giả để match bất kỳ hash nào.
3. Second Preimage Resistance
Biết input A, không thể tìm được input B khác (B≠A) sao cho hash(A) = hash(B). Thiếu tính chất này, kẻ tấn công có thể thay thế transaction hợp lệ bằng transaction khác có cùng hash.
4. Collision Resistance — Kháng va chạm
Không thể tìm bất kỳ cặp (A, B) nào với A≠B và hash(A) = hash(B). Yếu hơn second preimage resistance nhưng quan trọng cho Merkle Tree và digital signature schemes.
5. Avalanche Effect — Hiệu ứng tuyết lở
Thay đổi 1 bit trong input → khoảng 50% bit trong output thay đổi. Tạo ra tính "unpredictability" — không thể dự đoán output dù biết input gần đúng.
3Avalanche Effect — Hiệu ứng tuyết lở
Avalanche effect là thuộc tính quan trọng nhất cho PoW mining. Nếu thay đổi nhỏ trong input cho kết quả dự đoán được, miner có thể "hướng dẫn" quá trình mining — phá vỡ tính lottery của PoW.
Thực tế của avalanche effect với SHA-256:
Hai hash trên khác nhau hoàn toàn dù input chỉ thay đổi một ký tự. Điều này có nghĩa là miner thực sự phải thử từng giá trị nonce một cách ngẫu nhiên — không có cách "đoán thông minh" để tiết kiệm tính toán. Đây là lý do PoW thực sự tốn năng lượng.
4SHA-256 — Trụ cột của Bitcoin
SHA-256 (Secure Hash Algorithm 256-bit) là hash function được thiết kế bởi NSA và công bố bởi NIST năm 2001. Bitcoin dùng SHA-256 cho tất cả mọi thứ.
SHA-256 trong Bitcoin
- Block header hash:
SHA256(SHA256(block_header))— chú ý double-SHA256 - PoW target: Hash phải bắt đầu bằng đủ số bit 0 theo difficulty hiện tại
- Merkle Tree: Hash của mỗi transaction dùng SHA256
- Address generation: Bước đầu hash public key bằng SHA256 trước RIPEMD-160
- TXID: Transaction ID là SHA256(SHA256(raw_tx))
Tại sao Bitcoin dùng Double-SHA256?
Bitcoin dùng SHA256(SHA256(data)) thay vì chỉ một lần. Lý do: phòng ngừa một lớp bảo vệ thêm trước các length extension attack — kiểu tấn công có thể áp dụng với SHA-256 đơn lẻ nhưng bị vô hiệu bởi double-hash.
Thống kê về SHA-256 và Bitcoin
Tổng hash rate của Bitcoin network vào đầu 2024 đạt khoảng 600 EH/s — tức là 600 × 10¹⁸ phép tính SHA-256 mỗi giây. Toàn bộ sức mạnh tính toán này chỉ để tìm nonce thỏa mãn difficulty target — minh chứng rõ nhất cho chi phí của PoW security.
5Keccak-256 — Trụ cột của Ethereum
Ethereum dùng Keccak-256 — không phải SHA-3 chuẩn NIST mà là phiên bản gốc do team Keccak submit vào cuộc thi NIST. Khi NIST chuẩn hóa SHA-3, họ thay đổi một số padding parameter, tạo ra sự khác biệt nhỏ nhưng quan trọng.
Keccak-256 trong Ethereum
- Address generation: Địa chỉ = 20 bytes cuối của
Keccak256(public_key) - Transaction hash: TXID =
Keccak256(RLP(transaction)) - State root, receipts root, transactions root trong block header
- Event topics:
Keccak256("Transfer(address,address,uint256)")= event signature - Storage slot: Mapping storage key =
Keccak256(key + slot)
keccak256() chính xác.6Hash Function trong cấu trúc Block
Hash function là keo dán tạo nên cấu trúc "chain" trong blockchain. Không có hash linking, đây chỉ là một database bình thường.
Chain Linking qua Hash
Mỗi block header chứa trường parentHash = hash của block trước đó. Chuỗi liên kết này tạo ra:
- Tamper-evidence: Sửa block cũ → hash thay đổi → parentHash trong block tiếp theo không khớp → chain invalid từ điểm đó
- Ordering: Blocks có thứ tự tuyến tính không thể đảo ngược
- Commitment: Mỗi block "commit" vào toàn bộ lịch sử trước đó
Cái giá để rewrite lịch sử
Nếu muốn sửa block ở height 100 (trong khi chain hiện tại ở height 800), attacker phải re-mine toàn bộ 700 blocks sau đó với difficulty hiện tại — và làm nhanh hơn toàn bộ honest hashrate để chain mới kịp bắt kịp và vượt chain hiện tại. Đây là lý do 51% attack tốn kém đến vậy. Chi tiết hơn về economic security của blockchain.
7Hash Function trong PoW Mining
Proof of Work dùng hash function như một computational puzzle: tìm nonce sao cho hash của block header thỏa mãn target difficulty.
Mining Puzzle cụ thể
Bitcoin block header bao gồm: version, previousBlockHash, merkleRoot, timestamp, bits (difficulty), nonce. Miner phải tìm nonce sao cho:
SHA256(SHA256(header)) < target
Target là một số 256-bit. Khi difficulty tăng, target giảm → cần nhiều leading zeros hơn → cần thử nhiều nonce hơn → tốn thêm điện. Tháng 1/2024, difficulty của Bitcoin yêu cầu hash bắt đầu bằng khoảng 77 bit 0.
Expected number of hashes
Với target T, xác suất một hash ngẫu nhiên thỏa mãn là T/2²⁵⁶. Expected số lần thử = 2²⁵⁶/T. Khi difficulty = 70 trillion, cần trung bình 70 × 10¹² phép hash để tìm một block hợp lệ.
8Collision Attack và giới hạn của Hash Function
Không có hash function nào hoàn toàn miễn nhiễm với collision — đây là điều không tránh được do Pigeonhole Principle: input có thể có vô hạn kích thước, nhưng output chỉ có 2²⁵⁶ giá trị. Vậy luôn tồn tại collision về mặt lý thuyết.
Birthday Attack
Birthday attack là phương pháp tìm collision hiệu quả nhất: thay vì fix một giá trị và tìm collision với nó, tạo ra tập lớn random inputs và tìm hai cái có cùng hash. Xác suất collision đạt 50% chỉ cần khoảng √(2ⁿ) = 2^(n/2) hashes. Với SHA-256: 2^128 hashes — vẫn là con số thiên văn.
Các hash function đã bị break
| Hash Function | Trạng thái | Ghi chú |
|---|---|---|
| MD5 | ❌ Broken (1996) | Collision tìm được trong vài giây |
| SHA-1 | ❌ Broken (2017) | Google SHAttered attack — collision tìm được |
| SHA-256 | ✅ Secure | Chưa có tấn công thực tế, dùng trong Bitcoin |
| Keccak-256 | ✅ Secure | Chưa có tấn công thực tế, dùng trong Ethereum |
| SHA-3 (NIST) | ✅ Secure | Chuẩn mới nhất, thay SHA-2 dài hạn |
Việc SHA-1 bị break là lý do các certificate authority ngừng dùng SHA-1 trong TLS certificates. Blockchain may mắn đã chọn SHA-256 và Keccak-256 từ đầu.
9Hash Function trong ZK Proof và tương lai
Hash function đóng vai trò đặc biệt trong ZK Proof systems — nhưng không phải SHA-256 hay Keccak-256 thông thường mà là các hàm đặc biệt thiết kế cho ZK circuits.
Vấn đề với SHA-256 trong ZK
SHA-256 sử dụng phép XOR, AND, và rotation trên bit — các phép toán này "expensive" (tốn nhiều constraint) khi thể hiện trong ZK circuits (R1CS, PLONK...). Một phép hash SHA-256 có thể cần hàng chục nghìn constraints — quá tốn kém cho ZK proof generation.
ZK-Friendly Hash Functions
- Poseidon: Thiết kế đặc biệt cho ZK circuits, dùng phép nhân modular thay vì bit operations. Chỉ cần vài trăm constraints thay vì hàng chục nghìn. Dùng trong Zcash, Filecoin, nhiều ZK rollup
- Pedersen Hash: Dùng elliptic curve addition, very ZK-friendly
- MiMC, GMiMC: Các hàm khác thiết kế tối ưu cho ZK contexts
Đây là lý do ZK-STARK dùng hash function (Rescue, BLAKE) thay vì elliptic curve pairing — trade-off giữa proof size và prover cost tùy use case.
10Câu hỏi thường gặp (FAQ)
Hash function là hàm toán học một chiều nhận input bất kỳ độ dài và trả về output cố định độ dài (digest). Không thể tính ngược từ digest ra input gốc. Cùng input luôn cho cùng output, nhưng thay đổi nhỏ (1 bit) trong input tạo ra output hoàn toàn khác (avalanche effect).
SHA-256 do NSA thiết kế và NIST chuẩn hóa năm 2001, dùng trong Bitcoin. Keccak-256 do team độc lập (Belgium) thiết kế, dùng trong Ethereum — là phiên bản gốc trước khi NIST chuẩn hóa thành SHA-3 với một số thay đổi nhỏ. Cả hai đều an toàn, khác nhau về internal structure (Merkle-Damgård vs sponge construction).
Nếu kẻ tấn công tìm được hai transaction khác nhau có cùng hash, họ có thể thay thế transaction hợp lệ bằng transaction gian lận trong Merkle Tree mà block header không phát hiện. Collision resistance đảm bảo mỗi transaction có fingerprint duy nhất không thể giả mạo.
Grover's algorithm trên máy tính lượng tử có thể tìm preimage của SHA-256 trong khoảng 2^128 operations thay vì 2^256 — giảm một nửa security bits. SHA-256 vẫn an toàn nếu tăng lên SHA-512 (hoặc dùng SHA-256 với các biện pháp bổ sung). So với ECC bị Shor algorithm đe dọa nghiêm trọng hơn, hash function ít bị ảnh hưởng bởi quantum computing hơn nhiều.
Double-SHA256 (SHA256 hai lần liên tiếp) giúp phòng ngừa length extension attack — một điểm yếu của SHA-256 đơn lẻ khi dùng trong MAC (Message Authentication Code) schemes. Dù Bitcoin không dùng SHA-256 như MAC theo nghĩa truyền thống, Satoshi áp dụng double-hash như lớp bảo vệ thêm theo best practice thời điểm đó.
📚Tham khảo
- NIST FIPS 180-4 — Secure Hash Standard (2015)
- Bertoni et al. — "Keccak" (original submission to NIST SHA-3 competition)
- Stevens et al. — "The First Collision for Full SHA-1" (SHAttered, 2017)
- Grassi et al. — "Poseidon: A New Hash Function for Zero-Knowledge Proof Systems" (2019)
- Nakamoto, S. — Bitcoin Whitepaper (2008)