当前位置: 首页 > news >正文

区块链技术与应用2——BTC-数据结构

文章目录

    • 比特币中的数据结构
      • 1. 区块链(block chain)
      • 2. 默克尔树(Merkle tree)
    • 3.哈希指针的问题

比特币中的数据结构

在这里插入图片描述

1. 区块链(block chain)

哈希指针:

(1)保存数值的位置
(2)保存数值的哈希值

区块链:一个使用哈希指针的链表
在这里插入图片描述

genesis block:创世块(最开始创建的块)
most recent block:最近创建的块
tamper-evident log:篡改证明记录

每一个当前区块都保存了上一个区块所有内容的哈希值与位置,形成了一个哈希指针,保存在当前区块中,所有区块利用哈希指针形成了区块链。最后一个区块的哈希指针保存在系统内部

当区块链中某一个区块(图中红色区块)的内容遭到篡改,那么这个区块后面的所有区块(图中红色区块右边的区块)中的哈希指针都要修改。因此只需要通过对比最后一个区块的哈希值是否被修改就能够察觉整个区块链上的区块是否遭到了篡改。

有了这个性质,比特币上的某些节点无需保存所有的区块,有的可能只保存了离自己最近的几千个区块。如果要用到更靠前的区块,那么可以向其他人询问,但如何保证询问到的区块是可靠的呢?只需要对比保存的区块的最前面一个区块内保存的的哈希值别人给的区块的哈希值是否一致即可。

2. 默克尔树(Merkle tree)

默克尔树:一个使用哈希指针的二叉树。树中包含数据块(交易记录)和哈希指针。
在这里插入图片描述

区块的结构:

(1)block header:保存了root hash
(2)block body:保存交易记录数据信息

Merkle tree的用途:向轻节点证明某个记录被写入到了区块链。proof of membership或proof of inclusion

比特币中有两种节点(区块):
轻节点:只保存block header
全节点:既有block header,又有block body

Merkle proof:
在这里插入图片描述
图中圈起来的节点就是轻节点。
a. 首先需要向某个全节点请求一个Merkle proof路径,并请求路径上需要的哈希值(图中红色H)
b. 然后计算需要证明的记录的哈希值,然后通过给定的路径一步一步计算哈希值,直到计算到根哈希值(root hash)
c. 因为轻节点中是保存了block header的,而block header中保存的是root hash,因此只需要对比计算出来的root hash是否与保存的root hash一致即可。

Merkle tree的第二个用途:proof of non-membership,证明某个交易不在某个轻节点中。

使用sorted Merkle tree:对交易记录tx的哈希值进行排序,如果计算出待证明tx的哈希值不在这些值里面,而在某两个tx哈希值之间,那么按照Merkle proof的路径计算这两个tx的哈希值,一直算到root hash,看是否被篡改,如果没有被篡改,则证明待证明tx不在该轻节点中。

比特币中没有用到sorted Merkle tree,这是因为比特币中不需要proof of non-membership。

3.哈希指针的问题

只要是该数据结构不存在环,那么就可以使用哈希指针,如果存在环,就会存在循环依赖的问题。
在这里插入图片描述

http://www.lryc.cn/news/3182.html

相关文章:

  • BiseNet v1论文及其代码详解
  • (超详细)Navicat的安装和激活,亲测有效
  • JDY-31蓝牙模块使用指南
  • 【2023】华为OD机试真题Java-题目0211-租车骑绿道
  • leetcode: 3Sum
  • 【Python学习笔记】26.Python3 输入和输出(2)
  • vue项目第二天
  • Python爬虫零基础到进阶(课程说明)
  • 《C++ Primer Plus》第16章:string类和标准模板库(13)
  • 材质笔记 - Simluate Solid Surface
  • 设计模式-值类型与引用类型、深拷贝与浅拷贝、原型模式详解
  • ssm高校功能教室预约系统java idea maven
  • C语言学习笔记-强制类型转换
  • docker数据卷插件
  • 第二章-线程(3)
  • C++学习记录——칠 类和对象(4)
  • Python-项目实战--飞机大战-碰撞检测(8)
  • T06 成绩排序
  • 【机器学习】Linear and Nonlinear Regression 线性/非线性回归讲解
  • PyQt5数据库开发1 4.1 SQL Server 2008 R2如何开启数据库的远程连接
  • javassm高校学生评教系统的设计与实现idea msyql
  • 为什么神经网络做不了2次函数拟合,网上的都是骗人的吗?
  • 【Java】Help notes about JAVA
  • 2023北京老博会,北京养老展,第十届中国国际老年产业博览会
  • C++展开模板参数包、函数参数包-(lambda+折叠表达式)
  • 【Spark分布式内存计算框架——Spark Core】7. RDD Checkpoint、外部数据源
  • Connext DDSQoS参考
  • 【正则表达式】获取html代码文本内所有<script>标签内容
  • 有 9 种springMVC常用注解高频使用,来了解下?
  • 【ES6】掌握Promise和利用Promise封装ajax