北大肖臻《区块链技术与应用》学习笔记

2、 BTC-数据结构

普通指针:

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

哈希指针:

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

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

  1. Block chain is a linked list using hash pointers(用哈希指针代替了普通指针)node

    • 比特币中最基本的结构就是区块链,区块链就是一个一个区块组成的链表
    • 区块链第一个区块叫做genesis block (创世纪块)最后一个区块是most recent block(最近产生的区块) 每个区块都包含指向前一个区块的哈希指针
    • 一个区块的哈希指针怎么算:是把前面整个区块的内容,包括里面的hash pointer ,合在一块儿取哈希值。经过这种结构,能够实现tamper-evident log。若是有人改变了一个区块的内容,后面一个区块的哈希指针就对不上,由于后一个区块哈希指针是根据前一个区块的内容算出来的,因此后一个哈希指针也得改,以此类推,咱们保留的是最后一个哈希值也会变化
  2. 普通链表能够任意修改,区块链不行数据结构

    • 比特币没有要保存全部区块的内容,只保留最近的几千个区块。若是要用到之前的区块,能够向系统中其余节点要这个区块。
    • 判断恶意节点,这里要用到哈希值一个性质:
      其余节点给你一个区块,算出它的哈希值,与保留的区块的哈希值对比,便可

Tamper-evident log(防篡改 log/区块链)图例ide

Merkle tree

(上面三层内部节点都是哈希指针(hash pointers),第一层是根节点,根节点的区块也能够取个哈希,叫根哈希(root hash))。比特币当中各区块之间用哈希指针链接在一块儿,每一个区块所包含的交易组织成一个merkle tree的形式,最下面一行data blocks每一个区块其实是一个交易,每一个区块分为两部分,分别是块头和块身(block header ,block body)。块头里面有根哈希值,每一个区块所包含的全部交易组成的merkle tree的根哈希值存在于区块的块头里面,可是,块头里没有交易的具体内容,只有一个根哈希值,块身里面是有交易的列表的。
Merkle tree和binary tree 区别 用哈希指针代替了普通指针区块链

优势

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

  • 每一个数据块是一个交易blog

做用(提供merkle proof )

比特币中的节点分为两类:ip

  • fully validating node(全节点,保存整个区块的内容,即块头块身都有,有交易的具体信息)内存

  • light node(轻节点,例如手机上的比特币钱包)(只有块头)hash

    • 用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。问题在于,它的复杂度是线性的θ(n),是比较笨的方法。io

Merkle tree图例

相关文章
相关标签/搜索
本站公众号
   欢迎关注本站公众号,获取更多信息