区块链教程(1)——区块链原理

参考:廖雪峰的官方网站区块链教程
https://www.liaoxuefeng.com/wiki/1207298049439968

文章目录

  • 区块链教程(1)——区块链原理
    • 比特币
      • 1.1 区块链原理
      • 1.2 哈希算法
      • 1.3 哈希碰撞
      • 1.4 常用哈希算法
      • 1.5 区块链不可篡改特性
        • Merkle Hash
        • Block Hash

比特币

比特币是人类历史上第一种数字货币。数字货币是基于数学加密原理构建的不可伪造的货币系统,而比特币是第一个基于数学加密原理构建的分布式数字货币系统。比特币使用区块链技术实现了数字货币的可信支付。

电子货币本质上仍然是法币,它仍然是由央行发行,只是以计算机技术把货币以实体纸币形式的流通变成了银行计算机系统的存款。和纸币相比,电子货币具有更高的流动性。我们每天使用的网上银行、支付宝、微信支付等,都是这种方式。

而比特币作为一种数字货币,它和电子货币不同的是,比特币不需要一个类似银行的中央信任机构,就可以通过全球P2P网络进行发行和流通,这一点听上去有点不可思议,但比特币正是一种通过密码学理论建立的不可伪造的货币系统。

传统的基于银行等金融机构进行交易,本质上是通过中央数据库,确保两个交易用户的余额一增一减。这些交易高度依赖专业的开发和运维人员,以及完善的风控机制。

比特币则是通过区块链技术,把整个账本全部公开,人手一份,全网相同,因此,修改账本不会被其他人承认。比特币的区块链就是一种存储了全部账本的链式数据库,通过一系列密码学理论进行防篡改,防双花。

1.1 区块链原理

区块链是由一个一个区块构成的有序链表,每一个区块都记录了一系列交易,并且,每个区块都指向前一个区块,从而形成一个链条:

如果我们观察某一个区块,就可以看到,每个区块都有一个唯一的哈希标识,被称为区块哈希,同时,区块通过记录上一个区块的哈希来指向上一个区块:

每一个区块还有一个Merkle哈希用来确保该区块的所有交易记录无法被篡改。

区块链中的主要数据就是一系列交易,第一条交易通常是Coinbase交易,也就是矿工的挖矿奖励,后续交易都是用户的交易。

1.2 哈希算法

哈希算法,又称散列算法,它是一个单向函数,可以把任意长度的输入数据转化为固定长度的输出:
h = H ( x ) h=H(x) h=H(x)
例如,对morningbitcoin两个输入进行某种哈希运算,得到的结果是固定长度的数字:

H("morning") = c7c3169c21f1d92e9577871831d067c8
H("bitcoin") = cd5b1e4947e304476c788cd474fb579a

我们通常用十六进制表示哈希输出。因为哈希算法是一个单向函数,要设计一个安全的哈希算法,就必须满足:通过输入可以很容易地计算输出,但是,反过来,通过输出无法反推输入,只能暴力穷举。

1.3 哈希碰撞

碰撞是指,如果两个输入数据不同,却恰好计算出了相同的哈希值,那么我们说发生了碰撞。一个安全的哈希算法还需要满足另一个条件:碰撞率低。 因为输入数据长度是不固定的,所以输入数据是一个无限大的集合,而输出数据长度是固定的,所以,输出数据是一个有限的集合。把一个无限的集合中的每个元素映射到一个有限的集合,就必然存在某些不同的输入得到了相同的输出。

安全哈希算法还需要满足一个条件,就是输出无规律。输入数据任意一个bit(某个字节的某一个二进制位)的改动,会导致输出完全不同,从而让攻击者无法逐步猜测输入,只能依赖暴力穷举来破解。

假设我们相信一个安全的哈希算法,那么我们认为,如果两个输入的哈希相同,我们认为两个输入是相同的。

如果两份数据的哈希相同,则可以100%肯定,两份数据是相同的。比特币使用哈希算法来保证所有交易不可修改,就是计算并记录交易的哈希,如果交易被篡改,那么哈希验证将无法通过,说明这个区块是无效的。

