乐闻世界logo
搜索文章和话题

区块链中使用了哪些密码学技术?详解哈希函数、数字签名和 Merkle Tree

3月7日 12:04

密码学(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

以太坊地址生成

shell
1. 生成私钥(256 位随机数) 私钥 = 随机数 2. 通过椭圆曲线计算公钥 公钥 = 私钥 × G(曲线基点) 3. 计算公钥哈希 hash = Keccak256(公钥) 4. 取后 20 字节作为地址 地址 = "0x" + hash[12:32]

3. Merkle Tree(默克尔树)

结构与原理

shell
Merkle 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

区块链中的应用

  1. 交易完整性验证:快速验证大量交易
  2. 轻节点同步:SPV(简单支付验证)只需下载区块头
  3. 状态证明:以太坊的状态树使用 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)
标签:Blockchain