区块链并未发明新的密码学算法,而是将哈希函数、数字签名、承诺方案、可验证随机函数等经典原语以精妙的方式组合在一起,构建出无需信任第三方即可运转的分布式账本。本文不试图覆盖区块链的全部知识领域,而是聚焦于其底层的密码学原语——每个原语的形式化安全定义、在链上的具体用法,以及工程实践中暴露的真实取舍。
笔者认为,理解区块链密码学的关键在于始终追问:某条链在某个环节选用某个原语,究竟买到了哪些安全属性、付出了什么代价?链上计算的透明性、不可逆性和资源约束,对密码学方案的效率与可组合性提出了极苛刻的要求。从这个视角出发,我们将依次考察哈希函数与区块结构、默克尔树与状态证明、链上签名方案、Taproot/MuSig2 多方签名、VRF 与 RANDAO 共识随机性,以及承诺方案的链上模式。
一、哈希函数与区块结构
先看一张图,把这一节的关键关系串起来。
graph TD
A[哈希与默克尔树] --> B[数字签名]
B --> C[共识协议]
C --> D[智能合约]
D --> E[链上隐私与 ZK]
哈希函数是区块链使用最广泛的密码学原语。比特币采用 SHA-256,以太坊采用 Keccak-256。其三个核心安全属性在区块链中各有对应的角色:
- 抗原像性(Preimage Resistance):支撑工作量证明——矿工穷举 Nonce 使 SHA256(SHA256(BlockHeader)) < Target,在随机预言机模型下没有比穷举更好的策略。
- 抗第二原像性(Second Preimage Resistance):保证已确认交易无法被替换为另一笔交易而保持相同哈希。
- 抗碰撞性(Collision Resistance):保障默克尔树的完整性验证——若攻击者能找到碰撞,就能构造虚假的成员证明。
区块链最基本的数据结构是哈希链(Hash Chain)——每个区块头包含前一区块头的哈希值,形成从创世区块到最新区块的不可断裂的链条。以比特币为例,区块头固定 80 字节,包含协议版本号、前一区块头哈希、默克尔根、时间戳、难度目标和 Nonce。
哈希链将抗原像性这一局部安全属性转化为全链范围的不可篡改性:篡改历史区块中的某笔交易,会导致默克尔根改变、区块头哈希改变,进而要求攻击者重新计算从该区块到链尾所有区块的工作量证明。从密码学角度看,这是一个优雅的安全放大(Security Amplification)构造。
PoW 挖矿本质上是一个参数化的哈希原像搜索问题:矿工穷举 Nonce,寻找满足 SHA256(SHA256(BlockHeader)) < Target 的解。在随机预言机模型下,每次尝试的成功概率为 Target / 2^256,因此期望尝试次数为 2^256 / Target。难度目标每 2016 个区块自动调整,维持约 10 分钟的出块间隔。这一设计巧妙地将计算资源转化为安全性的度量——攻击者若要重写最近 k 个区块,需投入的期望算力与诚实链在 k 个区块周期内消耗的总算力相当。
值得注意的是,不同链对哈希函数的选择反映了不同的安全取舍。比特币的 SHA-256 对 ASIC 友好,导致算力高度集中于专用硬件;莱特币选择 Scrypt、以太坊 1.0 选择 Ethash 等内存困难型函数(Memory-Hard Function),旨在提高 ASIC 制造门槛,使 GPU 矿工保持竞争力。从密码学角度,内存困难性并非哈希函数的标准安全属性,而是一种资源公平性(Resource Fairness)约束——它限制的不是计算安全性,而是硬件经济学中的规模效应。
二、默克尔树与状态证明
默克尔树(Merkle Tree)由 Ralph Merkle 于 1979 年提出,是密码学历史上第一个真正意义上的「可验证数据结构」——它将哈希函数的局部安全属性提升为对整个数据集的全局完整性保证。这个看似简单的发明比区块链早了近三十年,却预见了「不信任环境下高效验证」这一核心需求。今天我们在区块链中看到的所有状态证明机制——SPV、状态根、Verkle 树——追根溯源都是默克尔树思想的延伸。如果没有默克尔树,区块链的「轻节点」概念将无从谈起,而一个要求所有参与者存储全部数据的系统注定无法规模化。
二叉默克尔树(Binary Merkle Tree) 的构建过程如下:将所有叶子节点(通常是交易的哈希值)两两配对,计算每对节点的级联哈希值作为父节点;重复此过程直到只剩一个根节点——即默克尔根(Merkle Root)。如果叶子节点数量为奇数,则复制最后一个节点使其成对。
默克尔树的核心价值在于其高效的成员证明(Proof of Inclusion)机制。要证明某笔交易存在于一个包含 n 笔交易的区块中,只需提供从该叶子节点到根节点路径上的 log2(n) 个兄弟节点哈希值。验证者可以从目标交易的哈希值出发,逐层向上计算,最终与区块头中的默克尔根比对。这一机制使得轻节点(Light Node)无需下载整个区块即可验证特定交易的存在性——这就是比特币白皮书中描述的简化支付验证(Simplified Payment Verification, SPV)。
以下是默克尔树构建与证明验证的 Python 实现:
import hashlib
from typing import List, Tuple, Optional
def sha256(data: bytes) -> bytes:
return hashlib.sha256(data).digest()
class MerkleTree:
"""二叉默克尔树的构建与证明验证。"""
def __init__(self, leaves: List[bytes]):
if not leaves:
raise ValueError("叶子节点列表不能为空")
self.leaves = [sha256(leaf) for leaf in leaves]
self.layers: List[List[bytes]] = [self.leaves]
self._build()
def _build(self):
current = self.leaves
while len(current) > 1:
next_layer = []
for i in range(0, len(current), 2):
left = current[i]
right = current[i + 1] if i + 1 < len(current) else current[i]
next_layer.append(sha256(left + right))
self.layers.append(next_layer)
current = next_layer
@property
def root(self) -> bytes:
return self.layers[-1][0]
def get_proof(self, index: int) -> List[Tuple[bytes, str]]:
"""获取指定叶子节点的默克尔证明路径。
返回值为 (兄弟哈希, 方向) 的列表,方向为 'L' 或 'R',
表示兄弟节点在当前节点的左侧还是右侧。
"""
if index < 0 or index >= len(self.leaves):
raise IndexError(f"索引 {index} 超出范围 [0, {len(self.leaves)})")
proof = []
for layer in self.layers[:-1]:
if index % 2 == 0:
sibling_index = index + 1
direction = "R"
else:
sibling_index = index - 1
direction = "L"
if sibling_index < len(layer):
proof.append((layer[sibling_index], direction))
else:
proof.append((layer[index], direction))
index //= 2
return proof
@staticmethod
def verify_proof(
leaf_data: bytes,
proof: List[Tuple[bytes, str]],
expected_root: bytes,
) -> bool:
"""验证默克尔证明:从叶子哈希沿路径重算到根,与期望根比对。"""
current = sha256(leaf_data)
for sibling_hash, direction in proof:
if direction == "R":
current = sha256(current + sibling_hash)
else:
current = sha256(sibling_hash + current)
return current == expected_root
if __name__ == "__main__":
transactions = [f"tx_{i}".encode() for i in range(8)]
tree = MerkleTree(transactions)
print(f"默克尔根: {tree.root.hex()}")
target_index = 3
proof = tree.get_proof(target_index)
print(f"\n交易 tx_{target_index} 的证明路径 ({len(proof)} 层):")
for sibling, direction in proof:
print(f" {direction}: {sibling.hex()[:16]}...")
valid = MerkleTree.verify_proof(transactions[target_index], proof, tree.root)
print(f"\n验证结果: {'通过' if valid else '失败'}")
tampered = b"tx_fake"
invalid = MerkleTree.verify_proof(tampered, proof, tree.root)
print(f"篡改后验证: {'通过' if invalid else '失败'}")以太坊在默克尔树的基础上进一步引入了默克尔帕特里夏树(Merkle Patricia Trie, MPT)。与比特币仅用默克尔树组织交易列表不同,以太坊需要维护一个庞大的全局状态——包括每个账户的余额、Nonce、合约代码和存储。MPT 将十六叉前缀树(Hexary Trie)与默克尔哈希相结合:每个内部节点存储其所有子节点哈希的聚合值,任何叶子节点的变更都会沿路径向上传播到根节点。以太坊的区块头中包含三棵 MPT 的根哈希:状态根(State Root)、交易根(Transactions Root)和收据根(Receipts Root),分别对应全局状态、区块交易列表和交易执行结果。
MPT 不仅支持存在性证明(Proof of Inclusion),还支持不存在性证明(Proof of Exclusion)——即证明某个键值对不存在于树中。这一特性对于轻客户端验证”某账户不存在”或”某存储槽为空”等负面断言至关重要。需要指出的是,以太坊社区正在推进从 MPT 向 Verkle 树(Verkle Tree)的迁移。Verkle 树使用向量承诺(Vector Commitment)替代哈希聚合,可以将证明大小从 O(k·log n) 降低到 O(k),其中 k 是树的分支因子,n 是叶子节点数量。这一改进对于降低无状态客户端(Stateless Client)的带宽需求具有重要意义。
下表对比比特币 UTXO 模型与以太坊账户模型在默克尔证明方面的差异:
| 维度 | UTXO 模型(比特币) | 账户模型(以太坊) |
|---|---|---|
| 默克尔树用途 | 二叉默克尔树组织区块内交易列表,支持 SPV 证明 | MPT 维护三棵状态树,支持任意状态查询证明 |
| 签名粒度 | 每笔交易的每个输入独立签名,证明对特定 UTXO 的所有权 | 每笔交易整体签名一次,证明账户持有者的授权 |
| 默克尔证明大小 | O(log n),n 为区块内交易数(通常数千笔) | O(k · log n),n 为全局状态条目数(数亿级),k 为树分支因子 |
| 并行验证 | UTXO 之间天然独立,利于签名的并行批量验证 | 交易可能涉及共享状态,需要顺序执行 |
三、链上签名方案
数字签名是区块链中连接”身份”与”行为”的纽带——每一笔交易的合法性都通过签名来证明。
ECDSA/secp256k1。 比特币和以太坊都采用基于 secp256k1 椭圆曲线的 ECDSA。secp256k1 的参数具有特殊结构(a = 0, b = 7),标量乘法可利用自同态(Endomorphism)加速。比特币地址的生成过程本身就是一个密码学哈希链:对公钥先计算 SHA-256 再计算 RIPEMD-160,得到 20 字节的公钥哈希,再经 Base58Check 或 Bech32 编码为人类可读的地址。以太坊则简化为取公钥 Keccak-256 哈希的最后 20 字节,并引入了 ecrecover 预编译合约——输入消息和签名(含恢复标识符 v),直接恢复签名者公钥,Gas 成本仅 3000。
ECDSA 的主要工程风险在于签名时的随机数 k:若 k 被复用或可预测,私钥即刻泄露。攻击者只需从两个使用相同 k 的签名中提取 k = (m1 - m2) / (s1 - s2) (mod n),进而计算 sk = (s·k - m) / r (mod n)。PlayStation 3 的私钥泄露事件即源于此。RFC 6979 提出了确定性 k 生成方案(k = HMAC(sk, m)),从根本上消除了随机数依赖,但并未改变 ECDSA 缺乏线性性这一结构性缺陷——这一缺陷直接驱动了 Schnorr 签名在 Taproot 中的引入。
BLS 签名。 以太坊信标链选择了 BLS12-381 曲线上的 BLS 签名方案。BLS 的核心优势在于非交互式聚合:任何人可将 n 个 BLS 签名聚合为一个 48 字节的聚合签名,且聚合过程无需签名者参与。验证聚合签名的方式是:检查 e(sigma_agg, g2) = product(e(H(m_i), pk_i)),其中 e 是双线性配对,g2 是 G2 上的生成元。当所有签名者签署同一消息时(如信标链的区块投票),验证可简化为一次配对运算,效率大幅提升。
在信标链中,每个时隙有数千个验证者投票,BLS 聚合使投票可被压缩为一个签名加一个位图(Bitfield)。安全性基于 co-CDH(Computational co-Diffie-Hellman)假设。需要注意的实践教训是:虽然聚合签名大小固定,验证时仍需访问所有 n 个公钥并执行配对运算。当验证者规模从数百增长至数十万时,瓶颈从签名大小迁移到公钥管理和配对计算上——这提醒我们评估密码学方案的可扩展性时必须审视整个验证流水线,而非单一维度。
EdDSA/Ed25519。 Solana、Cosmos、Near 等新兴链选择了 EdDSA。确定性签名生成从根本上消除了随机数相关的私钥泄露风险,严格的验证规则也避免了签名可锻造性(Signature Malleability)问题。Ed25519 使用 Curve25519 的扭曲爱德华形式,在常规硬件上可达到每秒数万次验证的性能,且其常数时间实现降低了侧信道攻击的风险。
下表对比三种主流链上签名方案的核心差异:
| 属性 | ECDSA/secp256k1 | Schnorr/secp256k1 | BLS/BLS12-381 |
|---|---|---|---|
| 签名大小 | 70-72 字节(DER 编码) | 64 字节 | 48 字节 |
| 公钥大小 | 33 字节(压缩) | 32 字节(x-only) | 96 字节 |
| 线性性 | 否 | 是 | 是(加法) |
| 非交互式聚合 | 否 | 否(需 MuSig2 协议) | 是 |
| 批量验证 | 有限加速 | 约 2 倍加速 | 同消息时极高效 |
| 安全假设 | ECDLP | ECDLP(ROM/AGM) | co-CDH + 配对 |
| 确定性签名 | 需 RFC 6979 | 原生支持 | 原生支持 |
四、Taproot 与 MuSig2
2021 年比特币 Taproot 升级(BIP-340/341/342)引入了 Schnorr 签名,并以此为基础重构了脚本执行模型。这是比特币在密码学层面最重要的一次演进,其收益远超”换一种签名算法”。
Schnorr 签名的线性性
Schnorr 签名的核心属性是线性性(Linearity):给定同一消息 m 的两个签名 (R1, s1) 和 (R2, s2),它们的”和” (R1+R2, s1+s2) 是对聚合公钥 P1+P2 的合法签名。这一属性是 ECDSA 不具备的。比特币 BIP-340 采用了 x-only 公钥(仅存储 x 坐标,32 字节),配合隐式选择 y 坐标的偶数形式,进一步节省了链上空间。
Schnorr 签名还支持高效的批量验证(Batch Verification):验证 n 个独立签名时,可以将它们线性组合为一次多标量乘法(Multi-Scalar Multiplication),计算量约为 n/2 次单签验证的成本。对于全节点的初始同步(Initial Block Download),这意味着签名验证的吞吐量接近翻倍。
MAST:默克尔化抽象语法树
Taproot 的第二个关键组件是 MAST(Merkelized Abstract Syntax Tree,BIP-341)。传统 P2SH 多签要求在花费时公开完整的赎回脚本,暴露所有参与者公钥和策略逻辑。MAST 将多个备选花费条件组织为一棵默克尔树,树根与内部公钥 P 通过 tweaking 结合为输出公钥 Q:
Q = P + H(P || merkle_root) · G
其中 H 是哈希函数,G 是椭圆曲线基点。花费时有两条路径:
- 密钥路径(Key Path):所有参与者合作,直接用聚合私钥对 Q 签名。链上只出现一个 32 字节公钥和一个 64 字节签名,与单签交易完全相同。
- 脚本路径(Script Path):仅在合作失败时使用,公开所执行的那一个脚本分支及其默克尔证明,其余分支保持隐藏。
隐私收益分析。 Taproot 的真实隐私收益来自”最优路径的不可区分性”:当交易使用密钥路径花费时,外部观察者无法判断输出背后是单签、2-of-3 多签、时间锁还是复杂的条件逻辑。所有合作完成的交易在链上呈现为同一种形态。这比隐藏交易金额(如 Pedersen 承诺)更具实用价值——它隐藏的是花费策略本身。对于闪电网络的通道开关交易、DLC(Discreet Log Contract)以及遗产规划等场景,这意味着正常路径不再泄露合约的存在。
MuSig2:两轮多方签名协议
MuSig2(Nick, Jonas, Ruffing 2021)是为 Taproot 设计的多方 Schnorr 签名协议,解决了早期 MuSig 方案需要三轮交互的效率瓶颈。
密钥聚合。 n 个参与者的公钥 P1, …, Pn 通过以下方式聚合为一个公钥:
a_i = H_agg(L, P_i) 其中 L = {P1, ..., Pn}
P_agg = sum(a_i · P_i) for i = 1..n
系数 a_i 通过哈希计算得出,防止 Rogue Key 攻击(恶意参与者选择特殊公钥使聚合公钥仅由其控制)。聚合公钥 P_agg 是一个标准的 secp256k1 点,验证者无法将其与单一用户的公钥区分。
两轮签名协议。 对消息 m 的签名分两轮完成:
- 第一轮(Nonce 交换):每个参与者 i 独立采样两个随机 Nonce (r_i1, r_i2),计算对应的 Nonce 点 (R_i1, R_i2) 并广播。聚合 Nonce 为 R = sum(R_i1) + b·sum(R_i2),其中 b = H_non(P_agg, {R_i1, R_i2}, m)。使用两个 Nonce 是 MuSig2 相对 MuSig 的关键改进——它使得第一轮可以在消息 m 确定之前预计算,从而实现真正的两轮协议。
- 第二轮(部分签名):每个参与者计算部分签名 s_i = r_i1 + b·r_i2 + c·a_i·x_i (mod n),其中 c = H_sig(P_agg, R, m) 是挑战值,x_i 是私钥。最终签名 (R, s) 中 s = sum(s_i)。
安全性直觉。 MuSig2 的安全性在代数群模型(Algebraic Group Model, AGM)和随机预言机模型下可归约到离散对数问题的困难性。安全证明的核心思路是:若存在一个能伪造聚合签名的攻击者 A,则可构造一个归约 B,B 模拟诚实参与者与 A 交互,通过控制随机预言机的输出,从 A 的伪造签名中提取离散对数。两个 Nonce 的设计保证了即使攻击者在第一轮之后自适应地选择消息,也无法操纵聚合 Nonce R 的值。
真实收益量化。 以一个 3-of-3 多签为例,传统 P2WSH 交易的见证数据约 252 字节(3 个 ECDSA 签名 + 赎回脚本),而 MuSig2 + Taproot 密钥路径仅需 64 字节(一个 Schnorr 签名)。交易体积缩减约 75%,相应的矿工费成本也等比下降。更重要的是,这笔交易在链上与任何单签 P2TR 交易完全相同,多签身份被完全隐藏。
五、可验证随机函数与 RANDAO
在 PoS 共识中,领导者选举(Leader Election)需要一个”公平的骰子”——其输出不可预测、不可操纵、且可被第三方验证。可验证随机函数(VRF)和 RANDAO 承诺-揭示方案是当前两种主流构造。
VRF 的形式化安全属性
VRF 是一个由密钥对 (sk, pk) 参数化的函数族,包含三个算法:
- Eval(sk, x) -> (y, pi):用私钥 sk 对输入 x 计算输出 y 和证明 pi。
- Verify(pk, x, y, pi) -> {0, 1}:用公钥 pk 验证 (x, y, pi) 的正确性。
VRF 必须同时满足三个安全属性:
- 可验证性(Verifiability):若 (y, pi) = Eval(sk, x),则 Verify(pk, x, y, pi) = 1 必然成立。即诚实计算的输出总能通过验证。
- 唯一性(Uniqueness):对于任意固定的 pk 和 x,不存在两个不同的 (y1, pi1) 和 (y2, pi2) 都能通过 Verify。即使攻击者控制了 sk,也无法为同一输入生成两个不同的合法输出。这一属性将 VRF 与普通的可验证签名方案区分开来——它保证输出的确定性。
- 伪随机性(Pseudorandomness):对于不知道 sk 的敌手,VRF 输出 y 与同等长度的真随机串在计算上不可区分。形式化地,对于任意概率多项式时间敌手 A,即使 A 可以查询除目标输入 x* 之外的任意输入的 VRF 输出,A 区分 Eval(sk, x*) 的输出与随机串的优势仍可忽略。
Algorand 的共识协议是 VRF 在区块链中最纯粹的应用:每个节点独立计算 VRF(sk, seed || round),将输出 y 与自身权益份额对比——若 y 落入阈值范围则自选为委员会成员。这种”密码学自选举”(Cryptographic Self-Selection)消除了通信开销,且委员会成员身份在其公布消息之前对其他节点完全保密,有效防止了针对性的 DoS 攻击。
ECVRF 构造概览。 当前最常用的 VRF 实例化方案是 ECVRF(RFC 9381),基于椭圆曲线构造。其核心思路是:
Gamma = sk · H_to_curve(x) -- 将输入映射到曲线点,再用私钥做标量乘
y = H_to_field(Gamma) -- 哈希到域元素作为伪随机输出
pi = DLEQ_proof(sk, G, pk, H_to_curve(x), Gamma) -- 证明离散对数相等
其中 DLEQ 证明(Discrete Log Equality Proof)使验证者相信 log_G(pk) = log_{H(x)}(Gamma),即 Gamma 确实由持有 pk 对应私钥的人正确计算。验证者通过检查 DLEQ 证明和重新计算 y = H_to_field(Gamma) 来确认输出正确性。唯一性属性来源于 H_to_curve 和标量乘法的确定性——对于固定的 sk 和 x,Gamma 是唯一确定的曲线点。
RANDAO:承诺-揭示聚合随机性
以太坊信标链的 RANDAO 机制采用了不同的路径。它不直接使用 VRF,而是利用 BLS 签名的确定性作为隐式承诺方案,通过多轮聚合生成公共随机种子。
协议流程:
- 每个纪元(Epoch,32 个时隙)维护一个随机累加器 randao_mix。
- 被选中的区块提议者对当前纪元编号计算 BLS 签名:reveal_i = BLS.Sign(sk_i, epoch)。由于 BLS 签名对同一消息的输出唯一(Uniqueness 属性),提议者无法选择性地生成多个不同的 reveal 值。
- 新的随机累加器更新为 randao_mix = randao_mix XOR H(reveal_i)。
- 一个纪元结束后,最终的 randao_mix 用于确定下一个纪元的验证者职责分配。
偏置攻击(Bias Attack)与其边界。 RANDAO 的已知弱点是最后揭示者偏置:纪元中最后一个提议者可以观察到前面所有 reveal 值,计算出若自己正常揭示的最终 randao_mix,然后决定是否放弃出块(牺牲区块奖励)以获得一个对自己更有利的随机种子。具体而言,若最后有 k 个连续时隙由同一验证者(或串谋集团)控制,攻击者可以从 2^k 个候选种子中选择最优值,获得 log2(2^k) = k 比特的偏置能力。
对于以太坊目前的参数——每个纪元 32 个时隙、数十万验证者——单个验证者连续控制最后 k >= 2 个时隙的概率极低,偏置收益远小于放弃出块的损失。但对于验证者集合较小的链,这一攻击向量不可忽视。以太坊的长期路线图计划引入可验证延迟函数(Verifiable Delay Function, VDF)作为 RANDAO 的补充:VDF 的输出需要固定的顺序计算时间才能得出,使得最后揭示者无法在出块截止前完成偏置计算。
RANDAO 与纯 VRF 方案的取舍。 两种构造各有优劣。VRF 方案(如 Algorand)的随机性由单个节点的私钥保证,不存在最后揭示者偏置,但领导者身份在其发布消息的瞬间暴露,存在被瞬时 DoS 攻击的窗口。RANDAO 将随机性分散到所有提议者,单个节点的影响被限制在 1 比特(出块或不出块),但需要接受最后揭示者偏置这一固有弱点。以太坊选择 RANDAO 的实际考量包括:BLS 签名基础设施已经存在(验证者本就需要对区块签名)、协议复杂度较低、以及偏置攻击的经济成本在大验证者集合下足够高。
六、承诺方案与链上密码学模式
承诺方案(Commitment Scheme)允许一方先承诺一个值(Commit),稍后再揭示(Reveal),同时满足两个安全属性:隐藏性(Hiding)——承诺值不泄露被承诺的信息;绑定性(Binding)——承诺者无法在揭示阶段改变被承诺的值。这一基础原语在区块链中有多种具体实例化。
哈希时间锁合约(HTLC)。 闪电网络和跨链原子交换的核心构件。Alice 选择秘密值 s,计算 h = SHA256(s),创建合约:Bob 在截止时间前提交 s 使得 SHA256(s) = h 即可取走资金。这里 SHA-256 的抗原像性提供绑定性,哈希值的单向性提供隐藏性。
Pedersen 承诺与保密交易。 保密交易使用 Pedersen 承诺 C = v·G + r·H 隐藏交易金额,其中 v 为金额,r 为致盲因子,G 和 H 为椭圆曲线上的两个独立生成元。Pedersen 承诺具有加法同态性——多个承诺之和等于对应金额之和的承诺——使得节点可在不知道具体金额的情况下验证交易平衡。每笔交易还需附带范围证明(Bulletproofs 方案,证明大小 O(log n))以防止金额为负值的溢出攻击。
零知识证明验证。 zk-SNARK 验证合约是承诺方案在链上的高级应用。以太坊通过 EIP-196/197 引入 BN254 曲线上的配对运算预编译合约,使 Groth16 证明的链上验证成本降至约 20 万 Gas。zk-Rollup(如 zkSync、StarkNet)基于这一能力,将交易执行移至链下,仅在链上提交状态变更和有效性证明——本质上是对”链下计算正确执行”的一个密码学承诺。
默克尔证明在合约中的应用。 智能合约通过验证默克尔证明实现高效的链上数据引用:空投合约存储一个默克尔根(32 字节),用户提交 O(log n) 的证明领取份额;跨链桥验证源链区块头中的默克尔证明确认交易真实性。这种”链下存储、链上验证”的模式将默克尔树从数据结构提升为一种通用的承诺-证明范式。
七、小结与前沿方向
本文从密码学原语的视角审视了区块链的核心构造:哈希链提供不可篡改性;默克尔树与 MPT 支撑轻量级状态验证;ECDSA、Schnorr、BLS 各有适用场景的签名方案;Taproot 与 MuSig2 将多方签名隐藏于单签外表之下;VRF 为共识提供不可操纵的随机性,RANDAO 以承诺-揭示聚合多方熵源;承诺方案贯穿从 HTLC 到零知识证明的各个层级。
值得关注的前沿方向包括:Verkle 树将默克尔证明大小从 O(k·log n) 降至 O(k);VDF 有望消除 RANDAO 的最后揭示者偏置;基于格(Lattice)的后量子签名方案可能在未来十年内替代椭圆曲线方案;全同态加密(FHE)的效率突破将为链上隐私计算开辟新的可能性。理解这些原语的安全定义与工程取舍,是评估任何区块链系统安全边界的基础。
密码学百科系列 · 第 48 篇
同主题继续阅读
把当前热点继续串成多页阅读,而不是停在单篇消费。
【密码学百科】数字签名:ECDSA、EdDSA 与 Schnorr 签名
数字签名是公钥密码学中最重要的应用之一——本文全面对比 ECDSA、EdDSA 和 Schnorr 三大签名方案,从随机数 k 的致命重要性到确定性签名的现代最佳实践
【密码学百科】零知识证明入门:如何证明你知道而不泄露
零知识证明是密码学中最反直觉的概念之一——本文从阿里巴巴洞穴的直觉出发,建立完备性、可靠性、零知识性的形式化理解,并实现 Schnorr 身份认证与 Fiat-Shamir 变换
【密码学百科】数论进阶:二次剩余、椭圆曲线上的 Weil 配对
从二次剩余到 Weil 配对——本文深入探讨支撑现代密码学高级构造的数论工具:Legendre/Jacobi 符号、二次互反律、椭圆曲线上的配对映射及其在 IBE 和 BLS 签名中的应用
【密码学百科】承诺方案:Pedersen 承诺、向量承诺与多项式承诺
承诺方案是密码学协议的基础构件——本文从承诺的隐藏性与绑定性出发,系统讲解 Pedersen 承诺、哈希承诺、Merkle 树向量承诺、KZG 多项式承诺,以及它们在零知识证明和区块链中的核心角色