分布式与一致性协议之POW算法

POW算法

概述

谈起比特币,你应该并不陌生。比特币是基于区块链实现的,而区块链运行在因特网上,这就存在有人试图作恶的情况。有些读者可能已经发现了,口信消息型拜占庭问题之解、PBFT算法虽然能防止坏人作恶,但只能防止少数人的坏人作恶,也就是(n-1)/3个坏人(其中n为节点数)。如果区块链也只能防止一定比例的坏人作恶,那就麻烦了,因为坏人可以不断增加节点数,轻松突破(n-1)/3的限制。那区块链是如何改进这个问题的呢?答案就是PoW(Proff of Work,工作量证明)算法。
在我看来,区块链是通过工作量证明增加坏人作恶的成本,以此来防止坏人作恶的。比如,如果坏人要发起51%攻击,需要控制全网51%的算例,成本是非常高昂。为什么呢?因为根据CryptoSlate估算,对比特币进行51%算力攻击需要上百亿人民币。
为了更好地理解和掌握PoWs算法,接下来会详细讲解它地原理和51%攻击地本质,希望在理解PoW算法的同时,也能了解PoW算法的局限。
首先说说工作量证明的原理,工作量是如何被证明的。

如何理解工作量证明

什么是工作量证明呢?你可以这么理解:工作量证明就是一份证明,用来确认你做过一定量的工作。比如,你的大学毕业整数就是一份工作量证明,证明你通过4年的努力完成了相关课程的学习。回到计算机世界就是,客户端需要做一定难度的工作才能得出一个结果,验证方却很容易通过结果来检查客户端是不是做了相应的工作。比如小李来BAT面试,说自己的编程能力很强,那么他需要做一定难度的工作来验证自己的能力(比如做一道编程题)。根据做题结果,面试官可以判断他是否适合这个岗位。你看,小李做一道编程题,面试官核验做题结果,这就是一个现实版的工作量证明。
具体的工作量证明如图所示。在这里插入图片描述

请求方做了一些运算,解决了某个问题,然后把运算结果发送给验证方进行核验;验证方根据运算结果,即可判断请求方是否做了相关的工作。
需要注意的是,这个算法具有不对称性,也就是说,工作对于请求方是有难度的,对于验证方则比较简单,是易于验证的。既然工作量证明是通过指定的结果来证明自己做过一定量的工作,那么在区块链的PoW算法中需要做哪些工作呢?答案是哈希运算。区块链是通过哈希运算后的结果值证明自己做过了相关工作。为了更好地理解哈希运算,在介绍哈希运算之前,先来聊一聊哈希函数。哈希函数(Hash Function)也叫散列函数。假设你输入一个任意长度的字符串,哈希函数会计算出一个长度相同的哈希值。假设我们对任意长度字符串(比如geektime)执行SHA256哈希运算,就会得到一个32字节的哈希值,如代码所示

echo -n "geektime" | sha256sum
bb2f0f297fe9d3b8669b6b4cec3bff99b9de596c46af2e4c4a504cfe1372dc52

那我们如何通过哈希函数进行哈希运算,从而证明工作量呢?这里举个具体的例子帮助大家理解。
我们给出的工作量要求是,给定一个基本的字符串(比如geektime),你可以在这个字符串后面添加一个整数值,然后对变更后(添加整数值后)的字符串进行SHA256哈希运算,如果运算后得到的哈希值(十六进制)是以0000开头,就表示验证通过。为了达到这个工作量证明的目标,我们需要不断地递增整数值,一个一个地试,并对得到的新字符串进行SHA256哈希运算。按照这个规则,我们需要经过35204次计算才能找到恰好前4位为0的哈希值。如代码所示

"geektime0" =>
01f28c5df06ef0a575fd0e529be9a6f73b1290794762de014ec84182081e118e
"geektime1" =>
a2567c06fdb5775cb1e3ce17b72754cf146fcc6da75c8f1d87d7ab6a1b8c4523
...
"geektime35022" =>
8afc85049a9e92fe0b6c98b02b27c09fb869fbfe273d0ab84ad8c5ac17b8627e
"geektime35023" =>
0000ec5927ba10ea45a6822dcc205050ae74ae1ad2d9d41e978e1ec9762dc404

通过这个示例可以看到,经过一段时间的哈希运算后,我们会得到一个符合条件的哈希值。这个哈希值可以用来证明我们的工作量。这个规则不是固定的,在实际场景中,你可以根据场景特点制定不同的规则,比如,你可以试试分别运行多少次才能找到恰好前3位和前5位为0的哈希值。
现在,你对工作量证明的原理应该有一定的了解了,那么区块链是如何实现工作量证明的呢?

区块链是如何实现PoW算法的

区块链也是通过SHA256来执行哈希运算计算出符合指定条件的哈希值来证明工作量的。因为在区块链中,PoW算法是基于区块链中的区块信息进行哈希运算的,所以下面我们先来回顾一下区块链的相关知识。
在这里插入图片描述

