一文入门区块链相关知识

区块链是由包含交易信息的区块从后向前有序链接起来的数据结构。它可以被存储为flat file(⼀种包含没有相对关系记录的
⽂件),或是存储在⼀个简单数据库中。⽐特币核⼼客⼾端使⽤Google的LevelDB数据库存储区块链元数据。区块被从后向
前有序地链接在这个链条⾥,每个区块都指向前⼀个区块。区块链经常被视为⼀个垂直的栈,第⼀个区块作为栈底的⾸区
块,随后每个区块都被放置在其他区块之上。⽤栈来形象化表⽰区块依次堆叠这⼀概念后,我们便可以使⽤⼀些术语,例
如:“⾼度”来表⽰区块与⾸区块之间的距离;以及“顶部”或“顶端”来表⽰最新添加的区块。


对每个区块头进⾏SHA256加密哈希,可⽣成⼀个哈希值。通过这个哈希值,可以识别出区块链中的对应区块。同时,每⼀
个区块都可以通过其区块头的“⽗区块哈希值”字段引⽤前⼀区块(⽗区块)。也就是说,每个区块头都包含它的⽗区块哈希
值。这样把每个区块链接到各⾃⽗区块的哈希值序列就创建了⼀条⼀直可以追溯到第⼀个区块(创世区块)的链条。


虽然每个区块只有⼀个⽗区块,但可以暂时拥有多个⼦区块。每个⼦区块都将同⼀区块作为其⽗区块,并且在“⽗区块哈希
值”字段中具有相同的(⽗区块)哈希值。⼀个区块出现多个⼦区块的情况被称为“区块链分叉”。区块链分叉只是暂时状态,
只有当多个不同区块⼏乎同时被不同的矿⼯发现时才会发⽣。最终,只有⼀个⼦区块会成为区块链的⼀部分,同时解决了“区块链分叉”的问题。尽管⼀个区块可能会有不⽌⼀个⼦区块,但每⼀区块只有⼀个⽗区块,这是因为⼀个区块只有⼀个“⽗区块哈希值”字段可以指向它的唯⼀⽗区块。


由于区块头⾥⾯包含“⽗区块哈希值”字段,所以当前区块的哈希值因此也受到该字段的影响。如果⽗区块的⾝份标识发⽣变
化,⼦区块的⾝份标识也会跟着变化。当⽗区块有任何改动时,⽗区块的哈希值也发⽣变化。⽗区块的哈希值发⽣改变将迫
使⼦区块的“⽗区块哈希值”字段发⽣改变,从⽽⼜将导致⼦区块的哈希值发⽣改变。⽽⼦区块的哈希值发⽣改变⼜将迫使孙
区块的“⽗区块哈希值”字段发⽣改变,⼜因此改变了孙区块哈希值,等等以此类推。⼀旦⼀个区块有很多代以后,这种瀑布
效应将保证该区块不会被改变,除⾮强制重新计算该区块所有后续的区块。正是因为这样的重新计算需要耗费巨⼤的计算
量,所以⼀个⻓区块链的存在可以让区块链的历史不可改变,这也是⽐特币安全性的⼀个关键特征。


你可以把区块链想象成地质构造中的地质层或者是冰川岩芯样品。表层可能会随着季节⽽变化,甚⾄在沉积之前就被⻛吹⾛
了。但是越往深处,地质层就变得越稳定。到了⼏百英尺深的地⽅,你看到的将是保存了数百万年但依然保持历史原状的岩
层。在区块链⾥,最近的⼏个区块可能会由于区块链分叉所引发的重新计算⽽被修改。最新的六个区块就像⼏英⼨深的表⼟
层。但是,超过这六块后,区块在区块链中的位置越深,被改变的可能性就越⼩。在100个区块以后,区块链已经⾜够稳
定,这时Coinbase交易(包含新挖出的⽐特币的交易)可以被⽀付。⼏千个区块(⼀个⽉)后的区块链将变成确定的历史,
永远不会改变。

区块结构

区块是⼀种被包含在公开账簿(区块链)⾥的聚合了交易信息的容器数据结构。它由⼀个包含元数据的区块头和紧跟其后的
构成区块主体的⼀⻓串交易组成。区块头是80字节,⽽平均每个交易⾄少是250字节,⽽且平均每个区块⾄少包含超过500
个交易。因此,⼀个包含所有交易的完整区块⽐区块头的1000倍还要⼤。

 区块头

区块头由三组区块元数据组成。⾸先是⼀组引⽤⽗区块哈希值的数据,这组元数据⽤于将该区块与区块链中前⼀区块相连
接。第⼆组元数据,即难度、时间戳和nonce,与挖矿竞争相关。第三组元数据是merkle树根(⼀种⽤来有效地总结区块中所有交易的数据结构)

区块标识符:区块头哈希值和区块⾼度 

区块主标识符是它的加密哈希值,⼀个通过SHA256算法对区块头进⾏⼆次哈希计算⽽得到的数字指纹。产⽣的32字节哈希
值被称为区块哈希值,但是更准确的名称是:区块头哈希值,因为只有区块头被⽤于计算。

如:000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f是第⼀个⽐特币区块的区块哈希值。区
块哈希值可以唯⼀、明确地标识⼀个区块,并且任何节点通过简单地对区块头进⾏哈希计算都可以独⽴地获取该区块哈希
值。


请注意,区块哈希值实际上并不包含在区块的数据结构⾥,不管是该区块在⽹络上传输时,抑或是它作为区块链的⼀部分被
存储在某节点的永久性存储设备上时。相反,区块哈希值是当该区块从⽹络被接收时由每个节点计算出来的。区块的哈希值
可能会作为区块元数据的⼀部分被存储在⼀个独⽴的数据库表中,以便于索引和更快地从磁盘检索区块。


第⼆种识别区块的⽅式是通过该区块在区块链中的位置,即“区块⾼度(block height)”。第⼀个区块,其区块⾼度为0,和
之前哈希值000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f所引⽤的区块为同⼀个区块。
因此,区块可以通过两种⽅式被识别:区块哈希值或者区块⾼度。每⼀个随后被存储在第⼀个区块之上的区块在区块链中都
⽐前⼀区块“⾼”出⼀个位置,就像箱⼦⼀个接⼀个堆叠在其他箱⼦之上。2014年1⽉1⽇的区块⾼度⼤约是278,000,说明已
经有278,000个区块被堆叠在2009年1⽉创建的第⼀个区块之上。


和区块哈希值不同的是,区块⾼度并不是唯⼀的标识符。虽然⼀个单⼀的区块总是会有⼀个明确的、固定的区块⾼度,但反
过来却并不成⽴,⼀个区块⾼度并不总是识别⼀个单⼀的区块。两个或两个以上的区块可能有相同的区块⾼度,在区块链⾥
争夺同⼀位置。区块⾼度也不是区块数据结构的⼀部分,它并不被存储在区块⾥。当节点接收来⾃⽐特币⽹络的区块时,会动态地识别该区块在区块链⾥的位置(区块⾼度)。区块⾼度也可作为
元数据存储在⼀个索引数据库表中以便快速检索。

发布了430 篇原创文章 · 获赞 266 · 访问量 56万+

猜你喜欢

转载自blog.csdn.net/qq_32146369/article/details/105225188