【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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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…