区块链(Blockchain) 可简单形象化地可理解为很多分散在世界各地的区块(Block)以”链”(Chain)的形式串连在一起,就犹如一串铁链一样,由很多小铁环串成一条铁链。这就是区块链的形象化概念。
那么,区块链中的区块实际上是什么呢?以下以比特币(BitCoin)区块链中的区块为例:
一、区块(Block)
上述这张简化版的比特币区块链图中有三个区块Block 1, Block 2, Block 3.
每个区块都包含两个部份:
区块头(Block Header)
区块体(Block Body)
1. 区块头(Block Header)
先看看区块头的数据结构
1 2 3 4 5 6 7 8 |
struct header_structure { uint32_t nVersion; // 4 bytes - Version uint8_t hashPrevBlock[32]; // 32 bytes - Previous block header hash uint8_t hashMerkleRoot[32]; // 32 bytes - Merkle root hash uint32_t nTime; // 4 bytes - Timestamp uint32_t nBits; // 4 bytes - Difficulty Target uint32_t nNonce; // 4 bytes Nonce }; |
- 版本号(Version)
- 前一个区块的Hash值
- 能让当前区块与上一个区块形成一个连结,而且能确保区块的顺序及过去区块的准确性;
- 当前区块的Hash值一定比这个Hash值小;
- Merkle Tree Root(Merkle树根节点的Hash值)
- Timestamp 时间戳
- Difficulty Target 困难值:
- 这个困难值每2016个区块会调整一次;
- Nonce 随机数
- 表示当前区块工作量证明PoW演算法进行的随机数;
- 总区块大小固定为80 Bytes
2. 区块体(Block Body)
包含了产生该区块的所有数据,以比特币区块链为例,这里数据即交易记录(Transactions),并以Merkle Tree形式表示;
在比特币区块中,比特币支出和接收交易是一起记录的,整个收支记录包括很多笔记录,而每一笔记录都有自己的索引编号,方便查询。
同时,每笔记录中还包含了生成时间、引用交易的Hash值、交易记录索引编号、比特币支出地址等等的数据。而每一笔收支交易记录都有一个Merkle 节点Hash值,这也是Merkle Tree的一部份,决定了每一个地址都不能够重复交易或被伪造。
以上就是比特币区块链中区块(Block)的结构,那刚才一直说的Merkle Tree 又是怎么一回事呢?
二、Merkle Tree
Merkle Tree是一种用来表示Hash值的数据结构。它的基本结构就是Binary Tree(二元树),每一个非叶子节点(Node),都被标示一个Hash值。由于Merkle Tree的发明人是 Ralph Merkle,当然这就是这个资料结构的名称由来。
他是会把每一笔交易的TxID透过SHA256做加密
HA = SHA256(SHA256(TxA))
HB = SHA256(SHA256(TxB))
HC = SHA256(SHA256(TxC))
HD = SHA256(SHA256(TxD))
Oracle:区块链的关键拼图
网络上有许多文章将区块链中的Oracle 翻译为神谕、预言机,而区块链中的Oracle并不是美国的甲骨文软件公司, 而是指一个能够提供外部的真实数据给区块链的数据库,如果区块链是蝙蝠
如此类推,然后两两连接(Concat)在一起,再进行加密:
HAB = SHA256(SHA256(HA+HB))
HCD = SHA256(SHA256(HC+HD))
直至出现Merkle Tree Root为止:
HABCD = SHA256(SHA256(HAB+HCD))
这样就得出与上图一样的Merkle Tree。
而这里Merkle Tree Root 也就是上面提到的头块头中的 Merkle Tree Root 部份,而下面的部份就是所有的交易记录。
三、创世区块Genesis Block
创世区块Genesis Block 这个名字听起来很像很了不起的样子,实际上就是区块链的第一个区块,结构上与链中其他区块都没差别。
那么区块链中的创世区块、区块、Mrekle Tree的关系是怎样的?
在创建区块链时,首先要建立创世区块Genesis Block,此时,Genesis Block 就会有属于它的Hash值,然后使用演算法运算,得出第一个区块Block #1,那么,Block #1也会有属于它的Hash值,还记得区块头结构中有个叫”前一个区块的记录”(Hash Of Previous Block Header)吗?没错,Block #1 就会把Genesis Block的值放进这个位置,这样,就相当于连结到前一个Block,即创世区块Genesis Block ,如此类推,不断产生的区块都使用这种方式连接起来,这样,就形式大家耳熟能详的区块链Blockchain了。
区块到底能做什么呢?每一个区块,都能用来「记帐」,整个区块链Blockchain 串接起来就是一本完整的帐册,所以说,区块链Blockchain 也叫做Distributed Ledger(分散式帐本)。
慢着,上面一直在说的Hash值又是什么啊?
四、Hash
Hash值比较
在工作量证明PoW时,到底是怎样比较Hash 值的大小?其实就是将Hash值先转换为big integer再比较。
Hash值对区块的影响
- 每个区块的Hash 都是不一样的,可以通过Hash 标识区块;
- 如果区块的内容变了,它的Hash 一定会改变;
Hash的不可修改性
由于区块与Hash 是一一对应的,每个区块的Hash 都是针对”区块头”(Head)计算的。
上面提到,区块头包含很多内容,其中有当前区块体的Hash(注意是”区块体”的Hash,而不是整个区块),还有上一个区块的Hash。这也意味着,如果当前区块的内容变了,或者上一个区块的Hash 变了,一定会引起当前区块的Hash 改变。
这一点对区块链有重大意义。如果有人修改了一个区块,该区块的Hash 就变了。为了让后面的区块还能连到它,该人必须同时修改后面所有的区块,否则被改掉的区块就脱离区块链了。由于Hash 的计算非常耗时,同时修改多个区块几乎不可能发生,除非有人掌握了全网51% 以上的计算能力。
正是通过这种联动机制,区块链保证了自身的可靠性,数据一旦写入,就无法被篡改。这就像历史一样,发生了就是发生了,从此再无法改变。
看到这里,如果还不清楚,可以从这里倒着向上看一次,应该就会很清楚区块到底实际上是怎么一回事了。
区块是区块链中的基本组成部份,每个区块链的数据结构、每个在结构内包含的元素(前一个区块的Hash值、加密运算方式、时间戳、签名等等)都与整个区块、甚至整个区块链息息相关,正因为这种巧妙设计,令到区块链可靠性、不可逆、无法篡改的特性更为突出。而深入地了解区块中各项的组成部份及相互之间的关系,将对接下来学习建立属于自己的区块链及应用,打下良好的基础。
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。
区块链与虚实整合的关键,万物皆可币?
当大家对区块链的认识逐渐甩脱只能用来炒币的印象,开始冷静探讨实际应用之时,我们先来谈谈对于「币」,也就是token 的认知。Token 的用途非常多元: 拥有权的证明 票券(门票、
原创文章,作者:掘金K,如若转载,请注明出处:https://www.20on.com/108377.html