区块链概论

news2024/10/5 21:13:47

目录

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(数据)。

merkle tree是从data block开始,两两配对生成一个节点,然后节点之间再两两配对生成一个父节点,然后父节点之间再两两配对生成一个节点.....以此类推最后生成一个根节点,根节点的左右hash最后生成root hash:

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

如果merkle tree要新增、删除、修改data block里的data,如果这个操作是被同意的,那么会引起整颗树的hash的变化,下次再去校验的时候,这个操作能通过。

如果这个操作不是被同意的,而是悄悄咪咪做的,那么去校验的时候由于整棵树的hash并没有变化,被篡改的data验证一定通过不了。

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.分布式共识

分布式共识,分布式系统中由于一些意外,集群中各个节点间一定会存在数据一致性问题,区块链采用的分布式架构,自然也存在这个问题,如何保证数据一致性,让全局对数据结果达成一致性认识,这是需要解决的一个问题。

merkle tree只是存储的交易记录,因为存在验证交易是否有效的机制,写进树里面的数据一定是合法的,但是由于网络等诸多原因,可能会存在数据丢失的问题,有的节点上会有些交易并没有被存储,如果验证合法性只询问了一个区块,而询问的区块又正好丢失了这笔交易记录,就会出现误判。或者说这个被询问的区块正好就是个恶意区块,它里面的交易是伪造的,也会造成无中生有的判断结果。所以在区块链中当我们验证交易合法性的时候需要多节点参与进行投票以免这种数据不一致造成的误判。

2.票权

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

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

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

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

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

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

3.最长链原则

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

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

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

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

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

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

4.3.发行货币

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

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

5.1.未使用的交易输出

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

5.2.交易费用

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

~~~~~不得不会的账号与权限管理小知识

目录一.用户账号和组账号概述二. useradd添加用户账号三. passwd 修改密码四. 修改用户账户的属性五 . userdel 删除用户账号六. 用户账号的初始配置文件七. 组账号文件八 . 文件/目录的权限及归属8.1设置文件和目录的权限chmod8.2 设置文件和目录的归属chown命令8.3 补充扩展:…

JAVA本地监听与远程端口扫描的设计与开发

随着Internet的不断发展,信息技术已成为社会进步的巨大推动力。不管是存储于服务器里还是流通于Internet上的信息都已成为一个关系事业成败的关键,这就使保证信息的安全变得格外重要。本地监听与远程端口扫描程序就是在基于Internet的端口扫描的基础上&a…

Optional类快速上手

目录 一、概述 二、使用 1、创建对象 2、安全消费值 3、安全获取值 4、过滤 5、判断 6、数据转换 一、概述 我们在编码的时出现最多的就是空指针异常,所以在很多情况下我们需要做各种非空的判断。 尤其是对象中的属性还是一个对象的情况下,这种…

Doris(3):创建用户与创建数据库并赋予权限

Doris 采用 MySQL 协议进行通信,用户可通过 MySQL client 或者 MySQL JDBC连接到 Doris 集群。选择 MySQL client 版本时建议采用5.1 之后的版本,因为 5.1 之前不能支持长度超过 16 个字符的用户名。 1 创建用户 Root 用户登录与密码修改 Doris 内置 ro…

从C出发 19 --- 函数定义细节剖析

因为编译器是自上而下执行代码的,当编译到 paw2 的时候不知道是什么东西,看起来像一个函数但是前面的代码没有发现它,这个时候编译器就会报错 为了防止编译器报错 应该在调用前先声明 ,注意声明的三要素 声明的作用: 让编译器先…

# 切削加工形貌的相关论文阅读【1】-球头铣刀铣削球面的表面形貌建模与仿真研究

切削加工形貌论文【1】-球头铣刀铣削球面的表面形貌建模与仿真研究1. 论文【2】-球头铣刀加工表面形貌建模与仿真1.1 切削加工形貌仿真-考虑的切削参数1.2 其他试验条件1.3 主要研究目的1.4 试验与分析结果1.5 面粗糙度的评价指标2. 论文【1】-球头铣刀加工球面(曲面…

Flutter Row 实例 —— 新手礼包

大家好,我是 17。 本文在 3.31 日全站综合热榜第一。 新手礼包一共 3 篇文章,每篇都是描述尽量详细,实例讲解,包会! Flutter Row 实例 —— 新手礼包Flutter TextField UI 实例 —— 新手礼包Flutter TextField 交…

CDN如何成为大站标配?

在当下的互联网应用中充斥了大量的静态内容,这些静态和准动态内容在访问请求中占据了大量的网络资源,如果这些请求全部指向源站服务器,很容易导致网络的拥塞甚至是服务器的宕机,对正常的业务开展造成严重影响。为了解决这种情况&a…

共享电子邮件的运作方式

通过电子邮件共享,您可以使用评论轻松管理围绕电子邮件展开的讨论,而无需多次转发和回复。这提供了一种轻松的方式,让您可以通过电子邮件与同事分享信息,并获得他们对此的意见/反馈/建议。 电子邮件共享的运作方式 您收到或发送的…

开源流媒体服务器ZLMediaKit在Windows上运行、配置、按需拉流拉取摄像头rtsp视频流)并使用http-flv网页播放

