BTC中的数据结构

普通指针

普通指针存储的是某个结构体在内存中的地址(假如P是指向一结构体的指针,那么P里面存放的就是该结构体在内存中的起始位置)

Hash pointer(哈希指针)

对于如下的节点,有两个指针指向这个节点(实际上是一个),其中P为该节点的地址,H()为该节点的哈希值,该值与节点中的内容有关。当节点中的内容发生改变,该哈希值也会发生变化,从而保证了区块内容不会被篡改。

主要作用

  1. 存地址
  2. 从哈希值H()这个哈希指针,可以找到该结构体的位置
  3. 同时还能够检测出该结构体的内容有没有被篡改,因为我们保存了它的哈希值

区块链和普通的链表相比有什么区别:

  1. Block chain is a linked list using hash pointers(用哈希指针代替了普通指针)
  • 比特币中最基本的结构就是区块链,区块链就是一个一个区块组成的链表
  • 区块链第一个区块叫作genesis block (创世纪块)最后一个区块是most recent block(最近产生的区块) 每一个区块都包含指向前一个区块的哈希指针,也就是保存有前一个区块的哈希值
  • 哈希指针的结果是通过对前一个区块的所有数据进行哈希运算而得到的。区块链中的每个区块都包含前一个区块的哈希值,以确保区块链的连续性和安全性。如果修改了前一个区块的数据,其哈希值也会发生变化,从而影响到之后的所有区块,这保证了区块链数据的不可篡改性。
  1. 普通链表可以任意修改,区块链不行
  • 比特币没有要保存所有区块的内容,只保留最近的几千个区块。如果要用到以前的区块,可以向系统中其他节点要这个区块。
  • 判断恶意节点,这里要用到哈希值一个性质:

    其他节点给你一个区块,算出它的哈希值,与保留的区块的哈希值对比,即可

Tamper-evident log(防篡改 log/区块链)图示分析

Merkle Tree(默克尔树)

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

(上面两层内部节点都是哈希指针(Hash Pointers),第一层是根节点,根节点的区块也可以取哈希(root hash))。比特币当中各区块之间用哈希指针连接在一起,每个区块所包含的交易组织成一个Merkle Tree的形式,最下层的数据块(data blocks)每个区块是一个交易transaction,每个区块分为两个部分,分别是块头和块身(block header,block body)。块头里面有根哈希值,每个区块所包含的所有交易组成的Merkle Tree的根哈希值存在于区块的块头里面,但是,块头里面没有交易的具体内容,只有一个根哈希值,块身里面是有交易的列表的。

Merkle Tree的优点

  • 知道根哈希值,就能检测出数中任何位置的修改

  • 每个数据块是一个交易

作用(提供merkle proof )

比特币中的节点分为两类

  • fully validating node(全节点,保存整个区块的内容,即块头块身都有,有交易的具体信息)
  • light node(轻节点,例如手机上的比特币钱包)(只有保存块头,只有根哈希值)
    • 用merkle proof向一个轻节点证明某个交易是写入区块链的:找到交易所在的位置(最底行的其中一个区块),这时该区块一直往上到根节点的路径就叫merkle proof。
    • merkle proof可以证明merkle tree里面包含了某个交易,这种证明又叫proof of membership或 proof of inclusion。
    • 对于一个轻节点来说,验证一个merkle proof 复杂度是多少?假设最底层有n个交易,则merkle proof 复杂程度是θ(log(n))

证明merkle tree里面没有包含某个交易?

即proof of non-membership。可以把整棵树传给轻节点,轻节点收到后验证树的构造都是对的,每一层用到的哈希值都是正确的,说明树里只有这些轻节点,要找的交易不在里面,就证明了proof of non-membership,只能一个个节点的验证,所以时间复杂度是线性O(n)。如果将数据节点的哈希值排好序之后,时间复杂度是O(logn)。

一般来说,一般的链表我们都可以改造为使用哈希指针的链表,但当链表中存在环时,哈希指针便不能再使用,会出现循环。

