建议收藏,轻松搞懂区块链

news2025/1/13 7:25:01

未来已来,只是不均衡地分布在当下

大家好,我是菜农,欢迎来到我的频道。

本文共 5844字,预计阅读 30 分钟

区块链是近些年来最热门的前沿技术,被认为是未来十几年对金融、物联网、医疗等诸多领域产生最大影响的"黑科技"之一。

在本篇中我们将掌握区块链的基本概念技术构成逻辑结构

一、基本概念

“区块链” 这个概念是由一个网名为中本聪的人在2008年发表的《比特币:一种点对点的电子现金系统》中提出的。随后他实现了一个比特币系统,并发布了加密数字货币—比特币。接下来出现了以太坊和超级账本这样的大型区块链项目。

那么在你的认知中,区块链是什么样的?下面整理了几种选项,看下是否有符合你认知的选项。

  1. 区块链是比特币,比特币就是区块链
  2. 区块链很值钱
  3. 区块链可以运用在任何领域
  4. 区块链是免费的
  5. 区块链是非常安全的

通常来说,选项1是大多倾向的结果。但比特币和区块链两者不能等同,实际上,区块链是比特币的底层技术,如果要举例比喻的话,就好比用面粉可以做包子,但不能说面粉等于包子,包子等于面粉。而这里的面粉就相当于是包子。当然了作为底层技术的存在,不仅仅应用于比特币的实现中,还有很多其他基于区块链技术的应用。

那么区块链究竟是什么?从比较专业的维度上看,可以从以下三点来解释

  1. 区块链是底层技术

作为一个底层技术,它是包含了 P2P动态组网基于密码学的共享账本共识机制智能合约 等关键技术

  1. 区块链是一个数字货币和账本系统

从货币学的角度看,区块链是数字货币系统的分布式共享账本系统,这是一个去中心化的、网内用户共同维护的账本系统。

  1. 区块链是互联网的基础设施

它提供了分布式去中心化的价值互联网,为更多大规模的共享、协作应用创造可能。

作为解释依据,这里提取了来自中本聪在2008年发表的《比特币:一种点对点的电子现金系统》中的一段描述:

时间戳服务器对以区块(Block)形式存在的一组数据是实施随机散列并加上时间戳,然后将该随机散列进行广播,就像在新闻后世界性新闻组网络(Usenet)的发帖一样。显然,该时间戳能够证实特定数据于某特定时间是的确存在的,因为只有在该时刻存在了才能获取相应的随机散列值。每个时间戳应当将前一个时间戳纳入其随机散列值中,每一个随后的时间戳都对之前的一个时间戳进行增强(Reinforcing),这样就形成了一个(Chain),即区块链,如下图所示:

文字较为苍白,我们看图可以很清晰的看出 区块链就是由 区块 构成的

1)区块

区块是区块链的组成单元,就像金字塔是由一块块石头组成的一样,区块链就是一个个区块组成的。

区块是由一系列特征值和一段时间内的交易记录组成的一个数据结构。区块的数据结构是由 区块头区块体 组成。其中区块头包含了当前区块的特征值,区块体中包含的是实际的交易记录数据。

1、数据结构

1️⃣ 区块头

区块头是由 80 个字节组成,主要由版本号、前一个区块的哈希值、Merkle根、时间戳、bits、Nonce 这几项区块的特征值组成。

  • ver: 版本号,表示本区块遵守的验证规则
  • prev_block: 父区块哈希值,指的是这个区块连接的上一个区块的哈希值
  • mrkl_root: mrkl_root 根,是该区块链交易的 Merkle 树根的哈希值(Merkle 是一种哈希树的数据结构)
  • time: 时间戳,区块生成的时间
  • bits: 区块的难度值,该区块工作量证明算法的难度目标,使用特定的算法编码
  • Nonce: 是一个随机数,为了找到满足难度目标所设定的
2️⃣ 区块体

区块体主要包括了 交易数量(n_tx)、区块大小(size)和长度不定的交易记录(tx 字段包含的交易列表) 等信息。但这只是比特币中的区块体结构,实际上区块体重可以包括任何内容,比如以太坊的区块体中除了交易数据还包含智能合约。

