北大肖臻老师《区块链技术与应用》系列课程学习笔记[1]Bitcoin中用到的密码学原理和数据结构

目录

一、比特币系统中用到的密码学原理

1.什么是比特币

2.哈希函数

3.非对称密码体系

4.数字签名

二、比特币中的数据结构——哈希指针和Merkle Tree

1.哈希指针

 2.区块链

 3.Merkle Tree

一、比特币系统中用到的密码学原理

1.什么是比特币

        比特币(Crypto-currency)是一种加密货币,但是其所有的交易过程(包括账户的地址、转账的金额等信息)都是公开的。比特币中主要用到密码学中的两个功能——哈希函数数字签名

2.哈希函数

        密码学中用到的哈希函数(Cryptographic Hash Function)需要具备抗碰撞性(Collision Resistance)、单向性(Hiding),除此之外,比特币中的哈希函数还需要满足不可预测性(Puzzle Friendly)。比特币中用的哈希函数是SHA-256,SHA为Secure Hash Algorithm的简称,它是同时满足上述三种性质的哈希函数。

(1)抗碰撞性

        当 x ≠ y 时,有 H(x) = H(y),这种情况称为哈希碰撞。一般情况下哈希碰撞是不可避免的,哈希函数具有抗碰撞性并不代表不会发生哈希碰撞,而是通过人为因素制造哈希碰撞的难度比较大。也就是说对于一个给定的x,没有什么高效的方法(不包括蛮力法Brute-force)能找到一个y,满足:H(y)  = H(x)。因此,抗碰撞性的优点主要被用于对保密消息Message是否被篡改的检测中。哈希函数的抗碰撞性是无法用数学方式证明的。

(2)单向性

        当给定x时,可以通过计算得到哈希值H(x),但是无法简单通过哈希值H(x)得到x,这个性质被称为x的单向性。哈希函数的单向性常常与哈希函数的碰撞性共同实现数字委托书(Digital Commitment 或 Digital Equipment and Sealed Envelop)。

(3)不可预测性

         所谓不可预测性,就是指我们单看哈希函数的输入x,很难推测出哈希值H(x)想要计算出的哈希值落在某个范围内,没有比较好的办法去构造输入,只能通过蛮力法一个个试。比特币挖矿的过程实则是寻找一个随机数nonce,使得这个nonce和区块的块头里其它信息合并在一起,作为输入,取得哈希值,所得哈希值小于等于某个指定的阈值即为合法。正因不可预测性,使得区块链挖比特币没有捷径,只能不断寻找随机数nonce,所以才能用来做工作量证明(Proof of Work)。虽然寻找随机数的过程艰难,但是,验证随机数是否合法确是非常容易的。

3.非对称密码体系

        非对称密码体系(Asymmetric Encryption Algorithm)不再像对称加密那样使用一个密钥,而是使用一对密钥,即公钥和私钥,加密用的是公钥,解密用的是私钥,私钥由接收方自己保存,这样就解决了对称密码体系的密钥配送问题。

4.数字签名

        加密货币是不加密的,非对称加密的公钥和私钥在比特币系统中就是用来做签名的。即:在本地创建账户的时候需要生成一队由公钥和私钥组成的密钥对,将公钥公布出去,私钥保存下来。当其他用户签名的时候,用的是他自己的私钥,接收方验证签名的时候,用的则是他的公钥

二、比特币中的数据结构——哈希指针和Merkle Tree

1.哈希指针

        普通指针一般用于存储的是某个数据在内存中的首地址,如下图2-1所示指针p中存储的则是该结构体的首地址。哈希指针不仅要保存地址,还要保存结构体的哈希值。这样做使得我们不仅可以通过哈希指针找到数据的位置,还能检测出数据是否被篡改。

北大肖臻老师《区块链技术与应用》系列课程学习笔记[1]Bitcoin中用到的密码学原理和数据结构_第1张图片 图2-1

 2.区块链

         区块链就是由一个一个区块(Block)组成的链表,他与其他链表的其中一个区别就是,区块链用哈希指针代替普通指针,如下图2-2所示。哈希指针中存储的哈希值就是由上一个区块的所有内容,一起放入哈希函数计算所得到的哈希值。

北大肖臻老师《区块链技术与应用》系列课程学习笔记[1]Bitcoin中用到的密码学原理和数据结构_第2张图片 图2-2

        使用这种数据结构可以实现Tamper-evident Log。这个性质是说,不论是在哪个区块做了改动,前一个区块发生了改变,后面的区块会连带发生变化,都会导致系统中保存的哈希值的变化,如图2-3所示,也就是说最近产生的区块的哈希值没有发生改变则说明区块链中的内容未发生改变。

北大肖臻老师《区块链技术与应用》系列课程学习笔记[1]Bitcoin中用到的密码学原理和数据结构_第3张图片 图2-3

 3.Merkle Tree

        Merkle Tree用哈希指针代替了普通二叉树中的普通指针,最底下的一层叶子结点是数据块,上方若干非叶子结点都存储的是哈希指针,如图2-4所示。在Merkle Tree中,只要记录下根哈希值,就能检测出对树中任何部位的修改,也就是用根哈希值保护了整棵树上没有篡改。相比前面的区块链这个效率更高。

北大肖臻老师《区块链技术与应用》系列课程学习笔记[1]Bitcoin中用到的密码学原理和数据结构_第4张图片 图2-4

        在区块链中,每个区块分为两部分,块头(Block Header)和块身(Block Body)。在块头中存储的是这个区块所包含的所有交易组成的Merkle Tree的根哈希值。块身中存储的是交易列表和交易内容。比特币中的节点分为两类:全节点和轻节点全节点指的是既有块头又有块身的区块,保存了交易的具体信息。轻节点是指只保存了块头,没有保存块身。例如手机上的比特币钱包就使用的是轻节点。已知一个轻节点,证明某个交易是否存在于该区块上的方式如下图2-5所示,这种证明称为Proof of Membership或者Proof of inclusion。

北大肖臻老师《区块链技术与应用》系列课程学习笔记[1]Bitcoin中用到的密码学原理和数据结构_第5张图片 图2-5

        假设有n个交易(叶子结点),Merkle proof 验证Merkle Tree中某个交易存在,Merkle proof的时间复杂度是O(logn)。若要验证Merkle Tree中某个交易不存在,使用Sorted Merkle Tree,排好序以后二分查找,当查找到这个交易时,要对其做Merkle Proof,如果没有查找到这个交易,要对比它哈希值小和比它哈希值大的(即哈希值排序后的邻居)节点进行Merkle proof。比特币中不需要证明某个交易不存在,所以不需要上面的Sorted Merkle Tree。只要数据结构是无环的,都可以用哈希指针代替普通指针。有环的会以引起所保存的哈希值的循环依赖。

你可能感兴趣的:(区块链,区块链,学习,密码学)