【BTC】數據結構

目錄

那比特幣區塊鏈的組織形式到底是以鏈表的形式,還是樹的形式呢?

區塊頭和區塊體與默克爾樹的關系

默克爾證明詳解


區塊鏈和鏈表最大的區別就是區塊鏈用哈希指針代替了普通指針。

鏈表的指針就是指向一個結構體在內存中的地址,而哈希指針除了記錄這一個區塊的地址外,還會記錄這個區塊的哈希值(這個哈希值是整個區塊所有數據進行哈希得到的),這樣就能更方便的驗證這個區塊是否被篡改過(如果被篡改過,那么哈希值肯定就和以前的不一樣了)。

第一個區塊就是創世紀塊,新創建出來的區塊會被追加在最后,每一個區塊有一個指向前序節點哈希指針。

基于區塊鏈的這種結果,實現了通過其中一個區塊的哈希值,就能推算出任何區塊的哈希值是否被篡改(防止數據篡改),每一個區塊的哈希值是根據自己以及前面的區塊計算得來的。因為只要有一個惡意節點篡改了其中一個節點的數據,這個結點哈希值變了,那么連帶著后面的所有結點哈希值都要跟這變,牽一發而動全身,這也就給了我們驗證的條件。

比特幣中的另外一個數據結構就是Merkle tree,他和binary tree(二叉樹)的一個區別就是用哈希指針代替了普通指針。

每個區塊之間是通過鏈表組織起來的,而每個區塊內部會存儲很多交易數據塊(tx)。這些區塊內部的交易數據塊是通過Merkle tree組織起來的。Merkle tree的葉子節點就是交易數據塊,上面的都是哈希指針節點,存儲的是哈希指針。同樣的道理,我們只要是有了根哈希指針(root hash index),我們就能判斷出鏈上的數據區塊的數據是否被篡改(因為只要是有一個區塊發生了變化,那么根哈希指針肯定也會變化),并且通過Merkle tree的結構,使得查詢速度有了很大提高。

只要記住根哈希值,就能檢測樹中任何部位的修改,如某個交易數據塊修改會傳導至根節點使根哈希值變化。

那比特幣區塊鏈的組織形式到底是以鏈表的形式,還是樹的形式呢?

在比特幣中,區塊鏈的組織形式本質上是鏈表結構,但同時結合了默克爾樹(Merkle Tree)這一樹狀結構來處理交易數據,二者相互配合,共同為區塊鏈的運行提供支持

  • 鏈表形式:區塊鏈由一個個區塊組成,這些區塊之間通過哈希指針依次連接,形成了類似鏈表的結構。其中,最前面的是創世紀塊,最后面的是最新產生的區塊。每個區塊的哈希指針是根據前面整個區塊的內容計算得出的。這種鏈表結構使得區塊鏈具有抗時間篡改的特性,任何對前面區塊內容的修改,都會導致后續所有區塊的哈希指針發生變化,從而被輕易檢測到。例如,若有人修改了中間某個區塊的內容,那么該區塊的哈希值會改變,這會使得下一個區塊中指向它的哈希指針不再匹配,并且這種影響會像多米諾骨牌一樣傳遞到后續所有區塊,最終導致系統中保存的最后一個區塊的哈希值也發生變化 。
  • 樹的形式(默克爾樹):在每個區塊內部,交易數據是通過默克爾樹來組織的。默克爾樹底層的葉節點是一個個交易數據塊,上層的內部節點都是哈希指針。這些哈希指針是由下層相鄰數據塊的哈希值拼接后再取哈希得到的,層層向上直至根節點,根節點的哈希值保存在區塊頭(block header)中。默克爾樹的主要作用是提供默克爾證明(Merkle Proof),用于驗證交易是否存在于區塊中比特幣節點分為全節點和輕節點,全節點保存整個區塊的內容,包括交易的具體信息;輕節點只保存區塊頭(比如我們本地下載的錢包,就只保存輕節點數據,用于驗證交易數據),當輕節點需要驗證某個交易時,全節點會提供從交易所在葉節點到根節點路徑上的哈希值,輕節點通過計算這些哈希值來驗證交易是否存在 。

區塊鏈的整體數據結構如下:各個區塊用哈希指針連接,默克爾樹的根哈希值存于區塊頭(block header),區塊頭無交易具體內容,交易列表存于區塊體(block body),區塊體就存儲了默克爾樹的結構。