2)区块特点

区块是由计算机通过加密算法生成的。如果成功地生成一个有效的区块,该计算机(节点)就能获得一定的奖励,这个奖励就是加密数字货币,也就是所谓的 挖矿

加密算法并不是容易生成结果的,而是该区块的哈希值必须满足一定的条件。这个条件就是能够使得区块头中特征值相加生成的哈希值需要符合一定格式,比如难度值为 000,由于哈希值随着输入的不同而不同,因此计算机要不断尝试改变区块头的 Nonce 值直至最终生成的哈希值满足条件才算生成了一个有效的区块。

我们可以借助 Blockchain Demo 工具来尝试生成一个区块。

从图中可以看出在 HASH 一栏中的数据是红色的,说明该哈希值是无效的。因为未满足 000 开头的数据。那么我们需要再次计算后查看结果

可以看出这次的结果为绿色,是有效的,因为该数据满足 000 开头。我们将上面的区块结果进行解读,可以分为以下几部分:

  • 索引: 表示区块在区块链中的位置,其中第一个区块为 创世区块(索引为 0) ,第二个区块的索引为1,第三个区块的索引为2,以此类推。
  • 时间戳: 表示该区块的生成时间,根据时间戳可以判断区块链中各个区块生成的先后顺序。
  • 哈希值: 表示每个区块的唯一标识,也可称为区块的 数字指纹。哈希值的长度是固定的,而且和区块的内容紧密关联,一旦区块内容发生改变,该区块的哈希值也会发生改变。而且,区块中的哈希值还有 有效无效 之分,满足特定条件的哈希值是有效的,否则就是无效的。这个特定条件一般称称为 困难度(Difficulty)。父区块哈希值就是区块中特定区块前一个区块的哈希值。
  • **数据:**区块中的数据可以是任何内容,比特币区块链的区块中的数据为一串串交易记录。
  • Nonce: 是一个随机数,用来生成一个有效的哈希值。Nonce 会根据区块数据的不同而不同,每个区块都需要经过大量计算才能找到对应的 Nonce 值。
  • 创世区块: 区块链中的第一个区块,它没有父区块,故创世区块的父区块哈希值为空或者为 0。

2)运行原理

综上所述,区块链就是一个链表,而这个链表就是由一个个区块组成的,这些区块依次连接,形成一个不可篡改的链条,那么其中的运行过程我们也可以由此推出:

  1. 首先构成区块链的去中心化网络中的第一个节点,生成一个 创世区块
  2. 然后通过 挖矿 生成新的区块添加到区块链中
  3. 新的节点加入到去中心化网络中会先生成一个最新的区块链数据
  4. 随后每个节点生成的区块都会向网络中的其他节点进行广播
  5. 其他节点收到广播后会判断自己是否已经收到该区块,是的话就忽略,否的话会先校验该区块是否有效,如果是有效的区块则会添加到自己的区块链中

3)小结

  1. 区块链中的节点始终都讲最长的链条作为正确的链,并持续延长和维护这条链。当节点发现有更长的链条并且本身的链条不是最新时,就会使用最长的链条提花你当前节点的链条。若一个节点判断出本身的区块链是最新的,再收到新的区块信息时,节点就会把新的区块添加到自身链条的最后。
  2. 当一个区块链的节点掌握了整个区块链中 51% 以上的计算能力时,它就可以重写整个区块链。基于这个原因,区块链中的计算能力过度集中会很危险。只有一个庞大且均匀分布的区块链才比较安全。

二、技术构成

区块链主要由三个核心技术构成,分别是 共识机制、智能合约、去中心化网络

1)共识机制

共识机制是区块链中的重要机制,不同的区块链项目可能使用不同的共识机制。网络中的各个节点根据共识机制达成共识,共同维护整个区块链网络。

1、PoW 机制

工作量证明机制(Proof of Work,PoW),工作量证明就是一份证明,它用来确定完成了一定量的工作并可以因此获得一定的奖励。

