区块链概论

目录

1.概述

2.密码学原理

2.1.hash函数

2.2.签名

3.数据结构

3.1.区块结构

3.2.hash pointer

3.3.merkle tree

3.3.1.概述

3.3.2.证明数据存在

3.3.3.证明数据不存在

4.比特币的共识协议

4.1.概述

4.2.验证有效性

4.2.1.验证交易有效性

4.2.2.验证节点有效性

4.3.发行货币

5.一些实现上的便捷机制

5.1.未使用的交易输出

5.2.交易费用


1.概述

我们常听说大数据、云计算、人工智能、5G、区块链这些名词,这些“未来技术”最终目的是想使得未来社会的走向“智能化”,生产、交通、学习、城市管理、能源传输等等都将智能化,所谓智能化就是让以上场景变得更加高效。而智能化的实现则需要各方技术协作,整个支持智能化社会的技术架构将会是:

我们常听说区块链是一个去中心化的“账本”,本质上来说区块链是社会关系的智能化,核心问题是为了解决“信任”问题,传统的社会关系是由人与人之间构建起来的,依赖于人与人之间的情感和信任,往往会影响社会的效率和公正;区块链依靠机器和算法来构建社会关系,能保证公平高效。

2.密码学原理

2.1.hash函数

hash函数是把任意长度的输入通过散列算法变换成固定长度的输出,该输出就是散列值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。hash函数只是一种广义上的思想,具体的落地实现,五花八门。

hash函数优质与否的指标在于hash碰撞,x≠y,hash(x)=hash(y),称为hash碰撞,杜绝hash碰撞是几乎不可能的,因此优质的hash函数要确保低碰撞率。

hash函数的两个重要性质:

  • 防篡改

    一旦原文被改动了,hash运算出来的摘要也会改变,除非更改后的内容与原内容产生了hash碰撞,所以这时候hash函数的优质与否就起到了决定性因素。

  • 隐藏

    hash函数是单项的没办法从摘要直接还原成原文,因此hash函数能较好的隐藏原文的特点。

2.2.签名

由于区块链网络中,信息都是公开的,需要签名来防止伪造操作,比如A有十个比特币,系统中突然出现一条A把10个比特币转给了B,这么知道这是A自己发出的请求而不是别人伪造的喃?这就是签名的作用。区块链中的签名使用的是非对称加密。

3.数据结构

3.1.区块结构

每个区块由两部分组成:

  • block header(块头),包含如下内容:

    • 存放协议版本号

    • 指向前一区块的hash指针

    • 当前节点的merkle tree root hash

    • 挖矿的难度阈值target

    • 随机数nonce

  • block body(块身),包含如下内容:

    • 用merkle tree来存放所有交易记录。

区块分为两种类型:

  • 全结点,包含block header、block body的结点,真正参与存储数据的区块链的真正的结点。

  • 轻结点,只保存block header,如手机上的比特币钱包。

3.2.hash pointer

hash pointer,哈希指针,普通指针是指向地址,而哈希指针是指向哈希值。

区块链中每一个区块的block header都有一个hash pointer指向前一个区块的哈希值

区块链中每一个块的哈希值由block header运算得出,block header里包含指向前一个block的hash pointer,所以每个block的hash都是由前一个块的哈希值参与运算得出,

系统里有一个hash pointer指向最后一个区块,

这种结构能保证从系统反推到任意一个块的篡改。

 使用hash pointer时要特别注意hash碰撞造成的环路,一旦出现环路,使用hash值定位就会失效。

 

3.3.merkle tree

3.3.1.概述

区块链在落地使用时一般会分成多个分区,分区内部每个区块会记录当前分区中所有区块的数据:

 每个块内部使用merkle tree来组织存储数据。

merkle tree,梅克尔树,和普通树相比区别在于,梅克尔树用hash pointer代替了普通指针。

每个结点的hash都是由左右孩子结点的hash一同参与生成的,整颗树的根结点的hash称为root hash。

merkle树的叶节点上挂得是data block(数据)。

这种结构能保证从系统反推到任意一个结点的篡改,验证其是否合法,并且由于其是树形结构,比链表结构的hash pointer验证效率要高。

3.3.2.证明数据存在

使用手机进行转账,手机这个轻结点如何知道交易是否已经被写到区块链中了?

比如校验黄色交易是否存在,只要轻结点向全节点拿红色的那几个hash,轻结点用自己block header里面的root hash就能算出黄色的交易是否合法。

从根节点到叶节点上的某个数据块的那条路径被称为merkle proof,merkle proof存在即数据存在。

