去中心化的基石
密码学是加密货币(cryptocurrency)中的“加密”(crypto)所在。它提供了安全、所有权和不可篡改性的数学保证,使去中心化网络能够在没有中央机构的情况下运行。
在本指南中,我们将探索比特币和以太坊等主流区块链使用的特定加密算法。我们将研究为什么要做出某些选择,它们与标准网络密码学有何不同,以及它们如何协同工作以保护价值数十亿美元的资产。
1. 哈希策略:比特币的双重哈希与 HASH160
从挖掘到地址生成,比特币在所有环节都使用哈希。然而,它很少使用单个 SHA-256 哈希。
双重 SHA-256 (SHA-256d)
比特币中的大多数操作,包括工作量证明(Proof of Work)和区块 ID 的构建,都使用两次 SHA-256。
- 公式:
SHA256(SHA256(数据)) - 理由:中本聪实施这一举措主要是为了防御长度扩展攻击(length extension attacks),这是当时默克尔-丹姆加德(Merkle-Damgård)结构的一个理论问题。
HASH160:空间效率
为了生成地址,比特币使用 HASH160。
- 公式:
RIPEMD160(SHA256(公钥)) - 理由:RIPEMD-160 生成 20 字节(160 位)的哈希值,比 SHA-256(32 字节)更短。这节省了 UTXO 集和区块链上的关键空间,同时保持了适用于地址识别的安全级别。
2. 以太坊的 Keccak-256:“真正”的 SHA-3
以太坊选择 Keccak-256 作为其主要的哈希函数。这经常引起混淆,因为 Keccak-256 是 NIST SHA-3 竞赛的获胜者,但它与最终的 FIPS 202 SHA-3-256 标准并不完全相同。
Keccak-256 与 NIST SHA-3-256
在标准化过程中,NIST 对 Keccak 的填充(padding)进行了微调。
- Keccak-256:使用填充
0x01。 - NIST SHA-3-256:使用填充
0x06。
由于以太坊是在 Keccak 仍处于标准化过程中构建的,它使用了原始的 Keccak-256。这意味着标准的 SHA-3-256 哈希生成器产生的结果与 Keccak-256 哈希生成器不同。对于以太坊开发人员来说,使用正确的版本对于计算函数签名和默克尔根至关重要。
3. secp256k1 曲线和 ECDSA 签名
比特币和以太坊都使用椭圆曲线数字签名算法 (ECDSA) 来签署交易,特别是使用 secp256k1 曲线。
为什么选择 secp256k1?
虽然大多数网络标准(如 TLS)使用 NIST 曲线(如 P-256),但区块链社区更喜欢 secp256k1。
- Koblitz 曲线:它是一个“Koblitz”曲线,比非 Koblitz 曲线允许更高效的计算(标量乘法)。
- 没有“后门”:有人担心 NIST 曲线可能包含隐藏的“后门”,因为它们的参数选择方式。secp256k1 的参数是以更透明、确定性的方式选择的。
当你签署一笔交易时,你使用你的私钥和 ECDSA 生成一个签名 $(r, s)$。网络使用 secp256k1 曲线和你的公钥来验证签名是否有效。
4. 默克尔树和默克尔根
默克尔树(Merkle Tree,或称哈希树)是一种用于高效总结和验证大型数据集完整性的结构。
工作原理
- 叶子节点:区块中的每笔交易都被哈希处理。
- 中间节点:哈希值成对连接并递归哈希。
- 根节点:顶部的最后一个单个哈希值就是默克尔根 (Merkle Root)。
区块头中的默克尔根
默克尔根包含在区块头中。如果即使是一笔交易中的一个位发生改变,整个默克尔树都会改变,从而产生不同的默克尔根。这允许“简单支付验证”(SPV)客户端在不下载整个区块链的情况下验证某笔交易是否属于某个区块。
一个默克尔树计算器对于验证区块头和证明交易包含至关重要。
5. 对比:哈希和签名算法
| 协议 | 主要哈希 | 签名曲线 | 地址哈希 |
|---|---|---|---|
| 比特币 | SHA-256d | secp256k1 | HASH160 |
| 以太坊 | Keccak-256 | secp256k1 | Keccak-256 (后 20 字节) |
| Solana | SHA-256 | Ed25519 | Base58 公钥 |
| Polkadot | Blake2b | Ed25519/sr25519 | SS58 |
FAQ:区块链密码学
问:Keccak-256 比 SHA-256 更安全吗?
答: 两者都被认为是密码学安全的。Keccak(海绵结构)天然抗长度扩展攻击,而 SHA-256(默克尔-丹姆加德结构)需要使用“双重哈希”技巧来实现类似的抗性。
问:为什么不所有地方都使用 Ed25519?
答: Ed25519 比 ECDSA/secp256k1 更快、更安全。然而,当比特币和以太坊创建时,Ed25519 相对较新,在硬件中的审核或支持不如 ECDSA 广泛。Solana 和 Cardano 等较新的链确实使用了 Ed25519。
问:什么是“碰撞”?
答: 碰撞发生在两个不同的输入产生相同的哈希输出时。对于 Keccak-256 或 SHA-256,以当前技术寻找碰撞在计算上是不可能的。
问:交易哈希是如何计算的?
答: 通常通过对序列化的交易数据进行哈希。在比特币中,它是 SHA256d(tx_data)。在以太坊中,它是 Keccak256(rlp_encoded_tx)。
结论
区块链密码学是精心挑选的一套算法,旨在实现高安全性、效率和透明度。从 secp256k1 的高效性到 Keccak-256 独特的海绵结构,这些原语使去中心化信任成为可能。对于在该领域工作的任何开发人员来说,理解这些基础知识不仅仅是一项学术练习,它是构建安全且兼容的去中心化应用程序的关键。