目录

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

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中存储的则是该结构体的首地址。哈希指针不仅要保存地址,还要保存结构体的哈希值。这样做使得我们不仅可以通过哈希指针找到数据的位置,还能检测出数据是否被篡改。

图2-1

2.区块链

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

图2-2

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

图2-3

3.Merkle Tree

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

图2-4

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

图2-5

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

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

  1. 肖臻老师区块链公开课笔记

    前段时间,区块链大火,出现了很多种基于区块链技术的政务应用.之前通过零散的网页信息和讲座,自我感觉理解了block chain原理,当看到各种区块链技术广泛应用时,自己以技术理解,反而对之不屑.当然, ...

  2. 北大肖臻老师《区块链技术与应用》系列课程学习笔记[2]Bitcoin的共识协议

    目录 一.数字货币 1.数字货币与纸质货币 2.去中心化 3.块头 4.块身 二.共识协议 1.分布式系统比较著名的不可能结论 2.比特币中的共识机制 3.比特币中的激励机制--出块奖 一.数字货币 ...

  3. 北大肖甄《区块链技术与应用》

    知识点总结二 1.Uncle block: 如上图所示,其中的叔父区块是block 7.他的叔父区块就是block 4 同一级别的block 5和block 6.最长合法连上面的区块招安叔父区块,可以 ...

  4. 《区块链技术与应用》北大肖臻老师——课程笔记【21-23】

    <区块链技术与应用>北大肖臻老师--课程笔记[21-23] 一.权益证明 二.ETH-TheDAO 提示:以下内容只是个人在学习过程中记录的笔记,图片均是肖老师课程的截图,可供参考.如有错 ...

  5. 《区块链技术与应用》北大肖臻老师——课程笔记【4-5】

    <区块链技术与应用>北大肖臻老师--课程笔记[4-5] 一.比特币协议 比特币脚本(BitCoin Script) Paxos协议 比特币 中的共识协议 (consensus in Bit ...

  6. 《区块链技术与应用》北大肖臻老师——课程笔记【6-8】

    <区块链技术与应用>北大肖臻老师--课程笔记[6-8] 一.BTC网络 二.BTC-挖矿难度 三.BTC-挖矿 提示:以下内容只是个人在学习过程中记录的笔记,图片均是肖老师课程的截图,可供 ...

  7. 《区块链技术与应用》北大肖臻老师——课程笔记【1-3】

    <区块链技术与应用>北大肖臻老师--课程笔记[1-3] 一.课程介绍 二.密码学原理 1.哈希 1.哈希碰撞(cryptographic hash function) 2.不可逆性(hid ...

  8. 《区块链技术与应用》北大肖臻老师——课程笔记【11-12】

    <区块链技术与应用>北大肖臻老师--课程笔记[11-12] 一.BTC-问答 二.BTC-匿名性 1.匿名性 2.零知识证明 提示:以下内容只是个人在学习过程中记录的笔记,图片均是肖老师课 ...

  9. 《区块链技术与应用》北大肖臻老师——课程笔记【13-18】

    <区块链技术与应用>北大肖臻老师--课程笔记[13-18] 一.BTC-思考 1.哈希指针 2.区块恋 3.分布式共识 4.比特币的稀缺性 5.量子计算 二.ETH-以太坊概述 1.以太坊 ...

最新文章

  1. 【BZOJ】1630: [Usaco2007 Demo]Ant Counting(裸dp/dp/生成函数)
  2. php curl header_PHP中的yield与协程(二十一节)
  3. web.py框架入门
  4. 2015-7-24 从新开始博客之路
  5. 取消多次重定向错误php,Laravel重定向您太​​多次错误
  6. 如何打破线下流量瓶颈?三四线城市实体门店的生存之道
  7. 如何在html中写json格式数据类型,html中如何美化展示json格式数据
  8. 好看的android动画效果
  9. 记录一个扫描二维码报错问题
  10. 土豆的31种做法,别告诉我你只知道酸辣土豆丝----小V美味馆
  11. 交替性注意力_如何培养共同注意力(Joint Attention)——社会性发展基石
  12. Python操作Excel文件:插入一列数据
  13. C#正则匹配(提取字符串中的数字)及C#“四舍五入”
  14. BIOS知识大全(转)
  15. Codeforces 1546 D. AquaMoon and Chess —— 组合数学,一点点想法
  16. 每个程序猿都应该知道的网站,数量有点多,请点收藏慢慢查看
  17. 数据库课设:java实现的本地电脑专卖店管理系统
  18. jeeplus多商户商城,分销商城
  19. Windows 系统配置 Seetaface6并跑通其中人脸识别emo程序
  20. 一种基于机载AI模块的多旋翼无人机的电力巡检报告生成方法

热门文章

  1. httpd.conf linux,linux上安装apache以及httpd.conf基本配置
  2. adwords与adsence
  3. 进阶成高级前端的四大方法
  4. 望尽天涯路--从理财角度看高可用
  5. Kafka教程(一)Kafka入门教程
  6. Deep Upsupervised Cardinality Estimation 解读(2019 VLDB)
  7. 小说网站源码开源,支持爬虫和原创双模式,小说自动采集/更新/纠错
  8. 获取手机联系人信息(姓名 电话号码)
  9. 行业分析| 视频监控——AI自动巡检
  10. 如何在局域网下建立共享文件夹?