3.3.3.证明数据不存在

证明数据存在很简单,但是证明数不存在很麻烦。因为交易可能存在于叶节点的任何位置,所以要验证数据不存在只能把整棵树全部传给轻结点让它自己挨着去找。

原生merkle tree提供不了高效的证明数据不存在的方式,需要用到sorted merkle tree。

将叶节点想办法排序起来,然后将要证明的交易的hash值传拿去进行比较,找到它左右相邻的叶节点,然后沿着这两个叶节点向上找merkle proof,如果merkle proof存在交易就存在,否则交易就不存在。

比特币中因为不需要校验交易不存在,所以没有用到sorted merkle tree。

4.比特币的共识协议

4.1.概述

比特币要达成的共识是这个分布式账本里面的内容,全局需要达成共识、维护它的正确性。实现这个共识,具象化为需要解决两个核心问题:

  • 验证有效性

    • 验证交易的有效性

    • 验证节点的有效性

  • 发行货币

4.2.验证有效性

4.2.1.验证交易有效性

merkle tree的merkle proof只是用于验证数据是否存在,数据写入树就存在,不写入树就不存在,那么每笔新的交易产生的时候,如何判断这笔交易是否应该写入树喃?即验证交易的有效性。验证交易的有效性,需要验证两点:

  • 币是不是够,币都不够肯定交易是不合法的。

  • 意愿是不是真实,假如有一笔交易是A向B转账,需要验证这是不是A的真实意愿。

区块链中采用了以下结构来支持交易有效性的验证:

系统中有两种hash指针和一个签名:

  • 指向前一笔交易的hash指针,用来校验前一个区块的数据是否被篡改。

  • 指向当前交易的货币来源的hash指针,用于方便进行所交易的货币的回溯。

  • 币的来源方的签名,用于验证交易是否是币的来源方的真实意图,核实交易是不是第三方伪造的。

 

以下简单阐述一下流程:

注意为了简化结构,便于理解,上图每个区块种只有一个交易,实际区块链中每个区块会用merkle tree组织存储多笔交易。

首先是准备动作:

有一个新交易B向F转5个币,货币来源指针指向第二笔交易,另一个hash指针指向前一个交易,为了保证交易的意愿真实,采用了签名机制,区块链中的签名都是非对称加密的,所以需要每次交易由币源方告诉接收方自己的公钥,于是B告诉F自己的公钥。

接下来是验证动作:

首先验证新交易是不是B发起的,沿着货币来源指针找到第二笔交易,通过公钥先验签名。

如果签名合法,再沿着链路从尾到头逆向往第二笔交易回溯验证交易是否合法,发现在第三笔交易的时候B的5个货币就已经用完了,所以新交易不合法,不写入merkel tree中。

这里再说明一下,可以看到货币来源指针很有用,既能用于验签,又能用于确定回溯的范围,避免全局回溯,从而提升性能。

4.2.2.验证节点有效性

1.分布式共识

分布式共识,指的是区块链采用分布式架构,

2.一致性问题

因为区块链是分布式的架构,所以存在数据一致性问题。区块链中的数据一致性问题并不只是简单的先来后到顺序不一样造成的问题,merkle tree只是存储的交易记录,因为存在验证交易是否有效的机制,所以写进树里面的数据一定是合法的,在树上的位置对全局并不影响,即先来后到顺序对全局并没有什么影响。

区块链中数据的一致性问题体现在“有没有”上面,由于网络等诸多原因,可能会存在数据丢失的问题,有的节点上会有些交易并没有被存储,如果验证合法性只请求了单节点,而请求的单节点又正好丢失了这笔交易记录,就会出现误判。所以当我们验证交易合法性的时候需要多节点参与进行投票以免这种数据不一致造成的误判。

3.票权

投票在区块链中存在一个致命缺点:

女巫攻击,可以恶意伪造很多携带假交易的块出来,使得投票强行通过,这样即使树里面不存在的交易也能通过这种伪造强行被验证为存在。

由此我们发现投票权是个很重要的东西,有记账权的区块才能有票权,不能说随意新增的区块都有记账权,需要有一个标准来衡量新增的区块是否拥有记账权。在区块链中通过工作量证明来获得记账权:

  • block header中存储有一个挖矿难度阈值target,这个target由比特币协议生成,全局相同的,每个区块上存的target都相同,每当达到一定的条件后会全局重新调整这个target。

  • H(block header)≤target,则该区块能被发布。

  • 由于block header中其他值都是固定不能调整的,所以block header中存在一个随机数nonce,通过调整这个nonce不断的去算这个target。