区块链的区块是由区块头、区块体两部分组成的,如图所示。

  • 1.区块头(Block Head):主要由上一个区块的哈希值、区块体的哈希值、4字节的随机数(nonce)等组成
  • 2.区块体(Block Body):区块包含的交易数,其中第一笔交易是Coinbase交易,这是一笔激励矿工的特殊交易。
    拥有80字节固定长度的区块头就是用于区块链工作量证明的哈希运算中的输入字符串,而且通过双重SHA256哈希运算(也就是对SHA256哈希运算的结果再执行一次哈希运算)计算出地哈希值只有小于目标值(target)才是有效地,否则哈希值无效,必须重算。可以看到。区块链是通过对区块头执行SHA256哈希运算得到小于目标值的哈希值来证明自己的工作量的。

计算出符合条件的哈希值后,矿工就会把这个信息广播给集群中所有其他节点,待其他节点验证通过后,它们会将这个区块假如自己的区块链中,最终形成一条区块链,如图所示。在这里插入图片描述
算例越强,系统大概率会越先计算出这个哈希值。这也就意味着,如果坏人们掌握了51%的算力,就可以发起51%攻击,比如,实现双花(Double Spending),即同一份钱花两次。
具体来说,如果攻击者掌握了较多的算例,那么他就能挖掘一条比原链更长的攻击链并将攻击链向全网广播,这时,按照约定,节点将接收更长的链,也就是攻击链,丢弃原链,如图所示。在这里插入图片描述

需要注意的是,即使攻击者只有30%的算力,他也有可能连续计算出多个区块的哈希值,挖掘出更长的攻击链,发动攻击。另外,即使攻击者拥有51%的算力,他也有可能半天无法计算出一个区块的哈希值,即攻击失败,也就是说,能否计算出符合条件的哈希值有一定的概率性,但长久来看,攻击者攻击成功的概率等同于攻击者算力的权重

重点总结

  • 1.在比特币的区块链中,PoW算法是通过SHA256哈希运算计算出符合指定条件的哈希值来证明工作量的。
  • 2.51%攻击的本质是因为比特币的区块链约定了"最长链胜出,其他节点在这条链上扩展",所以攻击者可以通过优势算力实现对最长链的争夺。
  • 3.除了通过PoW算法增加坏人作恶的成本,比特币还通过"挖矿得币"奖励好人,最终保持了整个系统的稳定运行。
    另外,因为拜占庭容错算法(比如PoW算法、PBFT算法)能容忍一定比例的作恶行为,所以它在相对开放的场景中应用广泛,比如公链、联盟链。非拜占庭容错算法(比如Raft算法)无法对作恶行为进行容错,主要用于封闭、绝对可信的场景中,比如私链、公司内网的DevOps环境。我们要理解两类算法之间的差异,根据场景特点,选择合适的算法,保障业务高效、稳定的运行

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

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

相关文章

八、e2studio VS STM32CubeIDE之内存使用情况窗口

目录 一、概述/目的 二、STM32CubeIDE Build Analyzer 三、e2studio Memory Usage 八、e2studio VS STM32CubeIDE之内存使用情况窗口 一、概述/目的 1、嵌入开发最大特点之一就是资源受限,关注芯片资源使用详情是优秀工程师的技能之一 2、Keil和IAR都不支持内存…

CTFshow 信息搜集

第一题1 进入靶场 直接看源码发现flag 第二题 1 按右键没办法看源码 按ctrlu可以查看源码 第三题 0 查看源码 发现还是什么都没有 用bp抓包发现flag 第四题1 直接进robots.txt 访问flagishere.txt获得flag 第五题 0 提示了phps源码泄露 用目录扫描工具没扫出来 看wp 发现有…

网络编程套接字详解

目录 1. 预备介绍 2.网络字节序 3.udp网络程序 4.地址转换函数 5.udp网络编程 1.预备介绍 1.1源IP地址和目标IP地址 举个例子: 从北京出发到上海旅游, 那么源IP地址就是北京, 目标IP地址就是上海. 1.2 端口号 作用: 标识一个进程, 告诉OS这个数据交给那个进程来处理; (1)…

Oracle: 一个用户多个表空间处理

1.场景描述 今天工作中,同事说建了一个用户,往里面导入数据时提示表空间不存在,建了表空间后,部分仍然导不进去。期望帮忙创建表空间,并指定默认表空间,成功将数据导入。 (1)创建好的…

K8s:二进制安装k8s(单台master)

目录 一、安装k8s 1、拓扑图 2、系统初始化配置 2.1关闭防火墙selinx以及swap 2.2设置主机名 2.3在每台主机中添加hosts,做映射 2.4调整内核参数,将桥接的ipv4流量传递到iptables,关闭ipv6 2.4时间同步 3、部署docker引擎&#xff0…

使用LangChain和Neo4j快速创建RAG应用

大家好,Neo4j 通过集成原生的向量搜索功能,增强了其对检索增强生成(RAG)应用的支持,这标志着一个重要的里程碑。这项新功能通过向量索引搜索处理非结构化文本,增强了 Neo4j 在存储和分析结构化数据方面的现…

表征和基于结构的蛋白质工程:黄芪特异性皂苷乙酰转移酶-文献精读14

