1. 关于区块
区块
区块由区块头和区块体两部分组成。其中区块的大小被限制在1M以内(为了防止资源浪费和DOS攻击),区块头的大小被固定为80个字节。
但目前随机比特币的发展,交易数量持续增加,1M的大小能存储的交易数量有限,导致大量的交易积压。因此目前正在考虑扩容方案。
区块头
区块头中记录了版本号、上一个区块的Hash地址、merkle根、区块创建时间戳、区块的工作量难度目标以及用于计算目标的参数值。
字段大小描述
version4字节版本号,用于跟踪软件/协议的更新
prevBlockHash32字节上一个区块头的Hash地址
merkleRoot32字节该区块中交易的merkle树根的哈希值(稍后详细说明)
time4字节该区块的创建时间戳
difficultyTarget4字节该区块链工作量证明难度目标(稍后讲解工作量证明)
nonce4字节用于证明工作量的计算参数
区块体
区块体中记录了该区块存储的交易数量以及交易数据。
字段大小描述
numTransactionsBytes1字节交易数量占用的字节数
numTransactions0-8个字节区块内存储的交易数量
transactions不确定区块内存的多个交易数据
为了节约区块的存储空间,区块内的交易数量字段采用了压缩存储。在读取交易数量之前,会先读取numTransactionsBytes字段值。
如果该值小于253,则用直接将该值作为交易数量
如果该值等于253,则读取之后的两个字节作为交易数量
如果该值等于254,则读取之后的4个字节作为交易数量
否则,读取之后的8个字节作为交易数量
理解:
1. 区块中最有价值的是交易信息(区块体),而区块头类似于标签/评注,包含版本、上个区块头哈希值、本区块默克尔根哈希值、区块创建时间戳、区块的工作量难度目标以及用于计算目标的参数值。而交易信息通过随机散列构建成默克尔哈希值,如下图
2. 关于区块大小容量的问题。1)创立之初,在数据打包的过程中,会导致普通计算机 CPU 超负荷计算,加之当时的比特币价格很低,长此以往,不利于更多矿工的加入,导致算力中心化。2)防止黑客攻击,区块太多,计算时间过长,会给黑客足够的时间
比特币的矛盾——安全性、可靠、保证足够多的节点VS高效,能让更多人更快速的使用之间的平衡