分布式与一致性协议之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.hqwc.cn/news/696984.html

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

相关文章

第十四天:PHP 开发,输入输出类留言板访问 IPUA 头来源

1.PHP-全局变量$_SERVER 2.MYSQL-插入语法INSERT 3.输入输出-XSS&反射&存储 4.安全问题-XSS跨站&CSRF等 1.输入输出类安全问题 反射性xss 这个先准备一个数据,随便弄一个表名字,在随便弄一点数据存入即可 作为连接的数据库&#xff0c…

游戏找不到emp.dll怎么恢复,简单介绍5种有效的恢复方法

当你在启动游戏时遇到提示“找不到emp.dll”时,可能会感到有些手足无措。不要担心,这个问题其实相当常见,解决起来也并不复杂。emp.dll是一个与游戏运行环境密切相关的动态链接库文件,它的缺失可能会导致游戏无法正常启动。小编将…

调剂”小清华“、不保护一志愿?——兰州大学25计算机考研考情分析

兰州大学(Lanzhou University),简称“兰大”,是中华人民共和国教育部直属 全国重点大学,中央直管副部级建制,位列国家首批“双一流(A 类)”、“211 工 程”、“985 工程”大学行列,入选国家“珠…

mediasoup源码分析--worker启动

官网提供的demo启动方式 官方提供的mediasoup-demo是由js(信令)c(流媒体服务)两部分服务,mediasoup的worker进程是nodejs通过child_process 的spawn()接口启动的 async function runMediasoupWorkers() {const { numWorkers } config.mediasoup;logger.info(runn…

.Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 发布到 Win7+

.Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 实测可以完整运行在 win7sp1/win10/win11. 如果用其他工具打包,还可以运行在mac/linux下, 传送门BlazorHybrid 发布为无依赖包方式 安装 WebView2Runtime 1.57 MB或136 MB 测试DEMO 发布为依赖包方式 安装 WebView2Runtime 1.…

ONVIF系列三:ONVIF客户端实现

ONVIF系列: ONVIF系列一:ONVIF介绍 ONVIF系列二:Ubuntu安装gSOAP、生成ONVIF代码框架 ONVIF系列三:ONVIF客户端实现 在系列二中完成了在Ubuntu上安装gSOAP并生成ONVIF代码框架,接下来我们利用生成的框架实现ONVIF客户端…

基于STM32H750的DCMI接口OV5640摄像头条码识别

好久没写文章了,闭上眼睛,算了一下,大概有十年了,近来接到一个项目,需要做条码识别,客户要求用MCU做,理由成本低、价格可控。 于是乎,打开某宝软件,搜索后发现STM32H7/ST…

线性表(2)

第二章、线性表(linear list) 线性表是第一个数据结构,再提一遍,学习一个具体的数据结构需要关注它的逻辑结构,物理结构和数据的运算,即三要素。 2.1、线性表的定义和基本操作 线性表的定义 需要注意的是…

Windows2016系统禁止关闭系统自动更新教程

目录 1.输入cmd--适合系统2016版本2.输入sconfig,然后按回车键3.输入5,然后按回车键4.示例需要设置为手动更新,即输入M,然后按回车键 1.输入cmd–适合系统2016版本 2.输入sconfig,然后按回车键 3.输入5,然后…

基于SpringBoot + Vue的扶贫助农管理系统设计与实现+毕业论文

系统介绍 系统分为用户和管理员两个角色 用户:登录、注册、论坛信息、查看扶贫公告信息、查看扶贫任务信息、报名任务、查看新闻信息(新闻收藏、新闻留言)、个人中心、在线客服等功能 管理员:登录、管理员管理、基础信息管理、客…

2000-2022年上市公司供应链效率数据(含原始数据+结果)

2000-2022年上市公司供应链效率数据(含原始数据结果) 1、时间:2000-2022年 2、指标:年份、股票代码、省份、城市、区县、省份代码、城市代码、区县代码、首次上市年份、上市状态、股票简称、行业名称、行业代码、库存周转率、供…

docker安装时报错:Error: Nothing to do

安装docker时报以下错误 解决方法: 1.下载关于docker的相关依赖环境 yum -y install yum-utils device-mapper-persistent-data lvm22.设置下载Docker的镜像源 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo3…