比特币

不要被学术界的思维限制了头脑,不要被程序员的思维限制了想象力。

比特币中的密码学

比特币中的哈希特性

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发生变化
image-20241105

比特币节点分类

  • 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)
过程详见:
image-20241105

全节点把缺失信息发给轻节点,轻节点通过计算验证Root Hash相同,则代表交易已被写入到区块里

全节点发送的哈希值可能被伪造吗,来保持上层的哈希值符合要求?
不行,因为哈希满足Collision resistance的特性,无法人为制造哈希碰撞

Proof of non-menbership(证明交易记录不在树里):

  • 全节点发送整颗merkle tree给轻节点,轻节点验证各个节点、各层有没有出现问题,如果都没问题,证明只有这些叶子节点,则只需要判断叶子节点有没有包含该交易记录。复杂度 O(n)
  • 假定叶子结点

无环的数据结构都可以用hash pointer代替普通指针

比特币的共识协议

比特币的交易过程
image-20241105

比特币中区块的指针

  • 指向前一个区块
  • 指向币的来源:证明钱不是凭空捏造,是有记录的,防止Double spending

转账:A -> B A需要知道B的公钥,B也需要知道A的公钥,
签名验证的过程?不太理解
交易记录通过A的私钥加密后 – 接收方通过A的公钥解密

如何写入区块链?

账本内容需要取得分布式的共识(distributed consensus):一致性
Cap Theorem: 只能同时满足其中两个特性
Consistency(一致性)
Availability(可用性)
Partition tolerance(分区容错性:

Paxos协议:

Consensus in Bitcoin(解决的问题:存在恶意节点,假设大多数节点好的,少部分恶意节点,如何设计一个共识协议)

  • 直接投票是否可行?女巫攻击–恶意节点生成超过半数以上的账号,获取投票权