我們本地下載的錢包只會存儲輕節點,輕節點只存儲了區塊頭(block header),區塊頭中存儲了交易所在的默克爾樹的根哈希值,但并沒有存儲區塊鏈上的交易數據本身。

假設存在一個輕節點,該輕節點僅保存了 Merkle 樹的根哈希值(存于區塊的 block header 中),沒有保存交易列表及 Merkle 樹的具體內容。此時,輕節點想要驗證某一特定交易(PPT 中標為黃色的交易)是否存在于區塊中。

輕節點會向某個全節點發出請求(某一臺礦工機器),全節點收到請求后,將圖中標為紅色的三個哈希值發送給輕節點。輕節點在接收到這些哈希值后,在本地進行計算。首先計算黃色交易自身的哈希值(圖中標為綠色),然后將該綠色哈希值與全節點提供的相鄰紅色哈希值進行拼接,通過計算得出上一層節點中的綠色哈希值。按照這樣的方式,繼續將新得到的綠色哈希值與相鄰紅色哈希值拼接計算,進而算出再上一層的綠色哈希值,直至計算出整棵 Merkle 樹的根哈希值。

最后,輕節點將計算得到的根哈希值與自身保存的 block header 里的根哈希值進行比較,以此來判斷黃色交易是否存在于該 Merkle 樹中,即是否存在于對應的區塊里 。如果兩者一致,則表明該交易在對應的區塊中。

區塊頭和區塊體與默克爾樹的關系

  1. 結構組成:在比特幣的每個區塊中,分為區塊頭(block header)和區塊體(block body)兩部分。
  2. 默克爾樹根哈希值存儲位置:默克爾樹的根哈希值存放在區塊頭中。這一設計至關重要,因為區塊頭包含的是與整個區塊相關的關鍵元數據,根哈希值作為默克爾樹的關鍵標識,放在此處可用于快速驗證整個區塊內交易數據的完整性。而區塊頭并不包含交易的具體內容,這使得其數據量相對較小,便于節點存儲和傳輸 。
  3. 區塊體的交易列表:區塊體則存放著該區塊內的交易列表。這些交易作為默克爾樹的葉節點數據,通過層層計算哈希值構建出完整的默克爾樹結構。每個交易在區塊體中都有其對應的記錄,是區塊鏈交易信息的具體承載部分。

默克爾證明詳解

  1. 證明的作用:默克爾證明(Merkle Proof)主要用于在比特幣網絡中,讓輕節點能夠高效驗證某個交易是否存在于特定區塊中。由于輕節點只保存區塊頭,缺乏完整的交易列表信息,默克爾證明提供了一種可靠的驗證方式。
  2. 證明過程
    • 請求與響應:當輕節點想要驗證某個交易時,會向全節點發出請求。全節點收到請求后,會將從該交易所在葉節點到根節點路徑上的哈希值發送給輕節點。
    • 本地計算驗證:輕節點收到這些哈希值后,在本地進行計算。首先計算該交易本身的哈希值,然后將其與全節點提供的相鄰哈希值依次拼接并計算新的哈希值,按照默克爾樹的構建規則層層向上計算,直至得到根哈希值。最后,將計算出的根哈希值與自己保存的區塊頭中的根哈希值進行比較。
    • 驗證原理:如果兩個根哈希值一致,根據默克爾樹的特性,即樹中任何一個部位的修改都會導致根哈希值變化,就可以證明該交易確實存在于這個區塊中。因為如果交易不存在或被篡改,計算出的根哈希值必然會與區塊頭中的根哈希值不同 。
  3. 安全性討論:在驗證過程中,雖然輕節點只能驗證交易所在分支的哈希值,但篡改交易數據并使驗證通過的難度極大。因為即使修改了交易內容,想要通過調整旁邊不用驗證的哈希值來保持整個節點的哈希值不變,這在實際中是不可行的,屬于人為制造哈希碰撞,而哈希函數的抗碰撞性保證了這種操作幾乎無法實現。
  4. 復雜度分析:從復雜度角度來看,若底層有 n 個交易,默克爾證明的時間和空間復雜度都是對數級別的。這意味著隨著交易數量的增加,驗證所需的時間和空間增長速度較慢,是一種高效的驗證方式。對于證明交易不存在,如果不對葉節點排序,需要驗證整個樹,復雜度為線性;若對葉節點按交易哈希值排序,可通過提供相鄰交易到根節點的路徑證明,復雜度為對數級,但比特幣中由于沒有證明交易不存在的硬性需求,默克爾樹不要求排序 。