Characterization and structure-based protein engineering of a regiospecific saponin acetyltransferase from Astragalus membranaceus 表征和基于结构的蛋白质工程:黄芪特异性皂苷乙酰转移酶,一篇乙酰基转移酶文章精读分享~ 摘要 乙酰化有助于许…

【C++】继承相关(基类与派生类的继承关系以及细节整理)

目录 00.引言 01.继承的定义 02.基类和派生类对象 03.继承中的作用域 04.派生类的默认成员函数 05.友元、静态成员 00.引言 继承是面向对象编程中的一个重要概念,它的作用是创建一个新的类,该类可以从一个已存在的类(父类/基类&#x…

服务攻防——数据库安全

第一步: 端口扫描:nmap 扫不到端口:端口被修改,防护软件,放在内网环境 mysql 内置端口3306 第一种官方漏洞 第一步:先扫描有什么端口开发 用这个错误密码一直访问,最终就进去了 弱口令猜解 不可以直接猜解&#x…

机器人学导论实验1—CoppeliaSim 平台介绍及初步使用BJTU

1. 实验内容分析 对实验内容的理解及关键点: 理解这个实验的关键点在于理解如何使用CoppeliaSim和MATLAB来控制和操作机器人。需要熟悉这两个工具的基本操作,例如如何加载场景、如何修改机器人参数、如何使用MATLAB客户端程序来控制机器人等。此外&#…

Docker 部署 Prometheus 实现一个极简的 QPS 监控

背景 : Prometheus 是近年来最流行的开源监控框架, 其功能强大且易于使用, 拥有各种主流后端语言(Java/Go/Python/Node.js等)与各种场景(如web handler/ k8s/Nginx/MySQL等)的客户端, 并自带图形化显示页面。分享一个快速入门Prometheus 的教程, 实现一个极简的, 后端开发需要特…

Nginx-基础-基础配置-Location

Location 参数匹配模式 参数匹配方式匹配模式说明注意事项精准匹配普通字符串匹配用于标准uri前,要求请求字符串与uri精准匹配,成功则立即处理,nginx停止搜索其他匹配。~正则匹配正则表达式匹配用于正则uri,表示uri包含正则表达…

基于SSM的理发店会员管理系统的设计和实现(有报告)。Javaee项目。ssm项目。

演示视频: 基于SSM的理发店会员管理系统的设计和实现(有报告)。Javaee项目。ssm项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构&#xff0…

Docker安装达梦数据库

1.确保已安装Docker 可参考:Linux安装Docker-CSDN博客 2.上传dm镜像并导入安装包 可以从:产品下载 | 达梦数据库下载dm镜像,如下图: docker load -i dm8_20230808.tar 3.导入后查看镜像 docker images 4.启动容器 docker run …

图的概念、性质和存储与简单遍历

前置知识:树的基本概念及性质 为了保证学习效果,请保证已经掌握前置知识之后,再来学习本章节!如果在阅读中遇到困难,也可以回到前面章节查阅。 学习目标 掌握图的基本概念掌握图的一些性质 图的概念 基本概念 图 (…

Pytorch如何计算网络参数

方法一. 利用pytorch自身 PyTorch是一个流行的深度学习框架,它允许研究人员和开发者快速构建和训练神经网络。计算一个PyTorch网络的参数量通常涉及两个步骤:确定网络中每个层的参数数量,并将它们加起来得到总数。 以下是在PyTorch中计算网…

如何在 CloudFlare 里屏蔽/拦截某个 IP 或者 IP 地址段

最近除了接的 CloudFlare 代配置订单基本很少折腾自己的 CloudFlare 配置了,今天给大家简单的讲解一下如何在 CloudFlare 里屏蔽/拦截 IP 地址和 IP 地址段,虽然明月一直都很反感针对 IP 的屏蔽拦截,但不得不说有时候还是很有必要的。并且,既然可以拦截屏蔽 IP 自然也可以但…

鸿蒙内核源码分析(VFS篇) | 文件系统和谐共处的基础

基本概念 | 官方定义 VFS(Virtual File System)是文件系统的虚拟层,它不是一个实际的文件系统,而是一个异构文件系统之上的软件粘合层,为用户提供统一的类Unix文件操作接口。由于不同类型的文件系统接口不统一&#x…

Flink HA模式下JobManager切换时发送告警

资源&版本信息 Flink版本1.14.6 运行平台:K8s HA使用ZK(使用K8s的ETC应该是一个道理) 详解Flink HA原理 Flink启动时会创建HighAvailabilityServices提供HA和相关基础服务,其中包括leaderRetrievalService和LeaderElecti…

搜索引擎的设计与实现(二)

目录 3 搜索引擎的基本原理 3.1搜索引擎的基本组成及其功能 l.搜索器 (Crawler) 2.索引器(Indexer) 3.检索器(Searcher) 4.用户接口(UserInterface) 3.2搜索引擎的详细工作流程 4 系统分析与设计 4.1系统分析 4.2系统概要设计 4.2系统实现目标 前面内容请移步 搜索引…