工作量证明是一种对应服务与资源滥用,或是阻断服务供给的对策。一般要求发起者进行一些耗时的复杂运算,并且结果能被快速验算。在计算过程中耗用的时间和资源作为成本,据此来确定建立或惩罚,以此来维护系统的一致性。

工作量证明机制最常用的技术原理是哈希函数,工作量证明机制如下:

  1. 取得一些公开的数据,并加上一个随机数(Nonce)
  2. 以数据和随机数作为输入值计算哈希值
  3. 检查生成的哈希值是否符合一定的条件。若符合就几下这个随机数的值并退出。若不符合则改变随机数的值再重新计算。

由于工作量证明机制需要消耗巨大的算力,如果有人尝试恶意破坏,需要付出巨大的经济成本,这就防止了恶意的数据修改。

缺点: 只有第一个获取有效哈希值的节点能得到奖励,其他节点的计算会被浪费掉。

2、PoS机制

权益证明机制(Proof of Stake,PoS)试图解决在 PoW 机制中大量资源被浪费的问题。不同于 PoW 机制要求进行一定量的计算,PoS 机制要求提供的是保证金,或者说是一定数量数字货币的拥有权。

PoS 机制的工作原理是通过保证金来确认一个合法的块成为新的区块,收益为保证金的利息和交易服务费。提供证明的保证金越多,则获得记账权的概率越大。

比如系统中有A、B、C、D4个人,A有40个币,B有30个币,C有20个币,D有10个币,那么A获得记账权的概率就是D的4倍

PoS 机制的好处是在一定程度上缩短了共识达成的时间,不再需要大量消耗能源挖矿,其与 PoW 机制的区别如下:

3、DPoS 机制

股份授权证明机制(Delegated Proof of Stake,DPoS),与 PoS 机制基本原理相同,只是选举了若干代理人,由代理人执行验证和记账功能,工作原理如下:

在 DPoS 机制下,每个节点按其持币比例拥有影响力,51%节点投票的结果将是不可逆切有约束力的。其过程为:

每个节点可以将其投票权授予一名代表,获票数最多的前 100 位代表按既定时间表轮流产生区块。每名代表分配到一个时间段来生产区块。所有的代表将收到等同于一个平均水平的区块所含交易费的 10% 作为报酬。如果一个平均水平的区块含有 100 股作为交易费,每个节点将获得 1 股作为报酬

DPoS 的好处是大幅缩小了参与验证和记账节点的数量,可以达到秒级的共识验证

4、DAG 机制

有向无环图(Direct Acyclic Graph,DAG),DAG 是一个没有有向循环的、有限的有向图。它由有限个顶点和有向边组成,每条有向边都从一个顶点指向另一个顶点;从任意一个顶点出发都不能通过这些有向边回到原来的顶点

传统的区块链只有一条单链,而在一条单链上无法并发打包区块。而DAG 是一种拓扑结构,在区块打包时间不变的情况下,可以并行打包N个区块,那么区块链的交易容纳能力就可以变成原来单链情况下的N倍。

2)智能合约

智能合约不是区块链的必要组成,它是区块链 2.0 之后出现的技术。如果把区块链比作一个公司,智能合约相当于公司中的规章制度,员工工作的时候会依据规章制度形式,而在有智能合约的区块链中,链上的节点会依据智能合约进行工作。

智能合约不只是一个可以自动执行的计算机程度,它还是一个基于区块链的参与者。它对接收到的信息进行回应,它可以接收和存储价值,也可以向外发送信息和价值。

智能合约具体是指运行在可复制、共享的账本上的计算机程序,可以处理信息,接收、存储和发送价值的脚本

特点

  • 不可篡改
  • 分布式
  • 自动触发
  • 不依赖第三方

3)去中心化网络

去中心化网络不同于中心化网络。在中心化网络中,需要中心服务器,是一种星型的辐射结构。

  • 中心化网络

中心化网络

  • 去中心化网络

我们演化成区块链的形式:

三、逻辑结构

