哈希与数字签名
加密货币的核心不是”加密”账本——账本全公开——而是用密码学确权:哈希函数为数据生成不可伪造的指纹,数字签名让私钥持有者唯一证明资产所有权,二者支撑起无需第三方信任的产权系统。
哈希函数
哈希函数把任意长度输入压缩为固定长度输出。密码学安全的哈希须满足:
| 性质 | 含义 | 若被破坏 |
|---|---|---|
| 确定性 | 同输入必得同输出 | 验证无从谈起 |
| 单向性(preimage resistance) | 由哈希值反推输入计算不可行 | 地址派生失效 |
| 抗碰撞性(collision resistance) | 找到两个同哈希输入计算不可行 | 默克尔树可被伪造 |
| 雪崩效应 | 输入改 1 bit,输出约半数 bit 翻转 | 结构可被预测 |
| puzzle-friendly | 无法比穷举更快找到命中目标的输入 | PoW 不成立 |
比特币全链采用 SHA-256:区块头哈希逐块串联成链,交易逐层哈希为 默克尔树,PoW 挖矿则寻找 nonce 使区块头哈希低于目标阈值——这正是 共识机制 中工作量证明的数学根基。
import hashlib
# 雪崩效应:末字符变一位,输出完全无关
h1 = hashlib.sha256(b"send 1 BTC to Alice").hexdigest()
h2 = hashlib.sha256(b"send 1 BTC to Alicf").hexdigest()
print(h1[:16], h2[:16]) # 两个前缀无任何统计关联puzzle-friendly 保证矿工无法预测哪个 nonce 有效,只能暴力尝试——算力竞争的公平性正建立在此之上。
非对称密码学:私钥与公钥
比特币使用椭圆曲线 secp256k1:
- 私钥:随机 256-bit 整数 ,取值空间约 ,穷举不可行
- 公钥:, 为曲线上固定的生成点
标量乘法容易,逆运算(椭圆曲线离散对数问题,ECDLP)计算不可行——公开 与 也推不出 。这个不对称性是全部安全性的来源。
与传统”加密通信”不同,链上转账不加密任何内容,签名解决的是授权:证明”这笔花费某笔 UTXO 的交易,确由对应私钥的持有者发起”。
数字签名:ECDSA 与 Schnorr
签名与验签
签名(私钥 、消息哈希 ):
- 取一次性随机数 (nonce),计算 ,取
- 签名即二元组
验签只需公钥 、 与 联立检验一个曲线等式,全程不接触私钥。签名绑定交易哈希,改动任何一个字节即失效——这是防双花的第一道防线,第二道是区块链原理中的全局账本确认。
ECDSA 的软肋
- nonce 复用即泄私钥:两笔交易用同一 ,由 解出 ,再代回任一签名即解出 。2010 年 Sony PS3 因 硬编码被反推私钥,2013 年 Android 钱包因弱随机数被盗
- 延展性(malleability): 与 均有效,Mt. Gox 曾以”交易被改写”为提币失败开脱
- 无原生聚合:多签只能拼接 N 个签名,链上暴露全部参与方
Schnorr 与 Taproot
2021 年 Taproot 升级(BIP-340)为比特币引入 Schnorr 签名:
| 维度 | ECDSA | Schnorr |
|---|---|---|
| 签名方程 | 与 以 非线性耦合 | ,全程线性 |
| 多签 | 暴露 N 个公钥与签名 | MuSig2 聚合后与单签不可区分 |
| 延展性 | 存在 | 签名唯一,无 |
| 批量验证 | 困难 | 线性可加,天然支持 |
线性性是关键:多方各自生成份额后可直接相加,聚合成一个合法签名——多签地址在链上与单签无异,隐私与区块空间双赢。
从公钥到地址
地址是公钥的哈希摘要,派生全程单向:
私钥 d (256 bit)
→ 公钥 Q = dG (椭圆曲线点, 512 bit)
→ SHA-256(Q) 再 RIPEMD-160 (160 bit)
→ 加版本前缀 + 校验和, Base58Check 编码 → 1 开头地址
(SegWit 改用 Bech32 编码 → bc1 开头)- 地址只暴露 160-bit 哈希:在花费之前,攻击者面对的是哈希原像难题,连公钥都拿不到
- 双哈希(SHA-256 + RIPEMD-160)来自不同算法族,单一算法被破不致全盘崩溃,20 字节也兼顾了可抄写长度
- 以太坊走另一条路:Keccak-256(未压缩公钥) 取后 20 字节,0x 开头,EIP-55 以大小写混合嵌入校验和(见 以太坊与智能合约)
漏斗方向不可逆:从地址推不出公钥(哈希单向),从公钥推不出私钥(ECDLP)。这也解释了”每次收款用新地址”的最佳实践——公钥仅在花费 UTXO 时才被迫暴露。