从Java角度看区块链实践系列4:从区块结构的“链”结构结构以及Merkle树,什么是软硬分叉?
之前我们介绍了P2P网络结构,了解到在区块网络间节点如何建立连接、如何通讯,这一节,再来说一下“链”的概念,如何从一个一个的区块组成“区块链”。区块结构区块是一种被包含在公开账簿(区块链)里的聚合了交易信息的容器数据结构。比特币每10分钟产生一个区块,最初单个区块大小限制在1M,随后引入了“隔离见证”,区块体积也随之扩大。区块的结构有一下几部分组成:字段大小(bytes)...
之前我们介绍了P2P网络结构,了解到在区块网络间节点如何建立连接、如何通讯,这一节,再来说一下“链”的概念,如何从一个一个的区块组成“区块链”。
区块结构
区块是一种被包含在公开账簿(区块链)里的聚合了交易信息的容器数据结构。比特币每10分钟产生一个区块,最初单个区块大小限制在1M,随后引入了“隔离见证”,区块体积也随之扩大。
区块的结构有一下几部分组成:
字段 | 大小(bytes) | 描述 |
Block Size | 4 | 区块大小 |
Block Header | 80 | 区块头 |
Transaction counter | 1-9 | 交易计数器 |
Transactions | 不确定 | 记录在区块里的交易信息,使用原生的交易信息格式 |
区块头
字段 | 大小(bytes) | 描述 |
Version | 4 | 版本号 |
Previous Block Hash | 32 | 前一个(父)区块的哈希引用 |
Merkle Root | 32 | 块的Merkle根哈希 |
Timestamp | 4 | 时间戳 |
Difficulty Target | 4 | 挖矿的目标难度 |
Nonce | 4 | 满足目标难度的随机值 |
除此之外,区块哈希和区块高度都是区块的唯一标识。我们将区块链第一个创建出来的区块称为“创世区块”,区块链里第一个区块于2009年被创建。
区块的哈希是通过对区块头进行SHA256哈希的结果。
区块连接成“链”
区块由远至近的有序的连接在一起,每一个区块都指向前一个区块,形成一个“链条”,这样的链条我们就称为“区块链”。区块链有点类似于“栈”结构,第一个区块在栈底,随后每个新增的区块都被放置到前一个区块的上面。每个区块只能拥有一个父区块,但可以拥有多个子区块,一个区块拥有多个子区块的现象被称为“区块链分叉”,区块链分叉只是短暂的状态。比特币遵循最长链原则,意指当发生分叉时,最终拥有子孙代区块最多的链获胜,成为主链,其他的链最终将被废弃。
比特币通过Google的LevelDB存储区块数据。
由于区块哈希通过区块头进行SHA256运算,区块头中包含了父区块哈希的引用,这种“瀑布效应”保证了区块不会发生改变,除非强制修改此后的所有区块。
Merkle树
区块链中的每个区块都包含了产生于该区块的所有交易,且以Merkle树表示。Merkle是一种哈希二叉树,它是一种用作快速归纳和校验大规模数据完整性的数据结构。
Merkle树是自底向上构建的。首先对块进行SHA256计算,得到区块Hash,然后相邻两个区块的哈希值串联在一起,进行双哈希运算(double-SHA256)成父哈希节点,以此类推,直至最后生成唯一的一个根节点,这个节点就称为“Merkle根”。
例如:HA 是哈希后 SHA256(SHA256(Transaction A))的结果,然后HAB是SHA256(SHA256(HA + HB)),以此类推得到Merkle根。
同时,Merkle是二叉树结构的,所以节点数必须为偶数,如果是奇数,最后一个叶子节点则会复制一份,进行哈希运算。
Merkle树的时间复杂度与二叉树一致为 O(log n) ,其中n = 2^k是所有的区块数,k是最多需要哈希的次数。
SPV和Merkle树
现在我们可以回到上节课,所说的SPV轻节点怎么验证交易的问题上。
SPV节点与对等节点建立Bloom过滤器后,对等节点会将符合Bloom过滤器的交易以MerkleBlock消息的形式响应给SPV节点,MerkleBlock消息包含了区块头和一条目标交易与Merkle根的Merkle路径。
随后,SPV节点可以使用该路径快速的找到与该交易相关的区块,进而验证对应区块中是否存在该交易。SPV只接收了Merkle路径,相比于完整的区块数据少了一千多倍。
科普扫盲——什么是区块链软分叉、硬分叉?
区块链升级时如果不向前兼容(仅向后兼容)则是硬分叉,此时就会产生新的分支币,著名的以太坊The DAO事件(涉及DAO合约攻击在后续合约审核部分详细介绍)以太坊分叉成两条链,一条原链ETC,另外一条ETH。而软分叉则指升级投票时需所有区块一致同意,此时会向前兼容,同时也向后兼容,一般像性能升级,都会是软分叉。
软分叉是指区块链网络系统版本升级或协议进行升级,升级后向前兼容,新老节点还在同一条链上工作。
比特币硬分叉事件:
北京时间2018年11月16日凌晨0点40分,BCH进行一场备受瞩目的硬分叉,数字货币史上第一次算力战打响。这场算力对决的双方,一方是自称是“中本聪”的Craig Wright和他背后的赌博业巨富Calvin Ayre支持的nChain开发团队,另一方是Bitcoin ABC开发团队,以及背后的支持者比特大陆创始人吴忌寒和“比特币耶稣”Roger Ver。由于双方未能就如何最好地发展BCH及部署更新代码达成一致,最终走向硬分叉,BCH分裂为BCH ABC和BCH SV两个阵营,并约定用算力战定生死。BCH是于2017年8月由比特币硬分叉得来,时隔一年之后再次迎来分裂,并且这次是在没有重放保护的前提下,通过算力竞争互相搏杀。作为市值第四大的数字货币,BCH算力战引起了行业的广泛关注,并波及到比特币和整个数字货币市场,对未来的社区治理模式带来了深远影响。
BCH算力战从16日开始,到11月23日SV方认输放弃争夺冠名权,持续一周有余。自此,算力战正式结束,BCH分叉为BCH原链和BSV链,BSV诞生。
总结
这一片为大家讲解了一下,所谓“区块链”的结构,区块以栈的形式由远到近组成“链”,随后又讲解了Merkle树结构,主要为下一篇Merkle树实战打下理念基础,下一篇我将为大家实战Java实现Merkle树。
由于工作原因,文章会不定期更新,请见谅!同时,文章有不足之处,欢迎指教~不胜感激!
参考文献:
更多推荐
所有评论(0)