【BTC】数据结构

news2024/11/27 20:36:58

BTC 中对交易数据的存储主要涉及到了两种数据结构,一种是区块链,一种是 Merkle Tree。这两种数据结构组成了 BTC 中完整的区块链结构(如下图所示),共同完成对数据的存储和验证,确保交易的有效性。

一、区块链

所谓的区块链是由一个个区块构成的链,其中,每一个区块包括两个部分,分别是块头(block header)和块身(block body),块头中包含了指向前一个区块的哈希值指向块身中 Merkle Tree 的 merkle root hash时间戳等信息,块身中包含了交易数据列表。

区块链与普通链表相似,但是存在一定的区别:

(1)区块链用哈希指针代替了普通指针

(2)区块链具有防篡改、易验证的性质

区块链这种数据结构具有防篡改(tamper-evident log)的性质,这与普通链表是不同的。当对普通链表中的任意元素进行修改时,对其他元素是没有影响的,而区块链是牵一发而动全身的,由于每个区块都保留了由前一区块计算得到的哈希指针,因此,改变前面的任意一个区块,都会导致后面区块的哈希指针完全对不上,从而引发多米诺骨牌效应,实现对数据篡改的定位。

二、Merkle Tree

所谓的 Merkle Tree 是一种与 Binary Tree 类似的数据结构,用于组织和存储区块链中的交易信息,且主要存放在每个区块的块身中。在 Merkle Tree 中的每个叶节点对应一个交易数据块,其他节点用于存储左右子节点的块哈希值。

Merkle Tree 与 Binary Tree 相似,但是存在一定的区别:

(1)Merkle Tree 用哈希指针代替了普通指针

(2)Merkle Tree 可以高效验证某笔交易写入了区块链

在区块链的系统中,可以将网络中的节点分为全节点和轻节点,全节点存放了区块链的完整数据信息(既保留了区块的块头又保留了完整的块身),轻节点如 BTC 钱包等应用只存放了区块的部分数据信息(仅保留了区块的块头)。如果与某一轻节点之间进行交易,且需要向该轻节点证明某个交易是写入区块链了,则这时可以使用上 Merkle Tree 这一数据结构的 merkle proof。

merkle proof 的验证过程是这样的,假设待验证交易是颜色为黄色的 tx 块(如上图),则轻节点可以在本地计算出指向该 tx 的 H()(图中最下层的绿色 H()),并向网络中其他全节点请求验证需要的其他 H()(图中所有的红色 H()),之后,利用请求得到的红色 H() 和指向 tx 的 H(),从叶子节点一路向根节点方向计算块哈希(除指向 tx 的 H() 外的其他绿色 H()),当达到最顶层时,利用最顶层的两个 H()(图中最顶层中一红一绿的 H())计算出 root hash,最后将计算得到的 root hash 与区块头中存储的 merkle root hash 比较,如果相同,则证明该交易已经写入区块链。

当然利用 Merkle Tree 结构也可以证明交易数据中没有包含某一交易块,这时需要全节点将完整的树结构发给轻节点,轻节点通过依次比对交易块哈希值进行验证,时间复杂度为 Θ ( n ) \Theta(n) Θ(n) 。另一种比较高效的方法是使用 Sorted Merkle Tree,即是交易的哈希值按大小排序的 Merkle Tree(需要排序),此时验证的时间复杂度是 Θ ( l o g ( n ) ) \Theta(log(n)) Θ(log(n))。然而,由于 BTC 中没有涉及这一验证需求,因此,BTC 中使用的是未经过排序的 Merkle Tree 数据结构。

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

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

相关文章

常见的反爬手段和解决思路

