好书/好文 [学习笔记] 比特币的区块和区块链

aaron67 · 发布于 2019年01月06日 · 239 次阅读
本帖已被设为精华帖!

https://aaron67.cc/2019/01/05/bitcoin-blockchain/

公式显示有点问题,可以去看原文


比特币的交易,会被“整理”到区块中

网络活动不断产生新交易,不断“整理”出新区块来记录“这一段时间内”的交易

为了能彼此关联,每个区块都会记录它的前一个区块是什么,这相当于,区块按先来后到的顺序被“摞”在一起,形成了一条“链”

Imgur

一个区块,可以用高度标识,也可以用哈希标识

随着时间的推移,链不断延长,这条区块链,记录了截至目前为止所有的比特币交易,是比特币网络的总账本

我们说一笔交易被写入账本,就是说这笔交易通过了验证,已经被“整理”进区块,并得到了全网络的认可

这篇文章,介绍比特币的区块和区块链

区块的结构

当你托运行李的时候,航空公司会在你的箱上贴一个标签,记录一些必要的基本信息,方便快速识别

Imgur

用区块存储交易时,也是类似的,代码在block.h#L61,区块结构(序列化后)如下

长度(字节) 描述
4 后面紧跟的区块数据,有多少字节
80 区块头
1~9 VarInt 区块里有多少笔交易
变长 各个交易的数据

区块头就是这个区块的“标签”,代码在block.h#L21,区块头的结构(序列化后)如下

长度(字节) 字段 描述
4 nVersion 版本号,用来跟踪软件或协议的升级
32 hashPrevBlock 前一个区块(父区块)的哈希值
32 hashMerkleRoot 一个哈希值,表示这个区块中全部交易构成的Merkle树的根
4 nTime 区块创建的时间,Unix时间戳格式
4 nBits 难度目标,该区块工作量证明算法的难度目标
4 nNonce 一个用于证明工作量的计数器

你能看到,和交易一样,序列化后的区块结构中,也没有区块哈希的部分

这个哈希标识,可以直接用收到的数据计算出来,并不需要传输,通过下面的过程,计算区块的哈希

  1. 对序列化后的区块头数据,做SHA-256运算,得到S1
  2. S1SHA-256运算,得到区块的哈希

区块看起来会是下面的样子,黄色的部分是区块头

Imgur

关于nBitsnNonce字段的含义,以后的文章中再介绍

Merkle树

Merkle树是一棵二叉树,用于归纳一个区块中的所有交易,代码在merkle.cpp

Merkle树会生成整个交易集合的数字指纹,形如

交易会被放在Merkle树最底层的叶子节点上,如图所示,如果交易的个数是奇数,会复制最后一笔交易补齐,其中

  • $H_A = SHA256(SHA256(Tx\ A))$
  • $H_{AB} = SHA256(SHA256(H_A + H_B))$

$H_A + H_B$的意思拼接$H_A$和$H_B$,如果$H_A = 0123$,$H_B = 4567$,则$H_A + H_B = 01234567$

不管区块中有多少交易,都使用Merkle树结构进行归纳,最顶上的树根Merkle Root的值,会放到区块头的hashMerkleRoot字段中

Merkle树将区块头和区块中的交易关联了起来,如果区块中的交易发生了变化,Merkle树根的值就会变化,从而改变区块头,改变整个区块的哈希标识

使用Merkle树的另一个好处是,它提供了一种校验区块是否存在某笔交易的高效途径

对于下面这棵Merkle树

为了证明交易K在区块中,可以用$H_L$,$H_{IJ}$,$H_{MNOP}$,$H_{ABCDEFGH}$这四个哈希值构造一条“Merkle路径”,只需128字节

任何人都可以用这条路径,验证区块包含交易K

参考

共收到 0 条回复
aaron67 将本帖设为了精华贴 01月06日 19:29
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册