赞
踩
BTC中的区块结构大致如下:
其中,一个完整的区块由块头(block header)和块体(block body组成),下面将对其中的数据结构进行说明。
全节点:保存区块的全部内容,包括header和body,在本地硬盘维护完整的区块链信息。
轻节点:只保存区块的header。
区块链系统中,轻节点的数量要多于全节点,轻节点的使用限制也相对更少。
哈希指针是应用在区块链技术中的一种数据结构。普通的指针储存了一段数据的内存位置,而哈希指针除了储存数据位置之外,还储存了这段数据的哈希值。
区块链即为哈希指针组成的链表(Block chain is a linked list using hash pointers)。每个区块的header都包含指向下一个区块的哈希指针,走到底的区块是系统中产生的第一个区块,叫创世纪块(genesis block),而开头的区块是系统中最近产生的区块(most recent block),最近产生的区块前面没有别的区块,但是也会有一个哈希指针,保存在系统里。由此,哈希指针组成的链表应为无环链表,否则将产生循环依赖。
通过后一个区块的哈希指针,不仅能找到前一个区块,而且能够防止有人篡改数据,具有防篡改日志(tamper-evident log)属性。如果有人妄想修改某个区块的数据,那么它后面的那个区块的哈希指针,不能够和篡改数据后的区块生成的哈希指针匹配。
区块链中轻节点可以不保存整个区块链的内容,需要时可向全节点进行获取,根据防篡改日志属性,轻节点可对获取到内容的正确性进行验证。
实际在网络中,哈希指针只是一种形象的说法,在header中只保存上个区块header的哈希值,并无指针。全节点一般将区块存在key-value数据库中,key保存区块的哈希,value保存区块的内容,只要掌握了最后一个区块的哈希值,即可查找到之前各个区块的数据。
默克尔树是一种哈希二叉树,其叶节点存储的是数据文件,而非叶节点存储的是其子节点的哈希值,只要查看根哈希值,就能检测出树中是否有地方被篡改,效率较高。
其中,交易列表保存于区块的body中,根哈希值则保存在区块的header中。
假设有这样一种场景需要用到数字货币支付,支付完成后本人需要证明这笔交易已经写到区块中,比较容易想到的办法就是拿到打包交易的对应区块,然后对比区块中的所有交易来确认是否已经被打包其中。但是在比特币或者以太坊的场景下,一个区块大概有两三千笔交易,一个交易又包含若干字段,如果逐一比较交易不仅速度慢,而且不安全,因为拿单一的区块无法知道拿到的块的真伪。
merkle proof是一种仅需链中全量header就可以证明交易是否存在(proof of membership)某一区块中的方法。
如图所示,绿色块为轻节点已知的header信息,黄色块为轻节点接收到其它节点发送过来的交易信息和路径中部分哈希值。轻节点可自下而上计算蓝色块中的哈希值,并将最终计算得到的哈希值与header中的跟哈希值比较,以验证交易生否真正存在。这一点也利用了哈希函数collision resistance的特性,其时间复杂度为O(logN)。
优点
使用场景:
轻节点只包含区块头,也就是只有交易树的根哈希值,当需要向轻节点证明一笔交易已经打包到指定区块时,只需要提供这笔交易和对应路径上的哈希值即可,这样轻节点就可以在不保存区块体的情况下证明了这笔交易已经上链不可更改了。
target 就是一个 256-bit 的数,计算 nonce 值的过程就是对区块 header 不断的运算哈希,直至找到能使区块哈希小于 target 的 nonce:
H
(
b
l
o
c
k
h
e
a
d
e
r
)
<
=
t
a
r
g
e
t
H(block header) <= target
H(blockheader)<=target根据nonce计算得到哈希值就去跟 target 对比,如果哈希值大于 target ,更改nonce,再次计算 header 哈希;反之如果哈希小于等于 target,那么运算过程就结束了,当前 nonce 值会被最终记录到 header 中。
哈希值只计算header中的数据即可,由于body中交易列表的根哈希值存于header,可由此验证交易列表是否被篡改。
矿机每秒能做多少次nonce 求解过程为算力的代表,其单位Hash/s,显然算力越大,就有更大的概率率先找到 nonce 值,也就是宏观意义上抢到的记账权。争夺记账权的过程成为挖矿,争夺记账权的节点成为矿工,挖矿使用的计算机成为矿机。
欢迎打赏Σ(っ°Д°;)っ
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。