https://zhuanlan.zhihu.com/p/42584683
bitcoin区块结构分析
关注他
区块链
区块链是由一个个包含交易数据的区块按照时间顺序链接组成。它可以存储到文件中或者轻量级数据库中,例如:Google的LevelDB或者D. Richard Hipp创建的SQLite。
区块链的结构如下图:
图片来自:Satoshi Nakamoto, "Bitcoin: A Peer-to-Peer Electronic Cash System" https://bitcoin.org/bitcoin.pdf
每个区块中都包含前一个区块的Hash(上图中的Prev Hash),以及本区块的时间戳,从而形成一个按时间顺序排列可以追溯到第一个区块的链式结构。
前一个区块的Hash值是通过对前一个区块的区块头运行SHA256算法计算得出。从上图的结构中可以看出每个区块都包含上一个区块(父区块)的区块头Hash,所以如果要修改已加入区块链中的区块信息,需要把该区块后续的子区块、孙区块的信息都进行修改,这种连锁式的效应导致如果要修改某个区块,也必须重新通过工作量证明(POW)计算该区块后的所有区块,重新计算需要消耗巨大的计算机算力,一般认为一个区块在后面跟了五个区块后,该区块里的交易将是不可逆转的。
区块
区块是一种数据结构,它主要由区块头和交易列表组成。
区块头
交易列表
区块中的交易列表,实际上是区块中交易的Hash列表。类似下面这样:
[
"4d7e38663dbe2a61f2bbf175e02a9eea6f7f9ea6e12411ed51795bfd6a48142c",
"8e189263e983816df24c9f75c1ecd0c0a5012e01832ccaf95cd7d0f496f40500"
]
区块JSON数据分析
通过bitcoin core RPC控制台获取的区块信息如下:
getblock 0000000000000002a6e7c1fc7f26d58bb5d4dd4667c9bc5516fc67ff540e5a6f
{
"hash": "0000000000000002a6e7c1fc7f26d58bb5d4dd4667c9bc5516fc67ff540e5a6f",
"confirmations": 9632,
"size": 994,
"height": 579042,
"version": 536870912,
"versionHex": "20000000",
"merkleroot": "b89e7206aaa8b9a16c70808208a9ff2624ba84f7f4f713826c36a793bc4f1d20",
"tx": [
"4d7e38663dbe2a61f2bbf175e02a9eea6f7f9ea6e12411ed51795bfd6a48142c",
"8e189263e983816df24c9f75c1ecd0c0a5012e01832ccaf95cd7d0f496f40500"
],
"time": 1528576496,
"mediantime": 1528574674,
"nonce": 3519684336,
"bits": "190401da",
"difficulty": 1071787469.797805,
"chainwork": "0000000000000000000000000000000000000000007cb85621cccdbd508b7ac3",
"previousblockhash": "0000000000000003edc68dcdae70d279fc040505b3d3f4d0dcc995a70d8791a1",
"nextblockhash": "00000000000000031ccf028a8a9a1dbdcba4c0c1316b22dac4c0cdaff905c2d0"
}
字段说明
- hash:当前区块Hash
- confirmations:区块链网络确认数
- size:区块大小
- height:区块高度
- version:区块版本
- versionHex:区块版本的16进制表示
- merkleroot:区块中所有交易的merkle根Hash
- tx:交易列表
- time:区块的时间戳
- mediantime:过去11个区块的中值时间
- nonce:32位的任意随机数,挖矿时用于工作量证明算法的一个扰动输入参数
- bits:区块的难度目标
- chainwork:区块链上的总计工作量,它是一个32位的整数,代表了区块链上所有区块的计算工作量,把上例中的
“0000000000000000000000000000000000000000007cb85621cccdbd508b7ac3”转换为十进制表示“1.5077730592060008e+26”,我们可以看到是一个非常巨大的计算工作量
14. previousblockhash:前一个区块的Hash值
15. nextblockhash:下一个区块的Hash值