4.最长链原则

区块链中存在这样一种攻击,如果我算出了一个合法块,那么我就可以利用这个合法块的hash和nonce不停的去造新块,使得挖矿变得很容易。为了预防这种攻击,出现了“最长链原则”。

 最长链原则,新来的合法区块只能是在扩展最长链才能被接纳入区块链中。这样的话即使有上述的攻击出现,无非以下应对:

  • 因为其他机器也在算,可能有其他机器已经算出来了,所以恶意造出来的新块不一定是在最长链上。

  • 即使最长链上,大家都这样干,也会是算力最强的机器产生的才是最长信任链,然后区块产生速度过快自动会触发调整机制,平衡比特币的收益和target的难度。

所以最长链原则保证了机器一定会根据算力得到回报。

如何确认最长链?有可能多个矿工同时挖出合法的区块。如果出现这种情况,区块链中会暂时维持这种分叉,等这几个矿工自行竞争,看谁先算出下一个合法区块,这样算力高的一定会自成一个最长链,将分叉中最长链纳入区块,其余短链丢弃掉:

 

4.3.发行货币

矿工挖到矿,发布新的合法节点,被区块链验证纳入后,根据协议矿工会获得一定数量的币,所以新区块的发布也被称为“铸币交易”,铸币交易是币的唯一来源。铸币交易的奖励通常会随着时间的推移而减少。例如,比特币每四年就会减半一次,以控制比特币的总量,直到最终达到2100万个比特币的上限。

5.一些实现上的便捷机制

5.1.未使用的交易输出

区块链中没有地方记录每个账户有多少钱,而是通过计算币源来确定某个账户有多少钱,由于币源以交易记录的方式存在每个区块的merkle tree中的,想知道某个账户有多少钱的时候,需要大面积的进行遍历,然后聚合出结果,效率不是很高,所以需要一个更优的实现机制来提升效率,这个机制就是——没花交易输出,UTXO,unspent transaction output,没有花出去的交易的输出集合,这个集合中存储了所有还没花出去的交易,想知道某个账户的余额的时候只需要遍历UTXO即可。

5.2.交易费用

交易费用,transaction fee,区块链中除了通过挖矿获得记账权而获得的记账奖励外的一种奖励机制,当用户发送交易时需要支付。这些费用支付给网络中的矿工或验证者,他们负责处理和验证交易。这种交易费用用于防止垃圾邮件交易和其他类型的网络滥用。通过要求用户支付费用才能发送交易,更难以使用大量交易淹没网络,从而减缓网络速度或导致其他问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/5036.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

YOLOv5源码逐行超详细注释与解读(6)——网络结构(1)yolo.py

前言 在上一篇中,我们简单介绍了YOLOv5的配置文件之一 yolov5s.yaml,这个文件中涉及很多参数,它们的调用会在这篇 yolo.py 和下一篇 common.py 中具体实现。 本篇我们会介绍 yolo.py,这是YOLO的特定模块,和网络构建有…

python【selenium的环境配置】

selenium 1.环境配置 1)在环境设置里面安装selenium第三方库 pip install --user selenium2) from selenium.webdriver import Chrome# 创建谷歌 b Chrome() # 获取网页 b.get(http://www.baidu.com) # 防止自动关闭 input()3)在此之前&…

Rancher系列文章-Rancher v2.6使用脚本实现导入集群

概述 最近在玩 Rancher, 先从最基本的功能玩起, 目前有几个已经搭建好的 K8S 集群, 需要批量导入, 发现官网已经有批量导入的文档了. 根据 Rancher v2.6 进行验证微调后总结经验. 1. Rancher UI 获取创建集群参数 访问Rancher_URL/v3/clusters/,单击右上角“Crea…

第07章_单行函数

第07章_单行函数 🏠个人主页:shark-Gao 🧑个人简介:大家好,我是shark-Gao,一个想要与大家共同进步的男人😉😉 🎉目前状况:23届毕业生,目前在某…

进程地址空间+环境变量

目录 环境变量 进程地址空间 理解虚拟地址空间 进程地址空间区域划分 虚拟内存和物理内存建立联系 深刻理解虚拟地址空间 环境变量 当我们需要使用一个物品的时候,首先要先找到这个物品。同样的,当要运行一个程序(指令)时&a…

大公司为什么禁止SpringBoot项目用Tomcat?

前言 在SpringBoot框架中,我们使用最多的是Tomcat,这是SpringBoot默认的容器技术,而且是内嵌式的Tomcat。同时,SpringBoot也支持Undertow容器,我们可以很方便的用Undertow替换Tomcat,而Undertow的性能和内…