从架构上来说,区块链大致可以分为4层,从下到上依次为 数据层网络层合约层应用层

1)数据层

数据层是区块链的逻辑架构中最基础的一层,功能主要包括区块数据的存储、哈希值和 Merkle 树的计算以及链式结构的生成,其中进行数据的存储时需要重点考虑数据存储的性能和稳定性。在比特币和以太坊中的存储功能选择的是 LevelDB数据库。

数据层的功能是把交易数据存储到区块中并将区块加入到区块链中。当节点之间发生交易后会将交易数据广播到区块链的去中心化网络上,网络中其他节点负责校验这些交易。交易被确认有效后会存储到区块中,并加入到区块链。

2)网络层

网络层主要包括 P2P 网络共识算法 两个组成部分。P2P (Peer to Peer)网络也称为点对点网络对等网络,根据去中心化程度的不同可以将其分为以下三种:

  • 纯P2P网络

    • 节点同时作为客户端和服务器

    • 没有中心服务器

    • 没有中心路由器

  • 杂P2P网络

    • 有一个中心服务器保存节点的信息并对请求这些信息的客户端作出响应
    • 节点负责发布信息(因为中心服务器并不保存文件),让中心服务器知道哪些文件被共享,让需要的节点下载其可下载其可使用的资源
    • 路由重点使用地址,通过被一组索引引用来获取绝对地址
  • 混合P2P网络

同时含有纯P2P网络和杂P2P网络的特点

在 P2P 网络中,各个节点需要对区块链中的各个区块达成共识才能共同维护同一分布式账本。这个共识的机制就是共识算法,比较最为常用的共识算法有工作量证明机制(Proof of Work,PoW)、权益证明机制(Proof of Stake,PoS)、股份授权证明机制(Delegated Proof of Stake,DPoS)

3)合约层

合约层的功能使得区块链中的区块具有可编程的特性,并且赋予了区块链智能的特性,在区块链中智能合约的作用如同一个智能助理,对区块链中的数据和事件按照预先设定的逻辑进行处理。

4)应用层

应用层泛指基于区块链技术并结合具体业务场景开发的应用,包括加密数字货币钱包、交易所、去中心化应用等。

四、分类

随着区块链的快速发展、区块链的应用范围越来越广,不同的区块链应用之间也有了比较大的差异

1)公有链

公有链是对外公开、任何人都可以参与的区块链。公有链是真正意义上的完全无中心化的区块链。它通过加密技术保证交易不可篡改,在不可信的网络环境中建立共识,从而形成去中心化的信用机制。公有链使用于数字货币、电子商务、互联网金融、知识产权等应用场景。

2)联盟链

联盟链仅限于联盟成员使用,因其只针对成员开放全部或部分功能,所以联盟链上的读写权限、以及记账规则都按联盟链规则来控制。联盟链适用于机构间的交易、结算、清算等B2B场景。超级账本项目即属于联盟链。

3)私有链

私有链对单独的个人或实体开放,仅供在私有组织,比如公司内部使用,私有链上的读写权限,参与记账的权限都由私有组织来决定。私有链适用于企业、组织内部。

4)特点比较

5)侧链

侧链的概念最早产生于比特币的应用过程中,侧链实质上是指遵守侧链协议的所有区块链。侧链协议是一种可以让比特币安全地从比特币主链转移到其他区块链,又可以从其他区块链安全地比特币主链的协议。

侧链本质上是一种跨区块链解决方案。通过这种解决方案,可以实现数字资产从第一个区块链到第二个区块链的转移,又可以在稍后的时间点从第二个区块链安全返回到第一个区块链。

6)闪电网络

在比特币交易网络中,最为人诟病的问题便是交易性能:全网约每秒7笔左右的交易速度远低于传统金融交易系统。同时,等待6个区块的可信确认将导致约1个小时的最终确认时间。

为了提升性能,比特币社区提出了闪电网络等创新的设计。闪电网络的主要思路十分简单—将大量交易放到比特币区块链之外进行,只把关键环节放到链上进行确认。闪电网络的工作原理是用比特币拥有权的承诺来替代拥有权

