区块链的基础(一)

502 阅读3分钟

区块链的组成

区块链的数据结构

普通指针存储的是某个结构体在内存中的地址。假如P是指向一结构体的指针,那么P里面存放的就是该结构体在内存中的起始位置。而哈希指针除了要存地址之外,还要保存该结构体的哈希值H()。好处是:从哈希值这个哈希指针,不仅可以找到该结构体的位置,同时还能够检测出该结构体的内容有没有被篡改,因为我们保存了它的哈希值。

image.png

image.png

区块的组成

每个区块由区块头和区块体组成,比特币中限制了每个区块的大小在1Mb左右

image.png

1. 区块头

区块头由6部分组成

  • 版本
    
  • 父区块的区块头的哈希值
    
  • 时间戳
    
  • 目标难度
    
  • 随机数
    
  • 默克尔树哈希值
    

版本

代表交易版本号,从比特币创建到现在交易版本号从未变过。

父区块的区块头哈希值

由父区块中区块头中所有值哈希运算后得到

时间戳

目标难度

代表挖矿难度。矿工需要计算整个区块头的哈希值,不断调整随机数,以达到 H(block header)<= 目标难度。

随机数

矿工调整随机数以达到目标难度

默克尔树哈希

默克尔树的根哈希值

2.区块体

区块体即默克尔树。默克尔树是哈希二叉树,比特币中的默克尔树采取双哈希值运算,即 H(H(something))。

默尔克树最底层的叶节点是数据块(交易),往上的数据结构都是哈希指针,第一层是根节点

为什么使用默克尔树

1. 提供merkle proof

比特中节点分为两类:全节点(保存整个区块的所有内容 块头块身都会保存), 轻节点(如钱包,只保留区块头信息)

这是存在一个问题,如何向轻节点证明某个交易写进了区块链?

找到交易所在位置,这时该区块一直往上到根节点的路径就叫merkle proof(图中红色箭头)

image.png

如何验证交易是否在区块中?

轻节点会向全节点发出请求证明交易1被包含在这颗merkle tree里面的merkle proof。全节点收到这个请求,只需要将哈希2,哈希34发给轻节点即可。
轻节点收到之后,在本地计算出哈希12,哈希1234。最后将根哈希与block header里的根哈希值进行比较得出交易一是否在merkel tree中。

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

即proof of non-membership。可以把整棵树传给轻节点,轻节点收到后验证树的构造都是对的,每一层用到的哈希值都是正确的,说明树里只有这些叶节点,要找的交易不在里面,就证明了proof of non-membership。问题在于,它的复杂度是线性的θ(n),是比较笨的方法。