区块链结构分析

区块链

区块链是由一个个包含交易数据的区块按照时间顺序链接组成。它可以存储到文件中或者轻量级数据库中,例如: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)计算该区块后的所有区块,重新计算需要消耗巨大的计算机算力,一般认为一个区块在后面跟了五个区块后,该区块里的交易将是不可逆转的。

区块

区块是一种数据结构,它主要由区块头和交易列表组成。 2

区块头

3

交易列表

区块中的交易列表,实际上是区块中交易的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” } 字段说明 (1) hash:当前区块Hash (2) confirmations:区块链网络确认数 (3) size:区块大小 (4) height:区块高度 (5) version:区块版本 (6) versionHex:区块版本的16进制表示 (7) merkleroot:区块中所有交易的merkle根Hash (8) tx:交易列表 (9) time:区块的时间戳 (10) mediantime:过去11个区块的中值时间 (11) nonce:32位的任意随机数,挖矿时用于工作量证明算法的一个扰动输入参数 (12) bits:区块的难度目标 (13) chainwork:区块链上的总计工作量,它是一个32位的整数,代表了区块链上所有区块的计算工作量,把上例中的 “0000000000000000000000000000000000000000007cb85621cccdbd508b7ac3”转换为十进制表示“1.5077730592060008e+26”,我们可以看到是一个非常巨大的计算工作量 (14) previousblockhash:前一个区块的Hash值 (15) nextblockhash:下一个区块的Hash值

引用

[1] Satoshi Nakamoto, “Bitcoin: A Peer-to-Peer Electronic Cash System” https://bitcoin.org/bitcoin.pdf

感谢分享