五、总结

区块链的主要特点包括去中心化、去信任、集体维护、匿名性、可靠的数据库。

  • 去中心化: 区块链技术基于P2P去中心化网络,区块链网络上的节点都是平等的,没有中心服务器,故区块链是去中心化的。
  • 去信任: 区块链中的数据都是公开透明的,交易数据通过加密技术进行验证和记录,无须第三方信任机构的参与,故有去信任的特点。
  • 集体维护: 区块链由全网节点共同参与维护,某一节点上数据的更新需要其他节点进行计算和验证,不会受少数节点控制。
  • 可靠的数据库: 区块链中的每一个节点上的数据都是全网数据,单个节点的退出或瘫痪不会影响整个系统。

好了,以上便是本篇的所有内容,如果觉得对你有帮助的小伙伴不妨点个关注做个伴,便是对小菜最大的支持。不要空谈,不要贪懒,和小菜一起做个吹着牛X做架构的程序猿吧~ 咱们下文再见!

今天的你多努力一点,明天的你就能少说一句求人的话!

我是小菜,一个和你一起变强的男人。 💋

微信公众号已开启,菜农曰,没关注的同学们记得关注哦!

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

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

相关文章

Similarity-Preserving KD(ICCV 2019)原理与代码解析

paper:Similarity-Preserving Knowledge Distillationcode:https://github.com/megvii-research/mdistiller/blob/master/mdistiller/distillers/SP.py背景本文的灵感来源于作者观察到在一个训练好的网络中,语义上相似的输入倾向于引起相似的…

[python入门㊾] - python异常中的断言

目录 ❤ 断言的功能与语法 ❤ 常用断言 ❤ 常用的断言表达方式 ❤ 异常断言 ❤ 正则断言 ❤ 检查断言装饰器 ❤ 断言的功能与语法 Python assert(断言)用于判断一个表达式,在表达式条件为 False 的时候触发异常 断言可以在条件…

2023Python接口自动化测试实战教程,附视频实战讲解

这两天一直在找直接用python做接口自动化的方法,在网上也搜了一些博客参考,今天自己动手试了一下。 一、整体结构 上图是项目的目录结构,下面主要介绍下每个目录的作用。 Common:公共方法:主要放置公共的操作的类,比如数据库sql…

js中数字运算结果与预期不一致的问题和解决方案

本文主要是和大家聊聊关于js中经常出现数字运算结果与预期结果不一致的问题,与及解决该问题的的方案。 一、问题现象 如:0.1 0.2的预期结果是0.3,但是在js中得到的计算结果却是0.30000000000000004,如下图所示 如:0…

GEE学习笔记 六十九:【GEE之Python版教程三】Python基础编程一

环境配置完成后,那么可以开始正式讲解编程知识。之前我在文章中也讲过,GEE的python版接口它是依赖python语言的。目前很多小伙伴是刚开始学习GEE编程,之前或者没有编程基础,或者是没有学习过python。为了照顾这批小伙伴&#xff0…

15种NLP数据增强方法总结与对比

数据增强的方法 数据增强(Data Augmentation,简称DA),是指根据现有数据,合成新数据的一类方法。毕竟数据才是真正的效果天花板,有了更多数据后可以提升效果、增强模型泛化能力、提高鲁棒性等。然而由于NLP…

光伏VSG-基于虚拟同步发电机的光伏并网逆变器系统MATLAB仿真

采用MATLAB2021b仿真!!!仿真模型1光伏电池模块(采用MATLAB自带光伏模块)、MPPT控制模块、升压模块、VSG控制模块、电流滞环控制模块。2s时改变光照强度 !!!VSG输出有功功率、无功功率…

6.3 使用 Swagger 生成 Web API 文档

第6章 构建 RESTful 服务 6.1 RESTful 简介 6.2 构建 RESTful 应用接口 6.3 使用 Swagger 生成 Web API 文档 6.4 实战:实现 Web API 版本控制 6.3 使用 Swagger 生成 Web API 文档 高质量的 API 文档在系统开发的过程中非常重要。本节介绍什么是 Swagger&#xff…

