区块和区块链

区块

理解了上面的矿工、POW的内容,理解区块就非常简单了。比特币网络是一个巨大的账本,平均每10分钟诞生了账本的一页,我们就把这写满了交易的一页称为“区块”。

你一定会好奇区块里会包含写什么信息,一般来说,区块包含两个部分组成:

一个部分信息是这个区块的身份信息,也就是区块的身份证。包含了这个区块生产的时间,版本号,包含的随机数,以及区块的大小,前一个和当前区块的hash值等等。这些信息统称为区块头,它证明了这一个区块是正确的,是严格沿着上一个区块往下发展的区块,给下一个区块提供了身份验证的信息。

第二部分的信息,就是这段时间内比特币网络里产生的交易,每一个区块大概可以容纳3000笔交易。而且一定包含了一笔系统转账给区块打包者的交易,也就是比特币的区块奖励。

区块链

每一个区块被打上了时间戳,同时每个区块的都包含了上一个区块的hash值,就可以按照严格的先后顺序,连接起这些区块,这个由许多区块组成的链,我们就叫做区块链。

区块链通过时间戳保证每个区块依次顺序相连。时间戳使区块链上每一个数据都具有了时间标记。简单来说,时间戳证明了区块链上什么时候发生了什么事情,因为只有在该时刻存在这个数据,才能计算出这个Hash值。

每个时间戳都会把前一个时间戳,加入到这个区块的hash值运算中,每一个区块都是在前一个区块数据的基础上生成的,该机制保证了区块链数据的唯一性,保证了区块能够环环相扣,紧密链接。

是不是相当简单呢?

区块的压缩,以及默克尔树概念

了解了区块,我们就能看出,“区块”是交易的容器。每个交易都要放到区块中来。每十分钟就会产生一个区块,一个区块的大小在1MB左右,那么一年整个比特币网络就会产生51G的区块文件!10年限下来,就是510个G!大交易所和结构倒是有这么大的硬盘,可是一台家用电脑就伤不起了!而且数据会不断增长,你家的硬盘一定会先被区块链信息装满,而不是其他有趣的东西。

怎么解决数据量过大的问题呢?

中本聪引入了默克尔树:默克尔树是由一个根节点、中间节点和叶节点组成的,具体结构如下图,像一颗倒立的树。我们会把最开始的数据存储在最下面的叶子节点上,中间的枝干(节点)是它下面的两个子节点内容组合起来的哈希值,最顶端的根节点也是由它的两个子节点内容的哈希值组成。最下层叶子节点中的数据任何一丁点的变动,都会传递到它上门的节点,一直到树根。

最下端叶节点存储的是数据文件,而上层的节点存储的是其子节点的哈希值,这些节点的Hash被称作路径哈希值,可以据路径哈希值确定从一个叶子节点到根节点的路径,叶节点的Hash值是真实数据的Hash值。

Merkle树被应用在了比特币中交易的简单存储上,每笔交易都会生成一个hash值,然后两两hash值组合继,续向上做hash运算,经历了一层层的运算,直到生成唯一的最终hash值,也就是区块头中要保留的Merkle根。利用Merkle树的特性,每一个区块的中的最终Merkle树哈希值是对整条区块链来说独一无二的,这样我们就可以通过他来验证支付了!

对于我们普通用户来说,我们完全可以丢掉整个区块中的交易信息,只保留一个区块头,这样可就节省了好多的内存。网络中也有节点会保存虽有的区块信息,我们就需要向这些节点来验证交易。

因为在区块头中包含了根据交易信息生成的全网唯一的默克尔树哈希值,就已经可以用来验证支付了!我们只要知道我们这笔交易中,将要用于“支付”的那笔交易是否已经在之前的区块里被验证通过,就可以了,别人的事情我们不用操心。

比如验证交易4,我就只需要向全网节点寻求验证,节点就会发送hash12和hash3,我们就可以算出默克尔树根的值,在于自己的保存的默克尔树根进行比较,就可以验证交易4的合法性。

这个方法广泛应用在轻钱包的SPV(简单支付验证)中,不含交易信息的区块头大小仅有80字节,每一年产生的数据也只有4.2MB,十年都不到42MB,还没有我的手机斗地主大。保存所有节点,不是梦想。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180609G1BMH900?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券