交易数据被永久地记录在称为区块的文件中,它们(指区块)可以被看作是城市记录者的记录簿(其中记录了房地产所有权的变化)或者股票交易分类帐的各个独立的页面。随着时间的推移,区块被组织成一个线性序列(也称为区块链),矿工不断地将新的交易打包成新的区块并将这些区块添加到区块链的末端。随着区块在区块链中被埋得越来越深,它们变得越来越难以改变或移除,这就赋予了比特币交易的不可逆转性。
一个区块的区块结构如下所示:
数据项 | 描述 | 大小 |
Magic no(魔法数) | 值总是0xD9B4BEF9 | 4字节 |
Blocksize(区块大小) | 到区块结束的字节长度 | 4字节 |
Blockheader(区块头) | 包含6个数据项 | 80字节 |
Transaction counter(交易数量) | 正整数VI=VarInt | 1-9字节 |
Transactions(交易) | 交易列表(非空) | <Transaction counter>-许多交易 |
每个区块都包括了一个被称为魔法数的常数、区块的大小、区块头、区块所包含的交易数量及部分或所有的近期新交易。在每个区块中,对整个区块链起决定作用的是区块头。
除了其他内容外,每个区块还包含当前时间、部分或所有最近交易的记录,以及对它前一个区块的引用。它还包含一个难以解决的数学难题的答案——每个区块的答案是唯一的。没有得出正确的答案,新的块就不能提交到区块链网络上——“挖矿”的过程本质上是竞争成为下一个找到“解决”当前块的答案的过程。每个区块中的数学问题非常难解,但是一旦找到一个有效的解,区块链网络的其他区块就很容易确认这个解是正确的。对于任何给定的区块都有多个有效的解决方案—只需找到待解决区块的一个解决方案即可。
另外由于每解决一个区块问题都有一份全新的比特币奖励,每个块还包含一个记录,用以记录哪些比特币地址或脚本有资格获得奖励。此条记录称为第一代交易,或coinbase交易,并且始终是每个块中出现的第一条交易记录。每个区块产生的比特币数量从50个开始,每21万个区块(大约4年)减半。
比特币交易由发送方向区块链网络广播,然后由所有试图解决区块的节点收集交易记录,并将它们添加到他们正在解决的区块中。由于附加的交易费用(手续费),矿商有动力将交易纳入他们的区块。
数学问题的难度(即挖矿的难度)由网络自动调整,比如它设置了一个目标是每小时平均解决6个块。每出2016个区块(大约两周的时间),所有比特币客户端都会将实际解决的区块问题数与这个目标进行比较,并根据变化的百分比修改目标。网络达成共识,并自动增加(或减少)生成区块的难度。
由于每个区块都包含对前一个区块的引用,所以所有现存的区块聚集起来可以被称为形成了一条链。然而,链可能会有暂时的分裂——例如,如果两个矿工在同一时间为同一块找到两个不同的有效解决方案,而彼此不知道。点对点网络的设计是为了在短时间内解决这些分裂,结果便是只有一个分支的链存活下来。
客户端接受“最长”链上的区块是有效的。整个区块链的“长度”指的是组合难度最大的那条链,而不是区块数最多的那条。这可以防止有人分叉链和创建大量的低难度块,并被网络接受为“最长的”。
如前面所言,在每个区块中,对整个区块链起决定作用的是区块头。
区块头结构描述:
数据项 | 目的 | 更新时间 | 大小(字节) |
Version(版本) | 区块版本号 | 更新软件后,它指定了一个新的版本号 | 4 |
hashPrevBlock(前一区块的Hash) | 前一区块的256位Hash值 | 新的区块进来时 | 32 |
hashMerkleRoot Merkle(根节点Hash值) | 基于一个区块中所有交易的256位Hash值 | 接受一个交易时 | 32 |
Time(时间戳) | 从1970-01-01 00:00 UTC开始到现在,以秒为单位的当前时间戳 | 每几秒就更新 | 4 |
Bits(当前目标的Hash值) | 压缩格式的当前目标Hash值 | 当挖矿难度调整时 | 4 |
Nonce(随机数) | 从0开始的32位随机数 | 产生Hash时(每次产生Hash随机数时都要增长) | 4 |