15-基础加强-2-xml(约束)枚举注解

文章目录1.xml1.1概述【理解】(不用看)1.2标签的规则【应用】1.3语法规则【应用】1.4xml解析【应用】1.5DTD约束【理解】1.5.1 引入DTD约束的三种方法1.5.2 DTD语法(会阅读,然后根据约束来写)1.6 schema约束【理解】1.6.1 编写schema约束1.6.…

基于高频方波电压信号注入的永磁同步电机无传感器控制仿真及其原理介绍

基于方波信号注入的永磁同步电机无传感器控制仿真及其原理介绍 注入的高频方波信号为: 可以得到估计轴的高频响应电流为: 当向定子绕组注入高频电压信号时,所注入的高频信号频率远高于基波信号频率。因此,IPMSM 在a-β轴的电压模型可以表示为: 假定…

二叉树OJ(一)二叉树的最大深度 二叉搜索树与双向链表 对称的二叉树

二叉树的最大深度 二叉树中和为某一值的路径(一) 二叉搜索树与双向链表 对称的二叉树 二叉树的最大深度 描述 求给定二叉树的最大深度, 深度是指树的根节点到任一叶子节点路径上节点的数量。 最大深度是所有叶子节点的深度的最大值。 (注:…

Xcode Archives打包上传 / 导出ipa 发布至TestFlight

Xcode自带的Archives工具可以傻瓜式上传到App Store Connect分发这里以分发到TestFlight为例进行操作。 环境:Xcode 14 一:Archives打包 选择Xcode菜单栏的Product,Archives选项,需要等待编译完成,进入如下界面&…

【C语言】初识结构体

☃️内容专栏:【C语言】初阶部分 ☃️本文概括:继初识C语言,对C语言结构体初阶部分进行归纳与总结。 ☃️本文作者:花香碟自来_ ☃️发布时间:2023.2.19 一、结构体的声明 结构体(类型)是一些…

字符设备驱动基础(二)

目录 一、五种IO模型------读写外设数据的方式 二、阻塞与非阻塞 三、多路复用 3.1 应用层:三套接口select、poll、epoll 3.2 驱动层:实现poll函数 四、信号驱动 4.1 应用层:信号注册fcntl 4.2 驱动层:实现fasync函数 一、…

CSAPP学习笔记——虚拟内存(二)

案例研究 Intel Core i7 该处理底层的Haswell微体系结构允许64位的虚拟和物理地址空间,而现在的Core i7实现支持48位(256TB)虚拟地址空间和52位(4PB)物理地址空间,这对目前来说已经完全够用了。&#xff…

Liunx(狂神课堂笔记)

一.常用命令 1. cd 切换目录 cd ./* 当前目录cd /* 绝对路径cd .. 返回上一级目录cd ~ 回到当前目录pwd …

定点数的表示和运算

文章目录真值(有正负号)和机器数(0正1负)原码整数小数补码负数的补数正数的补数[y]~补~ > [-y]~补~反码小结移码移位运算加减法运算溢出判断真值(有正负号)和机器数(0正1负) 无符…

链表OJ(六)链表相加(一) 链表相加(二)

目录 链表相加(一) 链表相加(二) 描述 二与一相比多了俩次反转而已 链表相加(一) 描述 给定两个非空链表逆序存储的的非负整数,每个节点只存储一位数组。 请你把两个链表相加以下相同方法返回链表,保证两个数都不会以 0 开头。 【我的解法】长到…

实例五:MATLAB APP design-APP登录界面的设计

一、APP 界面设计展示 注:在账号和密码提示框输入相应的账号和密码后,点击登录按钮,即可跳转到程序中设计的工作界面。 二、APP设计界面运行结果展示

使用继承的虚函数表

​ 代码 #include <iostream> using namespace std;class Father { public:virtual void func1() { cout << "Father::func1" << endl; }virtual void func2() { cout << "Father::func2" << endl; }virtual void func3()…