比特幣中的兩種基本結構 —— 區塊鏈和默克爾樹,都是用哈希指針構造。比特幣并不要求默克爾樹的葉子節點是有序的,因為比特幣中沒有證明交易不存在的需求。同時指出,只要數據結構無環,都可用哈希指針代替普通指針,有環結構會出現循環依賴問題。


相關文章:【BTC】密碼學原理-CSDN博客

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/88266.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/88266.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/88266.shtml

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

相關文章

飛算 JavaAI:讓 Java 開發效率飆升的智能助手,日常開發全場景應用指南

飛算 JavaAI:讓 Java 開發效率飆升的智能助手 ,日常開發全場景應用指南 在 Java 開發的日常工作中,開發者常常面臨各類重復性勞動與邏輯復雜度挑戰。飛算 JavaAI 作為專注于 Java 領域的智能開發助手,能夠覆蓋從代碼生成到項目維護…

8.2 文檔預處理模塊(二)

一、從0開始:簡易RAG實現 在構建更復雜的 RAG 架構之前,我們先從最基礎的版本入手。整個流程可以分為以下幾個關鍵步驟: 1.數據導入:加載并預處理原始文本數據,為后續處理做好準備。 2.文本分塊:將長文本…

【系統與工具】Linux——Linux簡介、安裝、簡單使用

計算機概論與Linux簡介 計算機概論Linux介紹與版本 Linux的規劃與安裝 Linux與硬件平臺密切相關規劃硬件與Linux安裝 主機規劃與磁盤分區安裝CentOS、多重引導 簡單使用 幫助手冊文本編輯器關機 0. Linux介紹與版本 操作系統(Linux):高效…

從視頻數據到數字孿生:如何構建虛擬與現實的橋梁?

概述 視頻數據與三維場景融合渲染技術通過將動態視頻與靜態三維模型結合,利用GPU加速、WebGL渲染、數字孿生等技術,實現虛擬與現實的交互式融合。該技術廣泛應用于智慧城市、工業監控、虛擬現實、游戲特效等領域,能夠提升場景的直觀性和用戶沉…

【筆記】開源 AI Agent 項目 V1 版本 [新版] 部署 日志

kortix-ai/suna at v1 一、最新版本號 V1 二、部署截圖 本地開發環境仍然依賴于 Poetry 環境&#xff1a; &#xff08;Python>3.11,<3.13&#xff09; 創建本地 Poetry 虛擬環境 Python 多版本環境治理理念驅動的系統架構設計&#xff1a;三維治理、四級隔離、五項自…

NumPy-梯度與導數計算詳解

NumPy-梯度與導數計算詳解一、梯度與導數的基本概念1. 導數的定義2. 梯度的定義二、NumPy中的梯度計算函數&#xff1a;np.gradient()1. 函數語法2. 一維數組的梯度計算3. 多維數組的梯度計算三、基于梯度的導數近似方法1. 前向差分2. 中心差分四、實際應用場景1. 函數優化2. 數…

Redis架構安全

先學習&#xff1a;Redis架構簡介-CSDN博客 Redis壓測 Redis一般應用于高并發的場景&#xff0c;所以一定要對Redis的性能做壓測。 Redis提供了壓測腳本redis-benchmark&#xff0c;可以對Redis進行快速的基準測試。 # 20個線程&#xff0c;100W個請求&#xff0c;測試redi…

自動化Trae Apollo參數解釋的批量獲取

自動化Trae Apollo參數解釋的批量獲取一、背景介紹二、設計思路三、操作步驟1. 環境準備2. 獲取界面坐標3. 定位關鍵元素4. 執行自動化查詢5. 獲取結果四、完整代碼五、擴展應用一、背景介紹 在自動駕駛開發中&#xff0c;百度Apollo平臺提供了大量參數用于調整系統行為。Trae…

數學模型:十大距離

十大距離 文章目錄十大距離定義1. 歐氏距離&#xff08;Euclidean Distance&#xff09;2. 曼哈頓距離&#xff08;Manhattan Distance&#xff09;3. 切比雪夫距離&#xff08;Chebyshev Distance&#xff09;4. 閔可夫斯基距離&#xff08;Minkowski Distance&#xff09;5. …

流水線(Jenkins)打包拉取依賴的時候提示無法拉取,需要登錄私倉的解決辦法

