BTC的数据结构

区块链是一个个block所构成的链,或者链表状的数据结构,在比特币中或者区块链中,一个重要的组成部分是哈希指针

指针

在程序运行过程中,需要用到数据。最简单的是直接获取数据,但当数据本身较大,需要占用较大空间时,明显会造成一定麻烦。因此,可以引入指针这一概念。当需要获取数据时,只需要按照指针所给的地址,去对应的位置读取数据即可,这样大大节省了内存空间。
在实际中,为了便于程序移植性等原因,指针实际上存储的是逻辑地址而非物理地址

哈希指针

区块链结构本身为一条链表,节点为区块。而传统链表实现,便是通过指针将各个节点串联起来而称为最终的链。如下便是我们最常见的一个链表:

如下图对于该节点,我们可以看到有两个指针指向这个节点(实际上为一个),其中P为该节点的地址,H()为该节点的哈希值,该值与节点中内容有关。当节点(区块)中内容发生改变,该哈希值也会发生改变,从而保证了区块内容不能被篡改。

区块链使用哈希指针代替普通指针,每个区块根据自己的区块内容生成自己的哈希值,此外,每个区块(除创世纪块)都保存有前一个区块的哈希值。需要注意的是,本区块哈希生成依赖于本区块内容,而本区块内容中又包含有前一个区块的哈希值。从而保证了区块内容不被篡改。如果我们想要破坏区块链完整性。篡改B的内容,而C中保存有B的哈希值,所以C也得进行修改。而同样C后区块也得修改。而用户只需要记住最后一个区块链的哈希地址,就可以检测区块链上内容是否被篡改。
在实际应用中,一整条链可能会被切断分开保存在多个地方。若用户仅仅具有其中一段,当用到前面部分区块数据时,直接问系统中其他节点要即可,当要到之后,仅仅通过计算要到的最后一个哈希值和自己保存哈希值是否一致可以判断所给内容是否确实为区块链上真实的内容。

这样的数据结构一个明显的特点是,改变任意一个区块的内容,都会触发多米诺骨牌效应,都会触发去改变每一个区块的内容。其次,这种数据结构下,计算节点不用去保存所有完整的区块,如果需要某个不存在于自身的区块,可以去向其他的节点请求区块信息,同时可以通过计算哈希值的形式来验证所查询的区块的真实性,因为每个节点都保存了上一个节点的哈希值。

Markle Tree

Markle Tree是比特币系统中又一个重要的数据结构,Markle Tree和Binary Tree很类似,但核心区别还是使用了哈希指针

上图即为一个简单的Markle Tree,其中A、B、C、D为数据块。可见,A和B各有一个哈希值,将其合并放在一个节点中,C和D同样操作,而后,针对得到的两个节点分别取哈希,又可以得到两个新的哈希值,即为图中根节点。实际中,在区块块头中存储的是根节点的哈希值(对其再取一次哈希)。ABCD这几个区块也可以理解为具体的交易区块。

该数据结构的优点在于:只需要记住Root Hash(根哈希值),便可以检测出对树中任何部位的修改。例如,所绘制Markle Tree中节点B发生了改变,则对应的第二层第一个节点中第二个哈希值便也会发生改变,进而根节点中第一个哈希值也会发生改变,从而导致根哈希值也发生了改变。

Markle Tree的实际用途

Markle Tree可以用于提供Markle Proof。关于Markle proof,需要先了解比特币系统中节点。比特币中节点分为轻节点和全节点。全节点保存整个区块的所有内容,而轻节点仅仅保存区块的块头信息。

为什么要分轻节点和全节点?
因为硬件的局限。一个区块大小为1MB,对于移动便携设备来说,如果存储区块的所有内容,则所需空间过大,而这是不现实的。所以轻节点只需要存储区块块头信息,全节点存储区块所有内容即可。

当需要向轻节点证明某条交易是否被写入区块链,便需要用到Markle proof。我们将交易到根节点这一条路径称为Markle proof,全节点将整个Markle proof发送给轻节点(如下图所示),轻节点即可根据其算出根哈希值,和自己保存的对比,从而验证该交易是否被写入区块链。只要沿着该路径,所有哈希值都正确,说明内容没有被修改过。

比如我们要查询黄色的tx交易是否被写到了区块链中(是否被承认),那么就需要向轻节点提供markle pool,其路径就是:黄色tx以及以上的绿色这些部分,轻节点根据markle pool进行哈希计算,只要所有的哈希值都正确,则可以肯定这笔交易。

posted @ 2020-10-14 14:52  real-zhouyc  阅读(362)  评论(0编辑  收藏  举报