BTC中的数据结构的更多相关文章

  1. java中的数据结构(集合|容器)

    对java中的数据结构做一个小小的个人总结,虽然还没有到研究透彻jdk源码的地步.首先.java中为何需要集合的出现?什么需求导致.我想对于面向对象来说,对象适用于描述任何事物,所以为了方便对于对象的 ...

  2. Python 中的数据结构总结(一)

    Python 中的数据结构 “数据结构”这个词大家肯定都不陌生,高级程序语言有两个核心,一个是算法,另一个就是数据结构.不管是c语言系列中的数组.链表.树和图,还是java中的各种map,随便抽出一个 ...

  3. [转]详细介绍java中的数据结构

    详细介绍java中的数据结构 本文介绍的是java中的数据结构,本文试图通过简单的描述,向读者阐述各个类的作用以及如何正确使用这些类.一起来看本文吧! 也许你已经熟练使用了java.util包里面的各 ...

  4. 详细介绍java中的数据结构

    详细介绍java中的数据结构 http://developer.51cto.com/art/201107/273003.htm 本文介绍的是java中的数据结构,本文试图通过简单的描述,向读者阐述各个 ...

  5. sql点滴42—mysql中的数据结构

    原文:sql点滴42-mysql中的数据结构 MySQL 的数值数据类型可以大致划分为两个类别,一个是整数,另一个是浮点数或小数.许多不同的子类型对这些类别中的每一个都是可用的,每个子类型支持不同大小 ...

  6. PHP中的数据结构

    PHP7以上才能安装和使用数据结构,安装比较简单: 1. 运行命令 pecl install ds 2. 在php.ini中添加 extension=ds.so 3. 重启PHP或重载配置  Coll ...

  7. Python中的数据结构

    Python中的数据结构 这里总结一下Python中的内置数据结构(Built-in Data Structure):列表list.元组tuple.字典dict.集合set,涵盖的仅有部分重点,详细地 ...

  8. 在Object-C中学习数据结构与算法之排序算法

    笔者在学习数据结构与算法时,尝试着将排序算法以动画的形式呈现出来更加方便理解记忆,本文配合Demo 在Object-C中学习数据结构与算法之排序算法阅读更佳. 目录 选择排序 冒泡排序 插入排序 快速 ...

  9. PHP中的数据结构:DS扩展

    PHP7以上才能安装和使用该数据结构扩展,安装比较简单: 1. 运行命令 pecl install ds 2. 在php.ini中添加 extension=ds.so 3. 重启PHP或重载配置 在这 ...

  10. JavaScript中的数据结构及实战系列

    本系列主要是讲解JavaScript中的数据结构及在实际项目中遇到的地方 JavaScript中的数据结构及实战系列(1):队列 JavaScript中的数据结构及实战系列(2):栈

随机推荐

  1. AGC061 F Perfect String

    毒瘤出题人,史诗加强 AGC 的 F-- 然而我连原题都不会,所以只学了原题做法. 翻译一下题意就是给定一张循环网格图,求经过 \((0,0)\) 的闭合回路条数. 由于网格图中每一个位置都等价,所以 ...

  2. PHP前后端交互

    PHP是现如今十分流行的轻量级语言,经常用来做应用的后端开发,其特点是语法简单,十分容易上手.除了单独做后端,PHP还能够将程序嵌入到HTML文件中执行,非常容易实现简单的前后端交互.而且PHP的运行 ...

  3. bean的作用域和@scope注解

    bean的作用域由@scope注解来修改,该注解有五个不同的取值,分别是:singleton.prototype.request.session.global-session. singleton,在 ...

  4. 2021-03-24:给定一个整数组成的无序数组arr,值可能正、可能负、可能0。给定一个整数值K,找到arr的所有子数组里,哪个子数组的累加和等于K,并且是长度最大的。返回其长度。

    2021-03-24:给定一个整数组成的无序数组arr,值可能正.可能负.可能0.给定一个整数值K,找到arr的所有子数组里,哪个子数组的累加和等于K,并且是长度最大的.返回其长度. 福大大 答案20 ...

  5. 2022-03-19:已知一棵二叉树上所有的值都不一样, 给定这棵二叉树的头节点head, 给定一个整型数组arr,arr里放着不同的值,每个值一定在树上 返回数组里所有值的最低公共祖先。

    2022-03-19:已知一棵二叉树上所有的值都不一样, 给定这棵二叉树的头节点head, 给定一个整型数组arr,arr里放着不同的值,每个值一定在树上 返回数组里所有值的最低公共祖先. 答案202 ...

  6. htop 和 bashtop 的一些不足

    htop 和 bashtop 都是 Linux 资源监视器中非常好用的工具,尤其对于展示当前 Linux 操作系统的处理器.内存.硬盘.网络和进程等各项资源的使用情况与状态.但它们都有一个问题,就是当 ...

  7. 没用,随便写的(Dec_8_2022)

    import numpy as np from PIL import Image import pandas as pd import matplotlib.pyplot as plt # 第一个 # ...

  8. 天翼云SD-WAN解决方案直播

    2023年6月16日14点,天翼云SD-WAN解决方案直播火热来袭啦!参与直播即可领取优惠好礼,实惠多多! 点击链接注册参与:https://ctyun.d1meeting.cn/0616/ 直播时间 ...

  9. 【技术积累】Java中的泛型【一】

    泛型是什么 Java中的泛型是一种能够让用户在编写代码时避免使用明确的类型而进行类型参数化的机制.Java中的泛型可以让编程者在代码编写时不必关心具体类型,只用关心类型之间的关系和相互转换,从而在编写 ...

  10. 自然语言处理 Paddle NLP - 文本语义相似度计算(ERNIE-Gram)

    基于预训练模型 ERNIE-Gram 实现语义匹配 1. 背景介绍 文本语义匹配任务,简单来说就是给定两段文本,让模型来判断两段文本是不是语义相似. 在本案例中以权威的语义匹配数据集 LCQMC 为例 ...