1.4 常用哈希算法

比特币使用的哈希算法有两种:SHA-256RipeMD160

比特币使用两种哈希算法,一种是对数据进行两次SHA-256计算,这种算法在比特币协议中通常被称为hash256或者dhash。另一种算法是先计算SHA-256,再计算RipeMD160,这种算法在比特币协议中通常被称为hash160。

1.5 区块链不可篡改特性

Merkle Hash

在区块的头部,有一个Merkle Hash字段,它记录了本区块所有交易的Merkle Hash:

Merkle Hash是把一系列数据的哈希根据一个简单算法变成一个汇总的哈希。

假设一个区块有4个交易,我们对每个交易数据做dhash,得到4个哈希值a1a2a3a4

a1 = dhash(tx1)
a2 = dhash(tx2)
a3 = dhash(tx3)
a4 = dhash(tx4)

注意到哈希值也可以看做数据,所以可以把a1a2拼起来,a3a4拼起来,再计算出两个哈希值b1b2

最后,把b1b2这两个哈希值拼起来,计算出最终的哈希值,这个哈希就是Merkle Hash:

如果有5个交易,我们可以看到,a5被复制了一份,以便计算出b3,随后b3也被复制了一份,以便计算出c2。总之,在每一层计算中,如果有单数,就把最后一份数据复制,最后一定能计算出Merkle Hash:

从Merkle Hash的计算方法可以得出结论:修改任意一个交易哪怕一个字节,或者交换两个交易的顺序,都会导致Merkle Hash验证失败,也就会导致这个区块本身是无效的,所以,Merkle Hash记录在区块头部,它的作用就是保证交易记录永远无法修改。

Block Hash

区块本身用Block Hash——也就是区块哈希来标识。但是,一个区块自己的区块哈希并没有记录在区块头部,而是通过计算区块头部的哈希得到的:

区块头部的Prev Hash记录了上一个区块的Block Hash,这样,可以通过Prev Hash追踪到上一个区块。由于下一个区块的Prev Hash又会指向当前区块,这样,每个区块的Prev Hash都指向自己的上一个区块,这些区块串起来就形成了区块链。区块链的第一个区块(又称创世区块)并没有上一个区块,因此,它的Prev Hash被设置为00000000...000

如果一个恶意的攻击者修改了一个区块中的某个交易,那么Merkle Hash验证就不会通过。所以,他只能重新计算Merkle Hash,然后把区块头的Merkle Hash也修改了。这时,我们就会发现,这个区块本身的Block Hash就变了,所以,下一个区块指向它的链接就断掉了。

由于比特币区块的哈希必须满足一个难度值,因此,攻击者必须先重新计算这个区块的Block Hash,然后,再把后续所有区块全部重新计算并且伪造出来,才能够修改整个区块链。

修改一个区块的成本就已经非常非常高了,要修改后续所有区块,这个攻击者必须掌握全网51%以上的算力才行,所以,修改区块链的难度是非常非常大的,并且,由于正常的区块链在不断增长,同样一个区块,修改它的难度会随着时间的推移而不断增加。

