密码学(Cryptography) 是区块链安全性的基石,通过数学算法保证数据的机密性、完整性、真实性和不可抵赖性。
1. 哈希函数(Hash Function)
定义与特性
哈希函数是将任意长度输入转换为固定长度输出的单向函数。
关键特性:
| 特性 | 说明 | 区块链应用 |
|---|---|---|
| 确定性 | 相同输入总是产生相同输出 | 数据验证 |
| 单向性 | 无法从哈希值反推原始数据 | 保护隐私 |
| 抗碰撞性 | 难以找到两个不同输入产生相同输出 | 防篡改 |
| 雪崩效应 | 输入微小变化导致输出巨大差异 | 检测篡改 |
常用哈希算法
SHA-256(比特币使用):
shell输入:"Hello Blockchain" 输出:a8f5f167f44f4964e6c998dee827110c9a0c5e1e7a5b6e5f8d9c2b1a4e7f3d6 (固定 256 位 / 64 个十六进制字符)
Keccak-256(以太坊使用):
- SHA-3 标准的变种
- 抗长度扩展攻击
- 用于生成以太坊地址
区块链中的应用
shell区块结构中的哈希应用: ┌─────────────────────────────────────┐ │ 区块头 (Block Header) │ ├─────────────────────────────────────┤ │ 前一区块哈希 (Previous Hash) │ ← 链接区块,形成链条 │ Merkle Root │ ← 交易数据完整性验证 │ 时间戳 (Timestamp) │ │ Nonce │ └─────────────────────────────────────┘ 区块哈希 = SHA256(SHA256(区块头))
2. 数字签名(Digital Signature)
非对称加密基础
shell密钥对生成: ┌──────────────┐ ┌──────────────┐ │ 私钥 (SK) │ ←─────→ │ 公钥 (PK) │ │ (保密) │ 数学关联 │ (公开) │ └──────────────┘ └──────────────┘ ↓ ↓ 用于签名 用于验证
常用算法:
- ECDSA(Elliptic Curve Digital Signature Algorithm):比特币、以太坊使用
- EdDSA(Edwards-curve Digital Signature Algorithm):更快更安全
签名与验证流程
shell交易签名过程: 1. 交易数据准备 {"from": "0xabc...", "to": "0xdef...", "value": 100} 2. 计算交易哈希 txHash = Keccak256(交易数据) 3. 使用私钥签名 signature = ECDSA_Sign(私钥, txHash) 4. 广播交易 交易数据 + 签名 + 公钥 验证过程: ECDSA_Verify(公钥, txHash, signature) → true/false
以太坊地址生成
shell1. 生成私钥(256 位随机数) 私钥 = 随机数 2. 通过椭圆曲线计算公钥 公钥 = 私钥 × G(曲线基点) 3. 计算公钥哈希 hash = Keccak256(公钥) 4. 取后 20 字节作为地址 地址 = "0x" + hash[12:32]
3. Merkle Tree(默克尔树)
结构与原理
shellMerkle Tree 结构: Root Hash / \ Hash 1-2 Hash 3-4 / \ / \ Hash 1 Hash 2 Hash 3 Hash 4 | | | | Tx 1 Tx 2 Tx 3 Tx 4 (每个 Hash = SHA256(子节点哈希拼接))"
默克尔证明(Merkle Proof)
轻节点验证交易:
shell验证 Tx 3 是否存在于区块中: 需要数据: - Tx 3 的哈希 - Hash 4(兄弟节点) - Hash 1-2(叔节点) - Root Hash(区块头中) 验证步骤: 1. Hash 3 = SHA256(Tx 3) 2. Hash 3-4 = SHA256(Hash 3 + Hash 4) 3. 计算 Root = SHA256(Hash 1-2 + Hash 3-4) 4. 比较计算的 Root 与区块头中的 Root
区块链中的应用
- 交易完整性验证:快速验证大量交易
- 轻节点同步:SPV(简单支付验证)只需下载区块头
- 状态证明:以太坊的状态树使用 Merkle Patricia Tree
4. 零知识证明(Zero-Knowledge Proof)
基本概念
定义:证明者向验证者证明某个陈述为真,而不透露任何有用信息。
zk-SNARKs(以太坊 ZK Rollup 使用):
- Succinct:证明体积小
- Non-interactive:无需交互
- ARgument of Knowledge:知识论证
应用场景
shell隐私交易示例: ┌─────────────────────────────────────┐ │ 证明:我知道一个秘密 x,使得 │ │ hash(x) = 0xabc... │ │ │ │ 不透露:x 的具体值 │ └─────────────────────────────────────┘
面试要点
- 理解哈希函数的单向性和抗碰撞性
- 掌握公钥私钥的关系和数字签名原理
- 能够解释 Merkle Tree 如何高效验证数据
- 了解零知识证明的基本概念和应用
- 知道不同区块链使用的具体算法(SHA-256 vs Keccak-256)