常见的反爬手段和解决思路 学习目标 了解 服务器反爬的原因了解 服务器常反什么样的爬虫了解 反爬虫领域常见的一些概念了解 反爬的三个方向了解 常见基于身份识别进行反爬了解 常见基于爬虫行为进行反爬了解 常见基于数据加密进行反爬 1 服务器反爬的原因 爬虫占总PV(PV是指…

基于nodejs+vue的中国古诗词的设计与实现

目 录 摘要 I Abstract II 1 绪论 1 1.1 选题背景 1 1.2 选题意义 1 1.3 研究内容 2 2 相关技术介绍 3 3 系统分析 5 3.1可行性分析 5 3.1.1 操作可行性 5 3.1.2 经济可行性 5 3.1.3 技术可行性 5 3.2 需求分析 5 3.2.1非功能性需求 …

Python学习——(数据类型及其常用函数)

目录 一、数据类型 判断数据类型type() 二、数据类型的转换 三、运算符 (一)算数运算符 (二)赋值运算符 (三)复合赋值运算符 (四)比较运算符 (五)逻辑运算符 四、输入输出 (一)输出 (二)输入 五、各数据类型常用函数 (一)数值函数 1.绝对值abs(x) 2.最大值max(…

Git + Jenkins 自动化 NGINX 发布简易实现

概述 之前基于 GitLab Jenkins 实现了简单的 NGINX 的自动化发布。 具体包含如下的组件: GitLab包括 GItLab 的 WebHook; Jenkins 及其插件:Generic Webhook TriggerPublish Over SSH 🧠疑问: 为什么不用 Ansible&…

算法训练营DAY44|518. 零钱兑换 II、377. 组合总和 Ⅳ

这两道题是对于完全背包题型的另一个维度,都是求解给定背包容量求装满背包最多有几种方法的题目。两道题十分相像,但在遍历顺序上却又有着极其微妙的差别。 518. 零钱兑换 II - 力扣(LeetCode)https://leetcode.cn/problems/coin…

看完流浪地球2,这些功课你必须要补

昨天看了流浪地球2,里面的信息量太大了,回来补充了一些功课,这些知识,看完,才算对流浪地球2有了进一步了解。地球人的航天路径我们的太空航程是什么样子的呢?要从第二次世界大战开始。回形针计划&#xff1…

金仓数据库简单巡检与事务阻塞会话简单处理

查看KES版本信息 使用version函数查看 这种方式能详细显示信息 使用ksql查看 查看license有效期 查看实例启动时间和运行时长 查看实例启动时间 查看KES无故障运行时长 查看数据库列表 使用元命令\l查看 使用字典查看 查看数据库占用的磁盘空间 统计当前数据库所占的磁盘空…

chrome在爬虫中的使用

chrome浏览器使用方法介绍 学习目标 了解 新建隐身窗口的目的了解 chrome中network的使用了解 寻找登录接口的方法 1 新建隐身窗口 浏览器中直接打开网站,会自动带上之前网站时保存的cookie,但是在爬虫中首次获取页面是没有携带cookie的,这…

Wireshark TS | Packet Challenge 之 FTP 案例分析

前言 来自于 Sharkfest Packet Challenge 中的一个数据包案例,Sharkfest 是 Wireshark 官方组织的一年一度的大会,致力于在 Wireshark 开发人员和用户社区之间分享知识、经验和最佳实践。印象中早期是一年一次,近几年发展成一年两次&#xf…

【华为上机真题】工号不够用咋办

🎈 作者:Linux猿 🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C、云计算、物联网、面试、刷题、算法尽管咨询我,关注我,有问题私聊! &…

2D测量 Metrology——

基本流程: 1,创建计量模型 create_metrology_model (MetrologyHandle) 2,设置计量模型的图像大小 set_metrology_model_image_size (MetrologyHandle, Width, Height) 3,将计量对象添加至计量模型中.(矩形,直线,圆,椭圆) add_metrology_object_rectangle2_measure  //矩形…

【高并发】- 指标介绍

什么是高并发 高并发系统有哪些关键指标 高并发系统介绍 本文主要讲解高并发系统的概念,在实际开发过程中为什么要使用高并发系统,相比于传统系统,能带来怎样的改变。 1.1 高并发介绍 高并发(Hign Concurrency)&#…

Linux常用命令——sed命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) sed 功能强大的流式文本编辑器 补充说明 sed是一种流编辑器,它是文本处理中非常中的工具,能够完美的配合正则表达式使用,功能不同凡响。处理时,把当前处理的行存…

剖析“类和对象” (下) -------- CPP

学习完“类和对象”(上)【剖析“类和对象” (上) -------- CPP】和(中)【剖析“类和对象” (中) -------- CPP】,相信各位同学对CPP中类与对象的理解或多或少都加深了一点。 本篇博客将和大家一同再次学习CPP中类和对象的知识点,跟随本篇博客的脚步定能…

Java两大工具库:Commons和Guava(1)

您好,我是湘王,这是我的CSDN博客。值此新春佳节,我给您拜年啦~祝您在新的一年中所求皆所愿,所行皆坦途,展宏“兔”,有钱“兔”,多喜乐,常安宁!Java的成功很大…

Kettle(8):删除组件

删除组件能够按照指定条件,将表中的数据删除。 1 需求 有以下一个文本文件,文本文件包含了要删除的两个用户id: id 392456197008193000 267456198006210000 需要使用Kettle将文本文件中两个ID对应的t_user1表的数据删除。 2 构建Kettle数据流图 效果图: 1 将文本文件输…

【算法突击】动态规划系列 (一)| 程序员面试 | 最大子数组和 | 最长递增子序列 | 最长公共子序列

【算法突击】动态规划系列 (一)| 程序员面试 | 最大子数组和 | 最长递增子序列 | 最长公共子序列 文章目录【算法突击】动态规划系列 (一)| 程序员面试 | 最大子数组和 | 最长递增子序列 | 最长公共子序列1. 最大子数组和1.1 题目…

C 语言零基础入门教程(十三)

函数指针 函数指针是指向函数的指针变量。 通常我们说的指针变量是指向一个整型、字符型或数组等变量,而函数指针是指向函数。 函数指针可以像一般函数一样,用于调用函数、传递参数。 函数指针变量的声明: typedef int (*fun_ptr)(int,i…

ATAC-seq分析:Annotating Peaks(9)

1. 注释开放区域 将已识别的无核小体区域与基因组特征(如基因和增强子)相关联通常很有趣。 一旦注释到基因或增强子的基因,我们就可以开始将 ATACseq 数据与这些基因的特征相关联。 (功能注释、表达变化、其他表观遗传状态&#x…

瑞吉外卖实战

https://blog.csdn.net/weixin_43715214/category_12022798.html大佬记录项目介绍day01功能架构(1)用户层本项目中在构建系统管理后台的前端页面,我们会用到H5、Vue.js、ElementUI等技术。而在构建移动端应用时,我们会使用到微信小…