课程简介
课程基本信息
- 假设在本科阶段学过基本的数据结构和算法,掌握编程的基本技能
- 数组、链表、二叉树、哈希函数
- 参考资料
- BitCoin and Cryptocurrency Technologies: A comprehensive Introduction
- 以太坊白皮书、黄皮书、源代码
- Solidity 文档
课程大纲:比特币
- 比特币
- 密码学基础
- 比特币的数据结构
- 共识协议和系统实现
- 挖矿算法和难度调整
- 比特币脚本
- 软分叉和硬分叉
- 匿名和隐私保护
课程大纲:以太坊
- 以太坊
- 概述:基于账户的分布式账本
- 数据结构:状态树、交易树、收据树
- GHOST协议
- 挖矿:memory-hard mininig puzzle
- 挖矿难度调整
- 权益证明
- Casper the Friendly Finality Gadget (FFG)
- 智能合约
- 总结与展望
比特币中的密码学原理
1. 概述
- 比特币:被称为 “加密货币”,实际上是不加密的,转账金额是公开的。
- 密码学功能:比特币主要使用了两个密码学功能:哈希(Hash)和签名(Signature)。
2. 哈希函数
-
定义:密码学中使用的哈希函数称为 cryptographic hash function。
-
主要性质:
-
Collision Resistance:无法高效地找到两个不同的输入使其哈希值相同。
- 碰撞是客观存在的,因为输入空间远大于输出空间。
- 没有高效的方法找到两个不同的输入,使它们的哈希值相等。
-
Hiding:哈希值的计算过程是单向的,无法从哈希值反推出原始输入。
- 需要输入空间足够大,才能确保暴力求解的方法不可行。
-
Puzzle Friendly:哈希值的计算过程是不可预测的,没有捷径,只能一个一个尝试输入。
- 在比特币挖矿过程中尤为重要,作为工作量证明(Proof of Work)的基础。
-
-
常见哈希函数:SHA-256,满足上述三个性质。
3. 哈希函数的应用
-
检测信息篡改:
- 对信息求哈希值,作为信息摘要(digest)。
- 改变信息内容会导致哈希值变化,无法找到相同哈希值的不同信息。
-
实现数字信封(Digital Envelope) :
- 预测结果公开问题:预测结果不能提前公开,但需要验证其准确性。
- 哈希值应用:将预测结果作为输入计算哈希值并公开哈希值。第二天公布预测结果,利用 collision resistance 和 hiding 性质验证其真实性。
4. 签名
-
定义:通过公钥和私钥对对消息进行签名和验证。
-
非对称加密体系:公钥加密,私钥解密。
- 生成账户:生成一对公钥和私钥,公钥公开,相当于银行账号;私钥保密,相当于账户密码。
- 签名验证:私钥签名,公钥验证签名。
5. 比特币系统中的账户管理
-
去中心化:无需任何人批准,本地生成公钥和私钥对即代表一个账户。
-
交易验证:
- 交易签名:发布交易时用私钥签名。
- 签名验证:其他人用公钥验证签名的正确性。
6. 随机源的重要性
- 随机源质量:生成公私钥和每次签名时都需使用高质量的随机源。
- 攻击风险:如果随机源不够好,可能出现相同的公私钥对,增加被攻击的风险。
7. 哈希和签名的结合
-
操作流程:
- 先对消息进行哈希处理。
- 再对哈希值进行签名,确保消息完整性和真实性。
比特币中的数据结构
哈希指针
- 概念: 哈希指针不仅存储某个结构体在内存中的地址,还保存这个结构体的哈希值。
- 好处:
- 定位结构体的位置
- 检测结构体内容是否被篡改
- 链表实现: 用哈希指针代替普通指针,每个区块包含前一区块的哈希值和数据。
- 创世纪块 (Genesis block): 系统中产生的第一个区块。
- 最后区块: 最近产生的区块。
哈希指针 = 前一区块的哈希值 + 当前区块的数据
哈希指针的优点
- 篡改检测: 任何一个区块内容被改动,所有后续区块的哈希值都会变化,从而使得保存的最后哈希值也发生变化。
- 安全性: 保留最后的哈希值可以检测到整个链表中任何位置的改动。
Merkle树
- 结构:
- 叶节点: 数据块的哈希值。
- 内部节点: 两个子节点的哈希值拼接再取哈希值。
根哈希值 = 叶节点1的哈希值 + 叶节点2的哈希值
- 优点:
- 只需记住根哈希值,就能检测出对树中任何部位的修改。
比特币中的区块
- 区块头 (Block header):
- 包含根哈希值,不包含具体交易信息。
- 区块体 (Block body):
- 包含交易的具体列表。
Merkle Proof
- 概念: 验证某个交易是否在区块中的证明。
- 过程:
- 通过传递交易至根节点的路径上的哈希值,清节点可以验证交易是否包含在区块中。
验证步骤:
1. 清节点收到Merkle Proof。
2. 验证路径上每个节点的哈希值。
3. 对比根哈希值和区块头中的根哈希值。
证明交易不存在
- 无序叶节点: 没有高效的方法证明不存在。
- 有序叶节点: 按照哈希值排序后,可以提供证明。
证明步骤:
1. 找到应在的叶节点位置。
2. 验证相邻两个节点到根节点的路径。
哈希指针的应用
- 无环数据结构: 只要数据结构无环,都可以用哈希指针代替普通指针。
- 有环数据结构: 会出现循环依赖问题,无法使用哈希指针。
总结
- 哈希指针和Merkle树是比特币中最基本的数据结构,保证了区块链的安全性和篡改检测能力。
- Merkle Proof提供了验证交易包含性的方法,支持全节点和轻节点之间的数据验证。