在日常工作中&#xff0c;遇到了Jenkins拉取部門內部組件庫失敗的情況&#xff0c;原因是組件庫后面放到了阿里云私倉&#xff0c;并且是沒有公開的&#xff0c;所以就會有如下提示的&#xff0c;一開始我實在.npmrc文件寫死阿里云提供的接入token&#xff0c;后面發現可能是因…

操作系統王道考研習題

1.1.4本節習題精選 一、單項選擇題 01&#xff0e;操作系統是對(&#xff09;進行管理的軟件。 A.軟件 B.硬件 C.計算機資源 D.應用程序 01.c 操作系統管理計算機的硬件和軟件資源&#xff0c;這些資源統稱為計算機資源。注意&#xff0c;操作系統不僅管理處理機、存儲器等硬件…

C語言extern的用法(非常詳細,通俗易懂)

以往我們都是將所有的代碼寫到一個源文件里面&#xff0c;對于小程序&#xff0c;代碼不過幾百行&#xff0c;這或許無可厚非&#xff0c;但當程序膨脹代碼到幾千行甚至上萬行后&#xff0c;就應該考慮將代碼分散到多個文件中&#xff0c;否則代碼的閱讀和維護將成為一件痛苦的…

Git【開源分布式版本控制工具】安裝-配置-常用指令-Git遠程倉庫-IDEA使用Git

參考博客&#xff1a;Git&#xff08;分布式版本控制工具&#xff09;_為什么嗶哩嗶哩有些視頻沒有字幕-CSDN博客 Git就是一個類似于百度云盤的倉庫&#xff1b;重點是要掌握使用idea操作Git&#xff0c;企業用的最多&#xff0c;一般不會去使用命令 Git通過不斷階段保存文件…

JavaScript數組鍵值去重方法

使用 filter 和 Map 根據鍵值去重我來詳細解釋方法2&#xff0c;這是一種高效且簡潔的數組去重方法&#xff0c;特別適合根據對象中的某個鍵值進行去重操作。完整代碼function uniqueByKey(arr, key) {return [...new Map(arr.map(item > [item[key], item])).values()]; }分…

【機器學習筆記Ⅰ】9 特征縮放

特征縮放&#xff08;Feature Scaling&#xff09;詳解 特征縮放是機器學習數據預處理的關鍵步驟&#xff0c;旨在將不同特征的數值范圍統一到相近的尺度&#xff0c;從而加速模型訓練、提升性能并避免某些特征主導模型。1. 為什么需要特征縮放&#xff1f; (1) 問題背景 量綱不…

10.9 大模型訓練數據優化實戰:3步讓準確率從68%飆升至79%

大模型訓練過程分析與數據優化 一、訓練過程關鍵指標分析 (插入mermaid流程圖:訓練過程監控與優化閉環) #mermaid-svg-Gni031LkHA93fQYM {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Gni031LkHA93fQYM .erro…

深度學習模型在C++平臺的部署

一、概述深度學習模型能夠在各種生產場景中發揮重要的作用&#xff0c;而深度學習模型往往在Python環境下完成訓練&#xff0c;因而訓練好的模型如何在生產環境下實現穩定可靠的部署&#xff0c;便是一個重要內容。C開發平臺廣泛存在于各種復雜的生產環境&#xff0c;隨著業務效…

若以部署在linux,nginx反向代理,登錄404,刷新404問題

history模式在router下面的index.js文件的最下面history: createWebHistory(import.meta.env.VITE_APP_CONTEXT_PATH),這兩個配置文件都加上然后nginx里面的配置是這個位置按照實際情況&#xff0c;我的是用docker掛載的&#xff0c;所以在/usr/share/nginx/html/lw-clothing為…

SQL Server通過存儲過程實現HTML頁面生成

引言在現代企業應用中&#xff0c;數據可視化是提升決策效率的關鍵。SQL Server作為核心數據庫管理系統&#xff0c;不僅處理數據存儲和查詢&#xff0c;還具備強大的擴展能力。通過存儲過程直接生成HTML頁面&#xff0c;企業能減少對中間層&#xff08;如Web服務器或應用程序&…

qt繪制餅狀圖并實現點擊即放大點擊部分

做得比較low #ifndef TEST_POWER_H #define TEST_POWER_H#include <QWidget> #include <QtMath> #include <QPainter> #include <QPushButton> #include <QVector> #include <cmath>namespace Ui { class test_power; } struct PieData {Q…