分布式與一致性協議之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.pswp.cn/web/11609.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/11609.shtml
英文地址,請注明出處:http://en.pswp.cn/web/11609.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

代碼隨想錄算法訓練營第二十三天 | 530.二叉搜索樹的最小絕對差、501.二叉搜索樹中的眾數、236. 二叉樹的最近公共祖先

目錄 530.二叉搜索樹的最小絕對差 思路 代碼 501.二叉搜索樹中的眾數 思路 代碼 236. 二叉樹的最近公共祖先 思路 代碼 530.二叉搜索樹的最小絕對差 需要領悟一下二叉樹遍歷上雙指針操作,優先掌握遞歸 題目鏈接/文章講解:代碼隨想錄 視頻講解…

Java Spring的定時任務的配置和使用

在Spring框架中,配置和使用定時任務主要涉及Scheduled注解以及Spring的異步任務執行能力。以下是詳細步驟: 1. 引入依賴 對于Spring Boot項目,通常已經包含了Spring框架,因此不需要額外添加定時任務的依賴。如果使用的是Spring框…

AI大模型測評系統opencompass源碼解析

1 注冊器(Registry) 為了管理功能相似的模塊,MMEngine實現了注冊器。注冊器可以被視作這些類或函數的抽象。例如注冊器 MODELS 可以被視作所有模型的抽象。 1.1 什么是注冊器 MMEngine 實現的注冊器可以看作一個映射表和模塊構建方法(build function)的組合。 映射表:…

八、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 在存儲和分析結構化數據方面的現…

go語言map底層及擴容機制原理詳解(上)

底層數據結構-哈希表 go語言map的底層數據結構是哈希表:通過哈希表來存儲鍵值對,通過hash函數把鍵值對散列到一個個桶(bucket)中。 什么是哈希表? 在順序結構以及平衡樹中,元素與其的存儲位置之間沒有對應關系,因此…

SwiftUI中的@StateObject和@ObservedObject的區別

SwiftUI中的StateObject和ObservedObject屬性包裝器指示視圖更新以響應被觀察對象的變化。雖然這兩個屬性包裝器看起來很相似,但在使用SwiftUI構建應用程序時,有一個關鍵的區別需要理解。 兩個屬性包裝器都要求對象符合ObservableObject協議。這個協議表…

表征和基于結構的蛋白質工程:黃芪特異性皂苷乙酰轉移酶-文獻精讀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…

WEB后端復習——MVC、SSM【含登錄頁面代碼】

MVC(Model-View-Controller)是一種軟件設計模式,用于將應用程序分解為三個相互關聯的組件:模型(Model)、視圖(View)和控制器(Controller)。這種模式在構建用戶…

機器人學導論實驗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包含正則表達…

使用 Docker 輕松部署 Spring Boot 應用

當今軟件開發領域,Docker 和 Spring Boot 的組合已成為開發和部署應用程序的黃金標準。在這篇博客中,我們將詳細探討如何將 Spring Boot 應用容器化并使用 Docker 進行部署,確保你的部署過程既高效又可靠。 引言 Docker 提供了一個標準化的…

基于SSM的理發店會員管理系統的設計和實現(有報告)。Javaee項目。ssm項目。

演示視頻: 基于SSM的理發店會員管理系統的設計和實現(有報告)。Javaee項目。ssm項目。 項目介紹: 采用M(model)V(view)C(controller)三層體系結構&#xff0…