肖臻公开课(三)——比特币中的数据结构

news2024/11/25 2:23:30

本笔记对应北京大学肖臻老师《区块链技术与应用》公开课第三课。

0.前言

在本节中,肖老师先是简单介绍了哈希指针的概念,然后着重介绍了比特币中的两个重要的数据结构:block chain和merkle tree。

1.哈希指针

谈到比特币中的数据结构,首先就要讲讲哈希指针,对比于传统的指针而言,哈希指针不仅包含指向区块的地址,还额外包含一个哈希值,这个哈希值为地址指向的区块的整体哈希值。

2.区块链

区块链就是由哈希指针连接的,一个一个区块组成的链表

在图2-1中,就是一个简易的区块链,最左边为创世块,最右边为最近更新块,H()就为一个一个哈希指针,其不仅指向前一个区块的地址,同时保存了前一个区块的哈希值。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ICbPpyGH-1677069795443)(https://gitee.com/yu88888//myimage/raw/master/master/image-20211014193644256.png)]

  • 此数据结构作用:在上图中,在链中,任何一个区块遭到了修改,在以后的区块中,就可以通过对哈希值的计算,检测到整个系统有数据被纂改。

3.merkle tree

merkle tree是区块链中一个重要的数据结构,存在于每一个区块之中,是用于对交易信息进行保存的数据结构,节点可以通过merkle tree很方便地对交易是否存在进行验证,具体结构如下图3-1所示。

图3-1 merkle tree 结构图

在上图中,最下面一行的tx,称为数据块,代表比特币网络中的交易,此区块中存有8个交易,数据块上面的H()是对底下的数据块整体取哈希,往上的每一块都是对下面的整体取哈希H(),其中最上面两个哈希值取哈希会得到一个根哈希值,根哈希值用处很大。

3.1 区块链中的区块

因为merkle tree通常存在于区块链的区块中,因此不可避免的要对区块链的区块组成进行介绍,为以下介绍merkle tree的作用打下基础。

区块链中的区块是分为块头和块身两部分:

  • 块头 Block Header
  • 块身 Block Body

块头中包括一下内容(但不限于):

  • 根哈希值:merkle tree root hash
  • 版本号
  • 前一区块的哈希值(我们可理解为哈希指针)
  • 时间戳
  • 随机数Nonce(后面会讲到)

而块身中包含了该区块的所有信息(比特币是所有的交易,以太币还包括了所有账户信息)

3.2 实现数据防纂改

  • 只要记住根哈希值,就可以知道整个tree是否有数据更改。 如果有数据被纂改,那么根据tree的结构,依次往上推哈希值,最后可以得到一个计算后的根哈希值,将此值与之前保存的哈希值进行对比,就可以知道是否有数据更改。

3.3 实现merkle proof

在区块链中有轻节点和重节点之分。重节点保存了区块所有信息,轻节点通常只保存了block header。现在假设某轻节点想知道某笔交易是否写入了某区块中,应当怎么做?

在比特币系统中,使用merkle tree解决这个问题,如下图3-2为解决过程。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6Av4VJtS-1677069795444)(https://gitee.com/yu88888//myimage/raw/master/master/image-20211014193705672.png)]

假设上图中,轻节点A想知道黄色的tx是否真的存在于第四个区块中,那么A可以向一个重节点进行请求验证。

具体验证过程如下:

  1. 重节点收到了验证请求,因为重节点保存了整个merkle tree的信息,所以,此节点给A提供3个路径上的必须路径数据(图中红色的H())。
  2. B在本地对tx进行哈希运算,可以得到倒数第二层的第3个绿色的H(),然后再和之前获得的红色H()一起,在本地算出上方的绿色H(),再和获得的红色H()一起,在本地算出上方的绿色H()……一直循环下去,最终算到root hash值,设为H1。
  3. 将此H1与轻节点本身保存的根哈希值进行对比,如果相同,则可以证明交易存在该区块内。

在merkle proof中有几个点需要注意:

  • 为什么重节点不直接给轻节点发送是否存在某个交易呢?

如果直接发送结果,确实可以节省一点的计算资源,但是我们不能保证所有的节点都绝对安全可靠,我们必须假设有些节点是恶意的,因此我们需要依靠merkle tree,让轻节点自己进行一次验证才可以保证交易安全可靠。(为什么会安全可靠,可以联系前一章中哈希函数的防碰撞性质和单向性仔细评品味)

  • 时间复杂度多少?

证明交易存在的时间复杂度为O(log(n))。证明交易不存在有两种算法:1.遍历整个树,时间复杂度为O(n);2.对所有叶节点进行取哈希,然后根据哈希值排序,对待查找的交易取哈希值,进行2分查找,时间复杂度为O(log(n))。

比特币系统中,由于只需要做证明交易存在的任务,所以并没有对树进行排序。

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

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

相关文章

AD360身份管理自动化

自动化 IAM 的需求 对于组织来说,通过部署用户友好的 IAM 自动化解决方案来保持其安全性非常重要,该解决方案将消除人为错误并确保合规性,同时降低成本和管理工作负载。 AD360 是一种自动化身份管理解决方案,提供管理用户身份、…

这7条数据分析思路与技巧,让分析结果更可靠、完整!

大家好。在和一些新人数据分析师聊天时,经常听到大家说“工作时没有自己的分析思路,常常是机械地完成老板布置的任务,无法形成自己的数据分析方法论。” 的确,作为一名数据分析师我也能理解初入行的同学的烦恼,我们在…

ChatGPT,会是现实世界的MOSS吗?

最近,两个人工智能系统彻底火出了圈,成为许多网友热议的焦点。 一个是冷酷无情的“幕后主角”MOSS,一个是多才多艺的“全能网友”ChatGPT。 先来说说MOSS。今年春节档,科幻电影《流浪地球2》热映,电影中一个面试环节令…

深入浅出C++ ——手撕红黑树

文章目录一、红黑树的概念二、红黑树的性质三、红黑树节点的定义四、红黑树的插入操作五、红黑树的验证五、红黑树的删除六、红黑树与AVL树的比较七、红黑树的应用八、红黑树模拟实现一、红黑树的概念 红黑树,是一种二叉搜索树,但在每个结点上增加一个存…

测试中的四大板块

单元测试 单元测试的对象是软件设计的最小单位——模块。单元测试的依据是详细设描述,单元测试应对模块内所有重要的控制路径设计测试用例,以便发现模块内部的错误。单元测试多采用白盒测试技术,系统内多个模块可以并行地进行测试。 单元测试…

【Linux】进程状态与进程优先级

目录一.进程状态1.阻塞:2.挂起:具体情况3.具体操作系统状态变化R:运行状态(running)S:休眠状态(sleeping)D:磁盘休眠状态(Disk sleep)T:暂停状态(stopped)暂停进程继续进程t:追踪暂停状态(traci…

ArcGIS导出AI或EPS格式的地图图片并在Adobe Illustrator中继续编辑

本文介绍在ArcGIS下属的ArcMap软件中,将绘制好的地图导出为.ai或者.eps格式文件,并在Adobe Illustrator软件中进一步编辑地图,并最终导出为图片格式的结果文件的方法。 在ArcMap软件中绘制各类地图可以说非常方便,绘制得到的地图也…

论文阅读 | GroupViT: Semantic Segmentation Emerges from Text Supervision

前言:CLIP工作拓展-利用文本-图像对的信息进行图像语义分割(CVPR2022) 论文:【here】 代码:【here】 GroupViT: Semantic Segmentation Emerges from Text Supervision 引言 传统分割方法采用自底而上的架构&#x…

前置知识-辛几何与辛代数的基本概念、欧式几何与辛几何、相空间

1.3 Hamilton 系统的辛几何算法 经典力学有三种等价的 “数学形式” 体系: Newton 体系、Lagrange 体系和 Hamilton 体系, 其中 Hamilton 体系具有对称的形式且能应用于较广泛的物理现象, 故它一直是物理学理论研究的数学工具. Hamilton 体系的一个重要特性是稳定性, 它在几何上…

MySQL高级-day01

MySQL-day01 1 逻辑架构 1.1 架构概览 和其它数据库相比,MySQL有点与众不同,它的架构可以在多种不同场景中应用并发挥良好作用。主要体现在存储引擎的架构上,插件式的存储引擎架构将查询处理和其它的系统任务以及数据的存储提取相分离。 …

Mysql插入数据从指定选项中随机选择、插入时间从指定范围随机生成、Navicat使用存储过程模拟插入测试数据

场景 Navicat通过存储过程批量插入mysql数据: Navicat通过存储过程批量插入mysql数据_霸道流氓气质的博客-CSDN博客 上面使用过Navicat借助存储过程批量插入数据。但是插入数据是固定的 insert语句,如果在本地开发时需要模拟插入一些随机数据(从指定…

考出PMP证书到底有没有用?

我们将从三方面分享: 1. PMP 证书在国内的含金量怎么样? 2. HR 如何看待 PMP 证书? 3. 拿到 PMP 证书后,有哪些变化? 一,PMP证书的含金量 说到 PMP 证书的含金量,相信这个问题是所有学员都…

SVHN数据集下载及使用方法

街景门牌号数据集(SVHN),这是一个现实世界数据集,用于开发目标检测算法。它需要最少的数据预处理过程。它与 MNIST 数据集有些类似,但是有着更多的标注数据(超过 600,000 张图像)。这些数据是从…

【笑小枫-面试篇】Java基础面试题整理,努力做全网最全

写在前面 或许你只是想白嫖内容,或许你也会忽略这段文字,但我还是想弱弱的说 题目整理耗费了大量精力,希望可以给博主点赞收藏,谢谢大家啦 我呢,笑小枫,一个努力的普通人,也希望可以花1秒钟记住…

VS Code安装及(C/C++)环境配置(Windows系统)

参考资料2份: 从零开始的vscode安装及环境配置教程(C/C)(Windows系统)_光中影zone的博客-CSDN博客_vscode运行配置https://blog.csdn.net/qq_45807140/article/details/112862592 VSCode配置C/C环境 - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/87864677 五…

C语言与Linux系统文件操作函数大全

目录 一、C语言——fopen函数 二、C语言——fwrite函数 三、C语言——fread函数 四、C语言——fseek函数 1、Linux系统——open接口 2、Linux系统——write接口 3、Linux系统——read接口 4、Linux系统——lseek接口 一、C语言——fopen函数 fopen函数是C标准库提供的打…

FreeRTOS入门(02):任务基础使用与说明

文章目录目的创建任务任务调度任务控制延时函数任务句柄获取与修改任务优先级删除任务挂起与恢复任务强制任务离开阻塞状态空闲任务总结目的 任务(Task)是FreeRTOS中供用户使用的最核心的功能,本文将介绍任务创建与使用相关的基础内容。 创…

QT入门Containers之QTabWidget

目录 一、QTabWidget界面相关 1、布局介绍 2、更改选项卡的名字 3、设置关闭图标 4、代码测试新增页面在构造函数中添加 5、添加图标 6、常用设置 此文为作者原创,创作不易,转载请标明出处! 一、QTabWidget界面相关 1、布局介绍 选项…

MySQL 数据库基础命令

MySQL 基础命令 一.了解数据库 1、了解数据库对象 1.表: 用于以有组织方式存储数据。以行和列的格式包含数据。 2.索引: 是内部表结构,MySQL 用它基于一列或多列的值来提供对表中各行的快速访问。 3.视图: 是虚拟表&#…

Netcat安装与使用(nc)

Netcat安装与使用1.Netcat简介1.1.Netcat安装1.1.1.安装整体流程1.1.1.1.安装依赖1.1.1.2.安装Netcat1.1.1.3.配置环境变量1.1.1.4.测试1.2.Netcat基本功能1.3.Netcat常用参数2.Netcat用法2.1.前期准备2.2.banner相关信息抓取2.3.端口扫描2.3.1.扫描指定端口2.3.2.扫描指定端口…