简介
区块链是由包含交易信息的区块从后向前有序链接起来的数据结构。比特币核心采用Google的LevelDB数据库存储区块数据。
对每个区块头进行SHA256加密哈希,可以生成一个哈希值,通过这个哈希值可以识别出不同区块。同时,区块中包含上一个区块(父级区块)的哈希值,可以通过父级区块的哈希值找到父级区块,以此类推,形成一个链状的数据结构。
虽然没个区块只有一个父区块,但可以暂时拥有多个子区块,这就是“区块分叉”。区块分叉只是暂时的,最终只有一个子区块会成为区块链的一部分。
由于区块头里包含父级区块的哈希值,所以当前区块的哈希值也受到父区块哈希值的影响。如果父区块发生变化,自区块的哈希值也会变化,以此类推,一旦一个区块发生变化,整个区块链的数据都会发生变化,而改变这个区块链的数据需要耗费巨大的计算量,所以区块链越长,越安全。
区块结构
一个区块由区块大小(4字节),区块头(80字节),交易计数器(1-9,可变整数),交易(可变的)构成。一个正常区块中包含的交易通常超过500个,每个交易的大小至少是250个字节,所以区块内容还是比较大的。
区块头
区块头有6个字段,分别是版本号,父区块哈希值,Merkle树根节点,时间戳,难度目标,nonce。父区块的哈希值指向了父级区块,用于连接区块。难度,时间戳,nonce用于挖矿。Merkle树根用于记录交易数据。
image.png
区块标识符:区块头哈希值和区块高度
区块头哈希值是通过对哈希头进行SHA256算法进行二次哈希计算得到的数字指纹,大小为32字节。区块头哈希并没有存储在区块中,而是临时计算出来的。也有可能存储在另外一张数据表中,用于索引区块。区块的哈希值可以唯一标识一个区块。
第二种识别区块的方式是通过区块在区块链中的位置来识别,即通过“区块高度”识别。创世块的区块高度为0,第二个为1,以此类推。区块的高度不一定能唯一标识一个区块,在挖矿过程中,可能有多个区块处在同一区块高度,后面会解释为什么同一区块高度可能有多个区块存在。
创始区块
创始区块是被写入到比特币客户端里的,以此保证每个人运行比特币客户端都会有相同的创世块,也就保证了创世块不会被改变。这里可以理解成为链表头,一个链表必须知道链表头相同,才能确保不同节点读取的是同一个链表。
区块的连接
区块通过保存父区块哈希值来连接两个区块,以此类推,所有区块都能连接在一起。这个可以理解成常用数据结构链表中的*pre,指向上一个区块的指针。
Merkle树
区块中包含的交易都以Merkle树的方式存储。Merkle是一种哈希二叉树,它的结构是这样的,假设我们有A,B,C,D四笔交易,Merkle树是自底向上构建的,首先计算4笔交易的哈希值HA,HB,HC和HD,再对HA,HB计算哈希HAB,对HC,HD计算哈希HCD,最后对HAB和HCD进行哈希,得到HABCD,最终4笔交易的哈希归纳为一个哈希HABCD,这个哈希就是Merkle树根。这种存储方式能达到2Log2(N)的搜索效率,非常高效。
Merkle树和简单支付验证(SPV)
简单支付验证只保存区块头,通过验证Merkle树的路径(也就是上面提到的ABCD的那些哈希值)来验证交易是否存在于区块中。
网友评论