← 返回预习计划
Module 01

Module 01: Applied Cryptography

从 Hash 函数、非对称加密到零知识证明,建立区块链安全保证的密码学基础

区块链的安全性不依赖任何中心化机构,而是完全建立在密码学之上。理解密码学原理,是理解区块链为什么可信的前提。本模块覆盖四个核心主题:Hash 函数、非对称加密、Merkle Tree 和零知识证明。

Hash 函数

Hash 函数接收任意长度的输入,输出固定长度的摘要。区块链最常用的是 SHA-256(Secure Hash Algorithm,输出 256 位)。

核心性质:

  • 确定性:相同输入永远产生相同输出
  • 雪崩效应:输入改变 1 bit,输出变化超过 50%
  • 抗碰撞性:找到两个不同输入产生相同输出,在计算上不可行
  • 单向性:从输出无法反推输入

Python 演示:

import hashlib

msg1 = "Hello"
msg2 = "hello"  # 仅首字母大小写不同

h1 = hashlib.sha256(msg1.encode()).hexdigest()
h2 = hashlib.sha256(msg2.encode()).hexdigest()

print(h1)  # 185f8db32271fe25f561a6fc938b2e26...
print(h2)  # 2cf24dba5fb0a30e26e83b2ac5b9e29e...
# 两个哈希值完全不同——这就是雪崩效应

Bitcoin 中的应用:

  • 区块哈希:每个区块头经过两次 SHA-256(SHA256(SHA256(block_header))),生成区块的唯一标识。矿工通过调整 nonce 值反复计算,直到哈希值小于目标难度——这就是工作量证明(Proof of Work)。
  • Merkle Root:区块内所有交易的哈希值两两配对、逐层向上哈希,最终得到一个根哈希,写入区块头。任何一笔交易被篡改,根哈希都会改变。

非对称加密

传统加密(AES 等)用同一把密钥加解密,双方必须安全交换密钥。非对称加密用一对密钥解决这个问题:

  • 私钥:随机生成的 256 位数字,必须保密
  • 公钥:通过椭圆曲线算法从私钥推导,可以公开
  • 私钥能推出公钥,但公钥无法反推私钥

椭圆曲线数字签名算法(ECDSA):

Bitcoin 使用 secp256k1 曲线。交易签名流程:

  1. 发送方用私钥对交易数据的哈希值进行签名,生成签名 (r, s)
  2. 签名和公钥一起附在交易中广播到网络
  3. 任何节点都能用公钥验证签名的有效性——确认交易确实由私钥持有者发起
# 概念演示(实际实现使用 ecdsa 或 coincurve 库)
from hashlib import sha256

# 1. 私钥 → 公钥(椭圆曲线点乘)
# private_key = random 256-bit number
# public_key = private_key * G  (G 是曲线的生成点)

# 2. 签名
# msg_hash = sha256(transaction_data)
# signature = sign(msg_hash, private_key) → (r, s)

# 3. 验证
# verify(msg_hash, signature, public_key) → True/False

地址生成链路: 私钥 → ECDSA → 公钥 → SHA-256 → RIPEMD-160 → Base58Check 编码 → Bitcoin 地址。

这条链路是单向的。知道 Bitcoin 地址无法反推公钥,知道公钥无法反推私钥。

Merkle Tree

Merkle Tree(哈希树)是一种二叉树数据结构,叶节点是各交易的哈希值,每个非叶节点是其两个子节点哈希值的拼接再哈希。

          Merkle Root
          /        \
       H(AB)      H(CD)
       /   \      /   \
     H(A)  H(B) H(C)  H(D)
      |     |    |     |
     Tx A  Tx B Tx C  Tx D

高效验证原理:

要验证 Tx C 是否在区块中,不需要下载全部交易。只需要:

  1. H(D)(Tx C 的兄弟节点哈希)
  2. H(AB)(上一层的兄弟节点哈希)
  3. Merkle Root(区块头中已有)

用 H(C) 和 H(D) 算出 H(CD),再和 H(AB) 算出根哈希,与区块头中的 Merkle Root 对比。如果一致,证明 Tx C 确实在这个区块中。

复杂度:一个包含 N 笔交易的区块,验证一笔交易只需要 log₂(N) 个哈希值。1000 笔交易只需 10 个哈希。

SPV 节点:简单支付验证(Simplified Payment Verification)节点利用这个特性,只下载区块头(80 字节/区块),通过 Merkle Proof 验证交易是否被确认,不需要存储完整区块链。手机钱包就是典型的 SPV 客户端。

零知识证明 (ZKP)

零知识证明允许证明者(Prover)向验证者(Verifier)证明某个陈述为真,同时不泄露任何额外信息。

经典类比:一个山洞有两条通道 A 和 B,在深处连通,连通处有一扇需要密码的门。证明者想证明自己知道密码,但不想透露密码本身。方法:证明者随机选一条通道进入,验证者在洞口喊出要求从哪条通道出来。如果证明者知道密码,每次都能从指定通道出来;不知道密码,每次只有 50% 的概率猜对。重复 20 次后,连续猜对的概率低于百万分之一。

两大技术路线:

zk-SNARKszk-STARKs
全称Zero-Knowledge Succinct Non-interactive ARguments of KnowledgeZero-Knowledge Scalable Transparent ARguments of Knowledge
可信设置需要(初始参数生成阶段需要信任)不需要(透明)
证明大小小(~200 bytes)大(~50 KB)
验证速度较快
抗量子否(依赖椭圆曲线)是(基于哈希函数)
代表项目Zcash, FilecoinStarkNet, StarkEx

区块链应用:

  • Zcash:用 zk-SNARKs 实现隐私交易。发送方证明自己有足够余额且交易有效,但不暴露发送方、接收方和金额。
  • zkRollups:Layer 2 扩容方案。将数百笔交易在链下执行,生成一个零知识证明提交到主链。主链验证证明即可确认所有交易的正确性,不需要逐笔重新执行。zkSync、Scroll、Polygon zkEVM 都是这条路线。

推荐资源

名称类型说明
Cryptography I - Stanford (Coursera)在线课程Dan Boneh 的密码学入门,覆盖对称加密、公钥加密、哈希函数,学术深度但讲解清晰
But how does bitcoin actually work? - 3Blue1Brown视频用可视化方式讲解 SHA-256、数字签名和工作量证明,适合建立直觉
Bitcoin: A Peer-to-Peer Electronic Cash System论文中本聪原始白皮书,9 页,直接读原文比任何二手解读都值
Mastering Bitcoin, Chapter 4书籍章节密钥、地址、钱包的完整技术讲解,含代码示例
ZKP MOOC (Berkeley RDI)在线课程零知识证明系统课程,从理论到实现,适合想深入 ZKP 的学习者

思考题

  1. Hash 函数的抗碰撞性和单向性如何帮助 P2P 网络中的节点验证数据完整性?如果 Hash 函数可逆,共识机制会面临什么问题?
  2. 在一个没有中心权威的网络中,数字签名如何让节点确认交易的发起者身份?如果没有非对称加密,去中心化系统能否运作?
  3. Merkle Tree 的 log₂(N) 验证复杂度对轻节点意味着什么?想象一个有百万笔交易的区块链网络,SPV 节点如何在不信任任何单一节点的前提下工作?

下一步

密码学提供了安全保证的基础工具。下一模块将讲解这些工具如何组合成一个去中心化系统——共识机制与网络协议(Module 02)。

动手练习