比特币
不要被学术界的思维限制了头脑,不要被程序员的思维限制了想象力。
比特币中的密码学
比特币中的哈希特性
Collision resistance (抗哈希碰撞)
没有高效的方法来人为的制造哈希碰撞
- Collision resistance的定义:给定X,没有高效的方法找到Y,使得H(X) = H(Y)
- Collision resistance的特性:无法用数学证明
- MD5哈希函数:以前认为是Collision resistance,后来被鉴定为不安全的哈希函数,可通过人为的方式制造哈希碰撞
- 比特币中使用的哈希函数:SHA-256(Secure Hash Algorithm)
Hiding
哈希的过程单向不可逆
- Hiding的定义:输入值的空间够大,且分布均匀,取值可能性相同
实际场景如何实现Hiding(保证分布均匀):输入值 + 随机数(输入X || nonce随机数)后经过Hash
Puzzle friendly
事先无法知道什么样的输入能得到一个什么样的哈希值,只能一个个尝试
比如挖矿,H(nonce + block header) <= target,没有捷径,只能去尝试多个nonce来找到解 => proof of work
比特币中的账户管理
非对称加密(asymmetric encryption algorithm):加密解密不用同一个密钥,加密用公钥,解密用私钥
去中心化,每个用户本地自己生成一组公钥和私钥,公钥相当于银行账号,私钥相当于账号密码
比特币交易过程中,为了能知道交易是由谁发起,需要用私钥将交易签名,公钥验证
两个人生成的公钥私钥相同怎么办(256位的值,产生两组相同公钥私钥的概率微乎其微)
message取hash->hash取签名
比特币的数据结构
Block chain(区块链)
本质上是一个链表,通过Hash pointers相连
Hash pointers(哈希指针)
当前区块的地址
前一个哈希指针 + 当前区块计算出的哈希值
Genesis block(创始区块)
区块链中的第一个区块
Most recent block(最近使用区块)
区块链末尾的区块,指的是最近被添加到区块链的区块
Block(区块)
每一个区块构成:
Block header
只有Block header会用Hash pointer串联
- Version(用的是比特币哪个版本的协议)
- Hash of previous block header(前一个区块头的hash)
- Merkle root hash(merkle tree的根哈希,能保证Block body里的Transaction list没有被篡改)
- Target(挖矿的难度目标阈值, H(block header) <= target, block header这里存的是目标阈值的编码nbits)
- Nonce(随机数)
Block body
- Transaction list(交易列表)
Merkle tree(默克尔树)
比特币中各个区块用Hash Pointer连接在一起,各个区块包含的交易信息是组织成Merkle tree的形式
Merkle tree结构:二叉树的形式,最底层是交易记录,中间层都是下一层哈希值计算出的结果,树中的root hash可以用来判断是否有一个节点发生变更,因为任何一个节点的变更都会导致root hash发生变化
比特币节点分类
- Full node(全节点):保存区块的全部信息,Block header + Block body,用于验证每一个交易,又叫 Fully validating node
- Light node(轻节点):手机上的比特币钱包,只保存Block header(也就是只保存了Merkle tree的Root hash),无法独立验证交易的可靠性,系统中大部分节点是轻节点
如何向轻节点证明某个交易已经被写入区块链?
用户A,用户B(轻节点),转账 A –> B,A需要向B证明已经转账,如何证明:Merkle proof/Proof of menbership:证明Merkle tree包含了某个交易,时间复杂度为 O(logn)
过程详见:
全节点把缺失信息发给轻节点,轻节点通过计算验证Root Hash相同,则代表交易已被写入到区块里
全节点发送的哈希值可能被伪造吗,来保持上层的哈希值符合要求?
不行,因为哈希满足Collision resistance的特性,无法人为制造哈希碰撞
Proof of non-menbership(证明交易记录不在树里):
- 全节点发送整颗merkle tree给轻节点,轻节点验证各个节点、各层有没有出现问题,如果都没问题,证明只有这些叶子节点,则只需要判断叶子节点有没有包含该交易记录。复杂度 O(n)
- 假定叶子结点
无环的数据结构都可以用hash pointer代替普通指针
比特币的共识协议
比特币的交易过程
比特币中区块的指针
- 指向前一个区块
- 指向币的来源:证明钱不是凭空捏造,是有记录的,防止Double spending
转账:A -> B A需要知道B的公钥,B也需要知道A的公钥,
签名验证的过程?不太理解
交易记录通过A的私钥加密后 – 接收方通过A的公钥解密
如何写入区块链?
账本内容需要取得分布式的共识(distributed consensus):一致性
Cap Theorem: 只能同时满足其中两个特性
Consistency(一致性)
Availability(可用性)
Partition tolerance(分区容错性:
Paxos协议:
Consensus in Bitcoin(解决的问题:存在恶意节点,假设大多数节点好的,少部分恶意节点,如何设计一个共识协议)
- 直接投票是否可行?女巫攻击–恶意节点生成超过半数以上的账号,获取投票权