比特币中的数据结构

1. 哈希指针

普通的指针存储的是某个结构体在内存中的地址,哈希指针除了要存地址还要保存结构体的哈希值。

2. 区块链

区块链就是一个一个的区块组成的链表,区块链和普通的链表的区别在于区块链使用哈希指针。比特币中一个区块主要包含两部分,一个是block header 这里主要包含上一个区块的哈希值、时间戳、挖矿难度、工作量证明随机数、该区块链交易Merkle Tree的根哈希值。下面是一张区块链示意图。

取哈希的时候是将整个区块的header内容放在一起取哈希,每一个区块哈希的取得是将前一个区块header里面的全部内容拼接在一起取哈希得到的,如区块3的哈希是将区块2 header里面的值拼接在一起取哈希得到的。这种数据结构有一个很重要的性质是我们只要保存最后的哈希值就可以检测出对区块链中任何部位的修改。有了这个性质比特币节点中有些节点就不必保存整条区块链的内容。比如一个节点只保存最近的几个节点,如果要用到以前的节点可以从系统中的其它节点来要这个区块。

3. Merkle Tree

比特币系统中的节点分为两类,一类是全节点一类是轻节点,全节点保存整个块,轻节点只保存block header。这样就带来了一个问题,如何证明一个交易被写在了区块里。

上面是一个Merkle Tree示意图。现在假设某一个轻节点要证明黄色的交易存在。轻节点会像某一个全节点发送一个Merkle Proof请求,全节点收到请求后只要把这三个红色的哈希值发送给这个轻节点就可以了。有了这些哈希值轻节点可以计算出图中绿色的哈希值。比如我们对黄色的交易取哈希后让它在与旁边的哈希值合并取哈希,依此类推,这样最后我们就能计算出一个根哈希值,将此哈希值与block header里保存的根哈希值比较一下就可以确定黄色的交易是否存在这颗Merkle Tree里。

原文地址:https://www.cnblogs.com/yishi-san/p/12562073.html

时间: 2024-10-09 05:23:30

比特币中的数据结构的相关文章

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

详细介绍java中的数据结构 本文介绍的是java中的数据结构,本文试图通过简单的描述,向读者阐述各个类的作用以及如何正确使用这些类.一起来看本文吧! 也许你已经熟练使用了java.util包里面的各种数据结构,但是我还是要说一说java版数据结构与算法,希望对你有帮助. 线性表,链表,哈希表是常用的数据结构,在进行Java开发时,JDK已经为我们提供了一系列相应的类来实现基本的数据结构.这些类均在java.util包中.本文试图通过简单的描述,向读者阐述各个类的作用以及如何正确使用这些类. C

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

MySQL 的数值数据类型可以大致划分为两个类别,一个是整数,另一个是浮点数或小数.许多不同的子类型对这些类别中的每一个都是可用的,每个子类型支持不同大小的数据,并且 MySQL 允许我们指定数值字段中的值是否有正负之分或者用零填补. 表列出了各种数值类型以及它们的允许范围和占用的内存空间. 类型 大小 范围(有符号) 范围(无符号) 用途 TINYINT 1 字节 (-128,127) (0,255) 小整数值 SMALLINT 2 字节 (-32 768,32 767) (0,65 535)

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

对java中的数据结构做一个小小的个人总结,虽然还没有到研究透彻jdk源码的地步.首先.java中为何需要集合的出现?什么需求导致.我想对于面向对象来说,对象适用于描述任何事物,所以为了方便对于对象的操作.存储就出现了集合,集合应该是存储对象最常用的一种方式了,相对于数组更灵活,可变长度.同时集合也只能存储对象不能使基本数据类型. 集合框架分为两个派系Collection和Map而每一种集合类型都是基于特定的数据结构,Collection接口继承了Iterable接口所以可以使用Iterable

Java中的数据结构及排序算法

(明天补充) 主要是3种接口:List Set Map List:ArrayList,LinkedList:顺序表ArrayList,链表LinkedList,堆栈和队列可以使用LinkedList模拟 Set:HashSet没有重复记录的集合 Map:HashMap就是哈希表 Collection ├List │├LinkedList │├ArrayList │└Vector │ └Stack └Set Map ├Hashtable ├HashMap └WeakHashMap 数据结构参考链接

python中的数据结构

1.列表 (1)   建立列表 list('python') ['p', 'y', 't', 'h', 'o', 'n'] (2)列表的常用方法: append   在列表末尾添加元素 >>>l=['a','b','c'] >>>l.append('d') >>>l ['a','b','c','d'] count   统计某个元素在列表中出现的次数 >>>['a','a','b','c'].count('a') 2 extend  扩

PHP中的数据结构:DS扩展

PHP7以上才能安装和使用该数据结构扩展,安装比较简单: 1. 运行命令 pecl install ds 2. 在php.ini中添加 extension=ds.so 3. 重启PHP或重载配置  Collection Interface:包含本库中所有数据结构通用功能的基本interface. It guarantees that all structures are traversable, countable, and can be converted to json using json

java中的数据结构[copy]

转自http://developer.51cto.com/art/201107/273003.htm java版数据结构与算法,希望对你有帮助. 线性表,链表,哈希表是常用的数据结构,在进行Java开发时,JDK已经为我们提供了一系列相应的类来实现基本的数据结构.这些类均在java.util包中.本文试图通过简单的描述,向读者阐述各个类的作用以及如何正确使用这些类. Collection ├List │├LinkedList │├ArrayList │└Vector │ └Stack └Set

机器博弈中的数据结构与基本方法(一)-----总结

一.基本概念 博弈分类:单人博弈(华容道).双人博弈(象棋.围棋).多人博弈(麻将.桥牌):完全信息博弈(象棋.围棋).不完全信息博弈(麻将.桥牌.三国杀等). 注:大一曾选修过一门课:博弈论,也在数模班做过一些博弈方面的研究,有一些基础,所以对机器博弈中博弈概念很容易就理解了.但博弈论(Game Theory)是经济学的一个重要分支(虽然我发现我们学校图书馆有关博弈论的书籍主要放在数学类书架,这也是有其原因的),主要研究的是社会两难问题(如经典的囚徒困境问题),通常是非零和博弈(即致力于出现双

JAVA中的数据结构——集合类(序):枚举器、拷贝、集合类的排序

枚举器与数据操作 1)枚举器为我们提供了访问集合的方法,而且解决了访问对象的“数据类型不确定”的难题.这是面向对象“多态”思想的应用.其实是通过抽象不同集合对象的共同代码,将相同的功能代码封装到了枚举器的这个接口里,就可以用一套代码来遍历不同类型的集合. 2)每个集合类(Vector或Hashtable等)都有一个iterator方法,各集合对象可以通过这个方法把遍历本类的控制权交给Iterator接口. 3)Iterator接口提供了boolean hasNext()方法判断是否到了集合的最后