目录
什么是区块链?
什么是哈希函数?
特点
种类
SHA2_256
区块链如何记账?
普通账本
链接账本
区块链账本
什么是采矿?
概念
如何命中?
为什么需要哈希函数?
什么是区块链?
我们先来看定义:
区块:永久存储数据信息的载体单位
链:用金属环节连套而成的索子
区块链:一种安全共享的去中心化的数据账本
从定义中我们可以大概看出来,区块是区块链中的基本信息单位(就像原子一样),多个区块通过链连接起来,形成一个名字叫区块链的账本。
所以,我们可以这样比喻,区块链是账本,区块是账本中的一行,链是某种将多个行连接起来的方式。
那么如何将多个行连接起来方便查找和读取呢,最简单的就是给每一行顺序编号,这样每一行就通过编号连接起来成为一个账本中的一部分了。账本最重要的就是安全性,顺序编号之后某个人就不可能再插入一个新行了(电子表格除外)。
但是,如果某个人想要修改(而非删减或增加)某一行的内容,那么他只需要找到对应的行号,然后修改这一行中的部分内容,修改后行号没有变化,所以他的修改不会被人发现,这个账本就不安全了。
如果账本可以被修改,那么你的存款,贷款都可以被他人修改,后果可想而知。
所以,想要实现一种安全的账本,必须要有一种安全的链,区块链由此诞生。
什么是哈希函数?
从上面账本中的例子我们可以看到,如果想要保证账本修改后能被发现,那么我们需要:
将一行内容备份到另一个账本,跟另一个账本比对信息就能确认原账本是否被修改。
但,如何保证备份账本不被修改?给备份账本再增加一个备份账本1?这就陷入了没有止境的递归 了。
所以,我们需要一种机制——让账本的每一行信息,都包含有以前所有行的信息。
你可能立马会意识到,第二行就包含了两行信息,第一百行包含了一百行信息,最后一行包含了整个账本的信息。
那么,也出现了一个物理问题,一行能写下多行的信息吗。还出现了一个哲学问题,如果一行写下了一本书的信息,这一行还能叫一行吗,一片海还是一滴水吗?
所以,很明显,我们需要一种信息压缩机制,将以前所有的账本信息压缩到能在最新的一行中存储。
压缩种类 | 效果 | 特点 | 缺点 |
可恢复压缩 | 消息<->摘要 | 可以恢复原始信息,但摘要和信息的体积直接相关,信息越大,摘要越大 | 摘要越来越大 |
不可恢复压缩 | 消息 ->摘要 | 无法恢复原始信息,但提取了原始信息特征 | 耗时长,实现难度大 |
注:其实严格来说,这并不是一种压缩,而是一种信息特征提取
现在我们来看哈希函数:
是否能明白为什么区块链大部分选择哈希函数了。
特点
哈希函数特点很多,我按照自己方式总结几个:
特点 | 解释 |
输入长度不固定,但输出长度固定 | 即提取信息的特征 |
由输出难以逆推输入 | 由特征无法恢复信息 |
难以找到输出相同的不同输入 | 不同信息特征不同 |
输入同,输出同;输入不同,输出极大不同 | 相似信息特征不相似 |
下面是一些例子:
在线加密解密OSCHINA.NET在线工具,ostools为开发设计人员提供在线工具,提供jsbin在线 CSS、JS 调试,在线 Java API文档,在线 PHP API文档,在线 Node.js API文档,Less CSS编译器,MarkDown编译器等其他在线工具https://tool.oschina.net/encrypt?type=2
如果你在以上网站输入和图片相同的信息,你就会得到相同的输出,这就是哈希函数的一个特点——不论你用何种方式执行哈希函数,对于相同的输入总是能得到相同的输出。
种类
哈希算法种类丰富,但区块链主要用SHA2和SHA3,SHA2_256和SHA2_512只是输出的宽度不同,但原理相同。
SHA2_256
SHA家族的算法原理类似,基本流程包括:
信息分块→各块拆分→顺序压缩(加密循环)→输出结果
对于不同长度的输入信息,只是顺序压缩的执行次数不同。
有兴趣的同学可以研究图中细节,或阅读SHA256算法原理详解_随煜而安的博客-CSDN博客
区块链如何记账?
好了,现在我们知道哈希函数SHA2_256,现在如何实现难以被修改的记账?
普通账本
我们先假设存在如下表格的简单账本
信息(原始) | 备注 |
1 | 无 |
2 | 无 |
3 | 无 |
现在假设有人篡改且所有账本第二信息
信息(原始) | 备注 |
1 | 无 |
5 | 无 |
3 | 无 |
此时如果没有别的记忆,无人能发现修改
链接账本
如果我们在每一行存储前面的信息,做成一个串联的账本
信息(原始) | 备注 |
1 | 0 |
2 | 1 |
3 | 2 |
现在假设有人篡改第二行
信息(原始) | 备注 |
1 | 0 |
5 | 1 |
3 | 2 |
其他人通过检验第三行的信息就能推断出账本第二行被人修改了 。
如果需要篡改账本,且需要篡改所有账本第二+第三行的信息,虽然链接起来了,但只是相邻行的链接。如果要防止多行一起篡改,还需要分布式链接账本,但分布式账本需要每个人存一份,但如果数据在传输或记录过程中出错呢?由谁决定哪个数据是正确的呢?
区块链账本
现在我将上表的前一行信息+备注通过SHA2_256加密(可以在在线加密网站得到和我同样的结果),得到下表:
第一行备注=SHA_256(0)
其中最后一个2是第二行信息。
第二行备注=SHA_256(5feceb66ffc86f38d952786c6d696c79c2dbc239dd4e91b46729d73a27fb57e92)
其中最后一个2是第二行信息。
第三行备注=SHA_256(9bedabceae9404008ff254faed3441d4ec4379584b65399a18b0d24e23bebe213)
其中最后一个3是第三行信息。
信息(原始) | 备注 |
1 | 5feceb66ffc86f38d952786c6d696c79c2dbc239dd4e91b46729d73a27fb57e9 |
2 | 9bedabceae9404008ff254faed3441d4ec4379584b65399a18b0d24e23bebe21 |
3 | aa5522adbe0f0f7be76995152a84736addf4c4b50b09d2e384cb8c1ee8ae4eb5 |
所以区块链账本有什么区别?
第二行的哈希值包含了第一行的信息,
第二行的哈希值包含了第一行的信息+第二行信息,
第三行的哈希值包含了第二行的备注+第三行信息
所以,每一行都包含了前面所有行的信息。
现在假设有人篡改第二行
信息(原始) | 备注 |
1 | 5feceb66ffc86f38d952786c6d696c79c2dbc239dd4e91b46729d73a27fb57e9 |
5 | a12b6c77955ba11b7ee9f2502060a6261e6a0c87356178825859f4e08accfa50 |
3 | 16e947d9a2e165e2147e3b1967c373c8bb6a5d6cc88b3255cc28c369cd852699 |
那么从第二行生成的HASH值就大变样了,因为第三行中包含了前面所有行,如果这个账本有1000行,那么篡改者还需要修改另外998行,且保证所有节点的账本都被修改完成,这个任务几乎不可能完成。
这么多账本,如果传输出错了,如何确认谁对谁错呢?
记账人(矿工)将当前行(区块)打包输出哈希值并全网发布,每个节点通过哈希函数执行一次,如果哈希值相同,则验证成功,本地存储新的一行(区块)。如果矿工篡改,传输错误,则在正常节点上验证不成功,正常节点不会记录此新交易(区块)。
这就是区块链账本的不可篡改性。
什么是采矿?
概念
由于比特币是第一种区块链加密货币,我们以比特币为例,先看定义:
定义1:是一种获得比特币的方式,简单来讲就是全网矿工一起来做一道题目,谁先做出来,谁就会得到比特币奖励。
所以挖矿就是解题,具体解什么题呢,就是上面的哈希算法。
但是,哈希算法不是不可解的吗,确实如此。那么如何解题呢?你应该听说过暴力穷举吧?
挖矿就是给定一个哈希函数的输出,你不断尝试不同的输入,将其代入到哈希函数中,看看能否得到相同的输出。
注:真实挖矿为了降低难度,给定的目标输出是一个范围,矿工只需要找到范围内输出对应的输入值。
这里举个例子,挖矿就是射箭,找到一个合适的箭头(随机数),装配上箭柄( 区块信息),通过一个给定的弓(哈希函数),射箭(输出散列值),射中靶子(输出目标散列),就算挖矿成功(得到奖励)。
如何命中?
由于这把弓(哈希函数)的机制比较复杂,所以射出去的箭到处乱飞,此时如何射中靶子呢?
明白了吗,就是保证射箭过程尽可能快,射出去箭尽可能多 。
回到挖矿,既然挖矿是暴力计算哈希函数,那么高效的挖矿方式就是算的快(高频率),算的多(并行化),由于芯片频率早就已经见顶,所以并行化就是高效挖矿的唯一手段了。
所以你从下面的图看为什么显卡GPU更适合挖矿(绿色是计算单元)
为什么需要哈希函数?
我们知道挖矿,但我们并不知道加密货币需要挖矿,那么我们先看挖矿的另一种定义:
定义2:争夺记账的权利,然后获得比特币奖励。
所以,挖矿其实是争取记账的权利,为什么要争取记账的权利?
因为区块链项目是分布式的、去中心化的,没有中心节点指挥着其它节点“有序”的出块。既然没人指挥,就需要在每次出块时有一种所有节点都认可的确权机制:出块的人必须满足某个要求,并且其它节点可以验证这个满足条件。这种确权机制被称之为共识。
但是为什么需要有人打包区块,因为交易信息传播需要时间,每个人打包的信息可能不一样,但是区块链中的某个区块必须是确定唯一的,所以才需要要通过某种方式选中一个节点负责打包区块。
所以,挖矿是打包区块模拟考试,证明旷工有能力运算哈希函数执行区块打包的任务,挖矿的难度是区块链中的一种记账人选择机制。
文章来源:https://www.toymoban.com/news/detail-772760.html
以上为个人学习总结,如有错误,欢迎讨论。文章来源地址https://www.toymoban.com/news/detail-772760.html
到了这里,关于区块链加密货币详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!