区块链教程(1)——区块链原理相关推荐

  1. 区块链教程(2)——P2P交易原理

    区块链教程(2)--P2P交易原理 参考:廖雪峰的官方网站区块链教程 https://www.liaoxuefeng.com/wiki/1207298049439968 文章目录 区块链教程(2)-- ...

  2. 区块链教程、区块链指南、区块链中文手册、区块链原理

    区块链的技术有望以一个更低的成本解决更广泛的信任问题所以被受人关注. 维基说了那么长一串还是没有说清楚区块链到底是什么,又有什么用.我在一篇36Kr的文章<未来十年,Blockchain会如何互 ...

  3. 远古盗链教程及盗链HTML源码和盗链工具

    1.是怎么被盗链的? 看我做一遍. 瞎写个UserName UserID瞎写个大点的整数 这里写那个ProgID 好这个就是个盗链文件.试试. 哈哈....能盗!!! 这样后台就有"匿名&q ...

  4. php椭圆曲加密,兄弟连区块链教程区块链信息安全3椭圆曲线加解密及签名算法的技术原理一...

    区块链教程区块链信息安全3椭圆曲线加解密及签名算法的技术原理一,2018年下半年,区块链行业正逐渐褪去发展之初的浮躁.回归理性,表面上看相关人才需求与身价似乎正在回落.但事实上,正是初期泡沫的渐退,让 ...

  5. 区块链教程(二):基础概念介绍

    注:本教程为技术教程,不谈论且不涉及炒作任何数字货币 本系列重点在于以太坊基础知识.以太坊客户端以及以太坊solidity编程,因此博客重点在于以太坊核心知识点的掌握,区块链部分的基础知识可以作为补充 ...

  6. 谷歌adwords教程_区块链技术作为Google AdWords中的安全剧院

    谷歌adwords教程 Google operates the largest ad exchange in the world and recently decided to start inves ...

  7. 兄弟连区块链入门教程分享区块链POW证明代码实现demo

    区块链入门教程分享区块链POW证明代码实现demo 这里强调一下区块链的协议分层 应用层 合约层 激励机制 共识层 网络层 数据层 上 一篇主要实现了区块链的 数据层,数据层主要使用的技术 ...

  8. 区块链教程Fabric1.0源代码分析Tx(Transaction 交易)二

    4.交易相关部分工具函数(protos/utils包) putils更详细内容,参考:Fabric 1.0源代码笔记 之 putils(protos/utils工具包) 5.RWSet(读写集) RW ...

  9. 区块链教程Fabric1.0源代码gRPC(Fabric中注册的gRPC Service)一

    区块链教程Fabric1.0源代码分析gRPC(Fabric中注册的gRPC Service)一,2018年下半年,区块链行业正逐渐褪去发展之初的浮躁.回归理性,表面上看相关人才需求与身价似乎正在回落 ...

最新文章

  1. 内容协商 (Content Negotiation)
  2. oracle经典书籍推荐
  3. 2016百度之星 - 初赛(Astar Round2B)解题报告
  4. Algorithm:C++语言实现之内排序、外排序相关算法(插入排序 、锦标赛排序、归并排序)
  5. jQuery停止动画
  6. 5.exchange2013实战操作之启用POP3和IMAP4服务
  7. java 8代码 改 java7_Java 8 到 Java 14,改变了哪些你写代码的方式?
  8. 计算机的四个硬盘有什么区别是什么意思,笔记本的内存和硬盘有什么区别 原来笔记本硬盘有这几种...
  9. 学习笔记=《你不知道的JavaScript(上卷)》第三章:函数作用域和块级作用域...
  10. 菜鸟必须了解的4种后门技术知识!
  11. 计算机主机与显示器的接口类型,电脑显示器接口类型哪个好?VGA、DVI、HDMI、DP接口区别对比科普...
  12. CSP-S2022游记
  13. 沧海的孤塔-chimera
  14. 实验中应该遵循的几个原则
  15. 对你快速了解恶意软件以及病毒和反病毒
  16. hhkb适合写java吗_起底这届HHKB最强新品键盘,究竟好在哪儿?
  17. PT 系列 00·小谈 pt-kill
  18. 牛牛的算术(公式推导)
  19. 学习写微信小程序(2)
  20. 2017年11月最新Nagios4.3.4部署 邮件音频告警 自定义监控脚本

热门文章

  1. 域名如何解析到指定IP?
  2. 存储过程和存储函数 练习
  3. 调制解调器通常接在计算机系统,rj45和rj11有何区别
  4. html div 内部居中。
  5. 字符串根据字节长度进行截取并展示选中效果——js字符串获取字节长度
  6. TopLevel和Topmost
  7. 身份证里提取出生年月的方法(实用)
  8. 页面滑动与锚点的“完美交互”
  9. 企业为什么更青睐选择第三方短信平台?
  10. Redis 学习 - 05 Node.js 客户端操作 Redis、Pipeline 流水线