密码学原理

hash

哈希碰撞

给定x和y,且有x!=y,但给定一个哈希函数Hash(),可以得到Hash(x)=Hash(y),则称为hash碰撞。实际应用中,哈希碰撞基本上难以避免,目前并不存在一个hash函数可以从数学上证明具有collision resistance的性质。

hiding

我们认为,给定x和Hash(),可以很容易得到Hash(x),但没有办法在已知Hash(x)和Hash()的情况下,反推出x的具体取值。

Puzzle friendly

该性质要求哈希值计算事先不可预测,仅仅根据输入很难预测出输出。例如:我们需要一个哈希值,存在于某一个范围内,只能通过不停运算查找出来。该性质保证了比特币系统中,只能通过“挖矿”获得比特币。

签名

非对称加密

假设A要给B发一条信息,A是发送者,B是接收者,窃听者C可以窃听他们之间的通讯内容。

B生成一个包含公钥和私钥的密钥对,私钥由B自行妥善保管,公钥发送给A,B的公钥被C截获也没关系。
将公钥发给A,表示B请A用这个公钥对消息进行加密并发送给他。A将密文发送给B,密文被C截获也没关系,C可能拥有B的公钥,但是B的公钥是无法进行解密的。

即:用对方的公钥加密,发给对方,用私钥解密。

比特币中账户管理

去中心化的比特币系统中,很明显不能进行“申请账户”。在比特币系统中,申请账户是用户自己来处理的,即自己创建一个公钥-私钥对。

在比特币网络中进行转账时,通过“签名”可以明确是由哪个账户转出的,从而防止不良分子对其他账户比特币的盗取。
在发布交易时,通过自己私钥签名,其他人可以根据公钥进行验证,从而保证该交易由自己发起。也就是说,只有拥有私钥,才能将该账户中的比特币转走。

数据结构

Hash pointer(哈希指针)

Hash pointer的值与节点中内容有关。当节点(区块)中内容发生改变,该哈希值也会发生改变,从而保证了区块内容不能被篡改。

Markle Tree(默克尔树)

该数据结构的优点在于:只需要记住Root Hash(根哈希值),便可以检测出对树中任何部位的修改。

实际用途

Markle Tree可以用于提供Markle Proof。关于Markle proof,需要先了解比特币系统中节点。比特币中节点分为轻节点全节点。全节点保存整个区块的所有内容,而轻节点仅仅保存区块的块头信息。

当需要向轻节点证明某条交易是否被写入区块链,便需要用到Markle proof。我们将交易到根节点这一条路径称为Markle proof,全节点将整个Markle proof发送给轻节点(如下图所示),轻节点即可根据其算出根哈希值,和自己保存的对比,从而验证该交易是否被写入区块链。只要沿着该路径,所有哈希值都正确,说明内容没有被修改过。

共识协议

去中心化需要解决的问题

  • 数字货币的发行由谁执行?如何发行?发行多少?什么时候发行?

    在比特币系统中由挖矿来决定货币发行权和发行量。

  • 如何验证交易是否有效?如何防止双花攻击?

    该问题的解决,依赖于系统中维护的一个数据结构,记录货币的使用情况(是否被花过?被谁花过?)。该数据结构由系统中全体用户共同维护,保证了交易的有效性。该数据结构,便是区块链。

双花攻击

数字货币本身为带有签名的数据文件,可以进行复制。即:对用户来说,可以将同一货币花费两次。

分布式共识

可否各个节点独立完成区块链构建?
很明显不行,各个节点独立打包交易,形成区块链,必然无法避免区块链内容不一致。从分布式系统角度来说,账本内容需要取得分布式共识,从而保证区块链内容在不同节点上的一致性。

CAP Theorem

根据FLP不可能结论,在一个异步系统中,网络时延无上限,即使只有一个成员是有问题的,也不可能达成共识。

Consistency一致性、Availability可靠性、Partition tolerance容错性,任何一个分布式系统中,最多只能满足其中两个性质(指满足表示两个之后再考虑第三个)。

比特币共识协议

背景:假设系统中存在部分节点有恶意,但存在比例较小。大多数节点为“好”的节点,在这种情况下进行共识协议设置。

投票,但并非简单的根据账户数目,而是依据计算力进行投票。

在比特币系统中,每个节点都可以自行组装一个候选区块,而后,尝试各种nonce值,这就是挖矿。[H(block header)<=target]

当某个节点找到符合要求的nonce,便获得了记账权,从而可以将区块发布到系统中。其他节点受到区块后,验证区块合法性,如果系统中绝大多数节点验证通过,则接收该区块为最新的区块并加入到区块链中。

BTC

区块

交易信息

A给B转账

  • A需要知道B的公钥,以表示收款地址
  • B要知道A的公钥(验证A的签名是否合法),A需要在交易信息中给出。

若干个交易组成默克尔树

BLOCK

  • BLOCK header 保存宏观信息,比特币版本,前一个区块的哈希指针,默克尔树的根哈希值,挖矿难度target(保证出块时间在10min),nonce,UTSO等

  • BLOCK body:交易列表。

全节点和轻节点

  • 轻节点只保留BLOCK header 信息(无法独立验证合法性)

如何记账

一致性问题

账本内容需要分布式共识,比特币中共识协议:依据计算力进行投票。

在比特币系统中,每个节点都可以自行组装一个候选区块,而后,尝试各种nonce值[H(block header)<=target],这就是挖矿。当某个节点找到符合要求的nonce,便获得了记账权,从而可以将区块发布到系统中。

每发布一个合法区块,都有一个出块奖励。

验证交易合法性后可以将它打包,并且每打包一个交易都有”交易费“。

UTSO

记录所有还没花出去的交易的输出,每个元素给出产生这个交易的hash值及它在这个交易里是第几个输出。

作用是检测新发布的交易是否合法。

每个新的交易消耗掉一些输出,同时产生新的输出。

比特币网络

设计原则:简单鲁棒,不高效。

节点收到消息后,转发给邻居节点(随机的,物理距离无关)。

每个节点维护等待写入区块链交易的集合。

总结

用户把交易发布在比特币网络上,节点收到交易后打包到区块里,把区块发布到比特币网络上。