场景 目前市面上有很多开源的流媒体服务器解决方案,常见的有SRS、EasyDarwin、ZLMediaKit和Monibuca等。 1、SRS GitHub - ossrs/srs: SRS is a simple, high efficiency and realtime video server, supports RTMP, WebRTC, HLS, HTTP-FLV, SRT, MPEG-DASH and …

【linux】 安装 java 环境

目录1.检查linux 下是否安装java(jdk)环境2.查看 linux 的操作系统版本3.下载jdk4.新建java文件夹用于安装jdk5.将下载到本地的jdk压缩包上传到linux服务器6.配置环境变量1.检查linux 下是否安装java(jdk)环境 可通过下面五条命令来查看linux 系统是否安装了java 环境 1、java …

$ZZZ 以 Launchpad 形式多平台首发,GoSleep 成 Sleep to Earn 叙事成 X2E 新宠

“ GoSleep 的治理代币 $ZZZ 将以 Launchpad 形式登录 Bitget、Gate.io以及MXC,这或许预示着 Sleep to Earn 叙事或成 X2E 新宠” “Sleep to Earn” 成为 X2E 市场新发力点 StepN 在去年为 X2E 赛道做了一个很好的示范,这也让这个领域不再仅仅局限于基于…

HarmonyOS/OpenHarmony应用开发-Stage模型ArkTS语言Ability基类

Ability模块提供对Ability生命周期、上下文环境等调用管理的能力,包括Ability创建、销毁、转储客户端信息等。 说明: 模块首批接口从API version 9 开始支持。模块接口仅可在Stage模型下使用。 导入模块: import Ability from ohos.app.ability.Ability; 接口说明…

虚拟化技术:实现资源高效利用和灵活管理的利器

虚拟化技术是一种通过软件或硬件手段,将物理资源抽象化,从而创建虚拟资源的技术。这种技术可以应用于计算、存储、网络等领域,通过将物理资源划分为多个虚拟资源,使得多个应用程序或用户可以共享同一组物理资源,从而提…

面试官:说说Java、Spring、Dubbo三者SPI机制的原理和区别

今天来跟大家聊一聊Java、Spring、Dubbo三者SPI机制的原理和区别。 其实我之前写过一篇类似的文章,但是这篇文章主要是剖析dubbo的SPI机制的源码,中间只是简单地介绍了一下Java、Spring的SPI机制,并没有进行深入,所以本篇就来深入…

数据结构2:顺序表和链表

目录 1.线性表 2.顺序表 2.1概念及结构 2.2接口实现 2.3数据相关面试题 2.4顺序表的问题及思考 3.链表 3.1链表的概念及结构 3.2链表的分类 3.3链表的实现 3.4链表面试题 3.5双向链表的实现 4.顺序表和链表的区别 1.线性表 线性表(linear list&#x…

Qt QImage scaled方法缩放中的问题

最近在某些测试中发现,QImage 先按照一定的比例进行缩放,在对QImage对象进行绘制等操作后,使用以下的方式将其恢复到其原来的尺寸。 图像的缩放是这样的: void ImageBaseWidget::zoomImage(QMouseEvent *event) {if (event->…

传输层协议——TCP协议

传输层协议——TCP协议认识IP地址TCP/IP的分层管理TCP/IP分层通信示例(发送数据包)认识IP地址 IP地址属于网络层地址 在计算机通信中,为了识别通信对端,必须有一个类似于地址的识别码进行标识。IP地址用于在连接到网络中的所有主…

利用seaborn、statannotations库绘制显著性标注

如何使用Python-SeabornSeaborn进行显著性统计图表绘制,详细内容如下: Python-Seaborn自定义函数绘制Python-statannotations库添加显著性标注 1、Python-Seaborn 自定义函数绘制 import matplotlib.pylab as plt import numpy as np import seaborn as…

Spring Cloud组件源码之LoadBalancer源码分析

" Spring 到底是春天的来临万物复苏,还是春转夏的干燥又炎热呢?" Spring的来临让JavaEE走向了另一个高度。便捷的开发,完美的生态。物极必反,学习Spring的成本越来越低,导致Java程序员越来越密集&#xff0…