区块链笔记
密码学 🛡️
哈希 (Hash) 🔄
密码学中的哈希函数 (Cryptographic Hash Function)
两个性质:
- 抗碰撞性 (Collision Resistance/Collision Free): 很难找到两个不同的输入,使得它们的哈希值相同。
- 单向性 (Hiding): 从哈希值反推出原始输入是不可能的。即
x -> H(x)是单向的,但H(x) !<- x是不可逆的。
比特币中的第三个性质 (Puzzle Friendly)
- 需要生成以特定数量的0开头的哈希值,这需要大量的尝试,没有捷径可走。
- 公式:
H(block header) <= target - Nonce 的查找:寻找合适的 Nonce 非常困难,但验证 Nonce 的哈希值非常简单。
数字承诺 (Digital Commitment)
- 场景:预测结果不能提前公开,但需要防止被篡改。
- 方法:将预测结果哈希后公开哈希值,结果公布后再哈希验证。
签名 📜
- 开户过程:创建一对公私钥 (public key, private key)
- 非对称加密:加密用公钥,解密用私钥。
- 交易签名:发布交易时用自己的私钥签名,其他人用公钥验证。
- 公私钥签名的一致性:理论上是不可能的,前提是使用良好的随机源(如助记词)。现实中有人因使用简单的助记词而被破解。
数据结构 🗂️
区块链 (Blockchain)
- 哈希指针 (Hash Pointers)
- 防篡改日志 (Tamper Evident Log):哈希指针是区块信息哈希后的值。
Merkle 树
- 根哈希:知道根哈希即可检测整棵树是否被修改。
- 用途:Merkle Proof
全节点与轻节点:
- 轻节点:只保存 block header。
- 验证过程:轻节点向全节点请求验证的交易,全节点返回相关哈希值,轻节点计算最终哈希并与 block header 中的哈希比较。
区块结构
- 块头 (Block Header):包含 Merkle 树的哈希值。
- 块身 (Block Body)
- 排序的 Merkle 树 (Sorted Merkle Tree)
协议 🤝
双花攻击 (Double Spending Attack)
- 转账交易必须验证,A 在发起交易时放入公钥和签名,供他人验证。
共识 (Distributed Consensus)
- CAP 理论:Consistency (一致性)、Availability (可用性)、Partition Tolerance (分区容错性)
女巫攻击 (Sybil Attack)
- 通过生成大量账户进行简单的直接投票。
- 比特币中的解决方法:用算力进行投票。
- 最长合法链 (Longest Valid Chain)
- 分叉攻击 (Fork Attack)
出块奖励 (Block Reward)
- 获取出块权的节点可以发布一个特殊的交易——Coinbase Transaction (铸币交易)。
实现 🛠️
- 基于交易的账本 (Transaction-Based Ledger):更好的隐私保护。
- 未花费交易输出 (UTXO):用于检测双花。
- 交易费 (Transaction Fee)
- 基于账户的账本 (Account-Based Ledger)
挖矿难度 ⚙️
公式:
difficulty = difficulty_1_target / targetdifficulty_1_target:挖矿难度等于 1 时的目标阈值。
调整机制:
- 目标:保持每 10 分钟出一个块。
- 计算公式:
(2016 个区块 × 10 分钟) / (60 分钟 × 24 小时) = 14 天,调整一次难度。 - 调整公式:
target = target * (actual_time / expected_time) - 限制:目标阈值
target最多增大或减少四倍。
挖矿 ⛏️
- 挖矿设备:CPU -> GPU -> ASIC (专用集成电路)
- 51% 攻击:如果某个矿池占有 51% 的算力,可以发动分叉攻击或封锁特定账户的交易。
脚本 📝
脚本形式:
- P2PK (Pay to Public Key)
- P2PKH (Pay to Public Key Hash):最常用
- P2SH (Pay to Script Hash):多重签名
- Proof of Burn (销毁币)
分叉 🌲
硬分叉 (Hard Fork)
- 所有节点必须更新软件,否则系统会分叉。
软分叉 (Soft Fork)
- 只要系统中有一半以上的节点更新软件,系统就不会分叉。
- 交易数量:1000000 字节 / (一个交易约 250 字节) = 4000 交易
- 出块速度:4000 交易 / 60 秒 * 10 分钟 = 7 tx/sec
匿名性 🕵️♂️
- 混币 (Coin Mixing)
- 同态隐藏 (Homomorphic Hiding)
- 盲签方法 (Blind Signing)