写了几篇区块链的学习笔记,今天来写写比特币中的区块链。比特币中区块链是由包含交易信息的区块从后向前有序链接起来的数据结构。每个区块从后向前有序地链接在这个链条里,每个区块都指向前一个区块。
区块结构
区块是一种数据结构,存放了多组交易,并且块与块之间相互连接,每个块都指向前一个区块。为了提高性能,一组交易确认打包成块,下面就是区块的结构
区块头中由版本,父区块哈希值,Merkle根,时间戳,难度目标,Nonce。Nonce、难度目标和时间戳会用于挖矿过程。
每个区块通过SHA256算法对区块头进行二次哈希计算而得到一个哈希值叫做区块哈希值,不过只有区块头进行了哈希计算。区块哈希值可以唯一的表示一个区块。还可以用区块高度表示区块,第一个区块高度为0,第二个区块为1,之后的区块依次增加。但区块高度并不能唯一的表示一个区块,若区块链出现分叉就有可能出现两个区块的高度相同。而一个区块中的区块头内储存着它上一个区块的哈希值的引用,而上一个区块的区块头内又有再上一个的区块的哈希值的引用。这样就将各区块组成了区块链。
该区块中的所有交易都是用Merkle树表示的,在区块头中就储存了Merkle树的根。关于Merkle树这个博客讲的是相当详细https://blog.csdn.net/wo541075754/article/details/54632929
有兴趣的可以去看看。
Merkle树,通常也被称作Hash树,树中的节点储存的都是哈希值,叶子节点储存着交易。Merkle树是自底向上构建的。有A,B,C,D四个交易,先将四个交易进行两次哈希运算。
HA = SHA256(SHA256(交易A))
HB = SHA256(SHA256(交易B))
HC = SHA256(SHA256(交易C))
HD = SHA256(SHA256(交易D))
分别得到四个哈希值HA,HB,HC.HD作为叶子节点,子节点A和子节点B的两个32字节的哈希值将被串联成64字节的字符串。子节点C和子节点D串联得到一个64字节的字符串。随后将字符串进行两次哈希来产生父节点的哈希值,
HAB = SHA256(SHA256(HA + HB))
HCD =SHA256(SHA256(HA + HB))
接着再继续相同的操作,将HAB和HCD串联就可以得到Merkle树的根
Merkle树是二叉树,所以它需要偶数个叶子节点。如果仅有奇数个交易,那最后的交易就会被复制一份以构成偶数个叶子节点。有了Merkle树对于SPV节点只需下载区块头,而不需要下载每笔交易和区块。
原创文章,作者:1402239773,如若转载,请注明出处:https://blog.ytso.com/228133.html