低功耗技术——流水线设计(加法器和乘法器)

文章目录前言一、流水线1、16bit加法器2、无符号4bit乘法器3、编写一个4bit乘法器模块,并例化该乘法器求解c12*a5*b二、降低FPGA功耗1、静态功耗2、动态功耗前言 2023.3.31 今天学习降低功耗的一些方法 一、流水线 电路最高工作频率:取决于最长的组合逻…

Windows下的详细Git安装

网址链接: Githttps://git-scm.com/ 下载后得到这个程序: 这里它给出的是使用Vim, 我改成的是VSCode: 第一种是让 Git 自己选择,名字是 master ,但是未来也有可能会改为其他名字; 第二种是我们自行决定&a…

大文件上传时如何做到秒传?

本文已经收录到Github仓库,该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点,欢迎star~ Github地址 大家好,我是大彬~ …

Selenium基础篇之Select下拉列表选择

文章目录前言一、页面准备二、场景三、设计1.引入库2.启动浏览器实例3.访问本地演示html文件4.定位到select标签5.选择橘子🍊5.1 通过索引5.2 通过value值5.3 通过text值6.强制等待7.结束webdriver进程结果前言 大家好,我是空空star,本篇给大…

ChatGPT火出圈,80%的设计师无事可做

自从疫情过后,设计行业开始变得很凌乱。很多同行开始打价格战,设计岗位逐渐演变成了一种新型的流水线。在我国,不管什么行业,到最终都会演变成饱和状态。用金融理论来说:供不应求,就赚钱,供过于…

STM32学习(十二)

软件定时原理 使用纯软件(CPU死等)的方式实现定时(延时)功能。 不精准:函数调用压栈进栈需要耗费额外的时间;流水线使得程序执行时间不确定。CPU死等。 定时器定时原理 使用精准的时基,通过…

【大数据之Hadoop】二、Hadoop生产集群搭建之完全分布式集群

1 运行准备 (1)准备3台客户机(关闭防火墙、设置静态IP和主机名称) (2)安装JDK,配置环境变量 (3)安装Hadoop,配置环境变量 (4)配置集群 (5)单点启动 (6)配置ssh (7)群起并测试集群 2 编写集群分发脚本xsync 集群分发脚本 在/hom…

OpenGL | 渲染带透明通道的2D精灵

一、Alpha测试 Alpha 测试的基本原理为:当绘制一个片元时,首先检测其 Alpha 值,若 Alpha 值满足要求,就通过测试,绘制此片元;否则丢弃此片元,不进行绘制。 glEnable(GL_ALPHA_TEST)&#xff1b…

基于springboot实现私人健身与教练预约管理系统【源码+论文】

基于springboot实现私人健身与教练预约管理系统演示开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea M…

举一反三学python(2)—函数应用

Con_Info ["王伟(男),河南郑州, 137****8331","杨秀娟(女),陕西西安, 138****4117","刘子豪(男),河北廊坊, 136****2964","李发魁(男),河南洛阳, 139***3297","王小花(女),山西太原, 138****0042",] 要求对上述文本数据解析…

main主函数参数解析

默认的main函数参数 int main(int argc, char *argv[]) {// 主函数的代码逻辑return 0; }其中,int 是主函数的返回值类型,主函数执行完后会返回一个整数值给操作系统,通常返回值为 0 表示程序正常结束,非 0 的返回值表示程序运行…

【Spring6】资源操作:Resources

8、资源操作:Resources 8.1、Spring Resources概述 Java的标准java.net.URL类和各种URL前缀的标准处理程序无法满足所有对low-level资源的访问,比如:没有标准化的 URL 实现可用于访问需要从类路径或相对于 ServletContext 获取的资源。并且缺…

配置案例丨EtherCAT转Profinet网关连接凯福科技总线步进驱动器

西门子S7-1200/1500系列的PLC,采用PROFINET实时以太网通讯协议,需要连接带EtherCAT的通讯功能的伺服驱动器等设备,就必须进行通讯协议转换。小疆GW-PN-ECATM系列的网关提供了,快速可行的解决方案。GW-PN-ECATM支持两种实时以太网通…

关于SpringBoot项目的jar包使用命令执行无法读取到外部logback配置文件的问题解决

如题。 在SpringBoot配置了logback管理日志,application.yml配置的logback配置文件相关如下: logging:config: classpath:logback-spring.xml将项目打成jar包,在jar包同级目录下创建config文件夹,并复制了resources文件夹下的配置…