交易的存储形式-Merkle树
节点初步判断有效的交易但是未上链的未被确认的交易在节点本地是以一个树状结构进行存储的,就是我们在区块链中常常看到的Merkle树结构,Merkle树是一种二叉树数据结构,一个父节点有两个子节点,交易是以下图的形式形成的Merkle树,以这种方式可以通过hash快速的检索到区块中的某个交易。而Merkle树的树根值是所有交易的哈希值。
Merkle树结构区块数据结构
为了更好的介绍,挖矿,交易打包等概念我们先来了解一下区块的数据结构。一个区块有以下几部分构成:
区块高度(Height):可以理解为每个区块的ID,通过这个值可以直接的看出,目前的区块个数。创世区块的高度就是0。
父哈希(Prev Block):上一个高度区块的哈希值。
头哈希(Block):每个区块都有一个唯一的哈希值,由上一个区块的头哈希,数据块哈希和随机数生成。
Merkle树的根值(Merkle Root):区块中每一笔交易对应一个哈希,呈树装结构,生成的最终值(根),代表了改区块中的交易。
时间(Time):区块生成的时间
难度:指的是挖出当前区块的难度,是根据一定计算公式算出的一串自然数。这个难度系数根据中本聪的规定,每两周会自动调整一次,以保证每个新区块的产生时间在10分钟左右。
Nonce:随机数,最终算出符合要求哈希的随机数。
区块体:以树状结构存储了区块中的交易。
挖矿是什么意思
在了解了区块的数据结构后,我们来看下我们常说的挖矿指的是什么。
挖矿说的直白些就是在现有的区块链最新区块的基础上,生成一个符合条件的区块,并将其链入区块链,并得到区块奖励的过程。
如何找到新的区块
寻找一个新区块的过程有些像一个暴力破解的过程,其实就是要对我们的区块头进行哈希运算,使得最后算出的哈希值小于难度系数字段。区块头中的各个指标基本上都是固定的,除了随机数,所以挖矿的过程就是不断改变随机数最终得到符合要求的哈希值。
当矿工在埋头挖矿的同时,还在进行全网监听,一是监听新产生的交易,而是监听是否有人已经挖到了新的区块。
若监听到了一笔交易,则对交易进行验证,验证通过的交易会被放在本地的交易池中,并广播给相邻节点,同时更新Merkle树的根值继续进行挖矿。当有一个节点计算出了正确的随机数,则将本地的交易打包放入区块中,交易的第一笔我们称作CoinBase,指的是奖励给矿工挖出新的区块的交易,该笔交易没有输入,只有输出。打包完成后将区块进行广播,其他节点收到区块后需要校验该区块是否有效,有效后更新本地的区块链,并将区块中已经有的交易在本地的交易池中删去,矿工需要确保本地交易池中的区块都是未经确认的,然后将区块广播给临近节点。新区块上的交易获得了初次确认,当有下一个区块连接到这个区块时,交易会得到进一步的确认,在连续得到6个区块的确认后,我们认为这笔交易则是不可逆转的。
区块链分叉又是什么
虽然区块链通过密码学的手段提升了挖矿的难度,缩小了同时产生两个区块的可能性,但是由于网络延迟等因素的限制,还是有可能出现两个节点都找出了一个符合要求的随机数,产生了两个区块,这种时候,区块链一般会保留两个区块,让各位矿工继续在两个链上挖矿,直到有一个链条重新成为最长的链条。
一些常见的问题
1、交易打包的顺序与权重。
在交易打包进入区块的时候矿工本地一定已经有了全网很多交易,那么到底如何确认优先打包哪些区块呢,一般影响权重的因素有以下三个
交易时间
交易UTXO大小
交易手续费
一般交易时间越早,UTXO越大,手续费越高的交易越会被优先打包。
按道理来说,由于Merkle根也是挖矿的一部分,所以在新区块产生前,具体哪些交易会被打包进去已经是确定了的,但是很多矿工为了更快的计算出随机数也会采用更换打包交易从而改变Merkle根值得方式。总的来说,记账节点对哪些交易能够被记录在账本上有很大的自主权。
2、为什么被6个区块确认后就会认定这笔交易是不可逆的
其实中本聪在他的论文中也论述过这一点,总的来说,若一个人想更改这个交易必须追踪到这笔交易产生的区块去更改,那么一般被6个区块确认后,“追赶”的计算量即将是天文数字,所有从经济学的角度来说,尽管有这样的算力这么做也是不划算的。
网友评论