最近这段时间比特币火的是一塌糊涂, 看看coindesk 比特币这走势图
。感觉自己又错失一次财富自由的机会。也正是由于市场的火爆也开始慢慢关注这个行业。
今天就聊一下比特币的核心基础区块链(blockchain),是中本聪(Nakamoto Satoshi)2008年在比特币白皮书中提出地概念。具体的大家可以Google了解下。这里主要讲下用python代码来辅助理解。
先直接上代码了
|
|
|
|
|
|
先看下每个区块(block)都有哪些基本的属性(attribute),Block init
index, previousHash, timestamp, data, hash。
- index 标志了这个区块(block)在区块链(block chain)里的顺序。
- timestamp 时间戳表明这个区块是何时被创建的。
- data 区块里的记录的信息数据
- hash 这个区块的hash
- previousHash 上一个区块的hash
这里的HASH 主要有两个作用 1作为block的唯一标识 2 进行数据校验
每一个区块都会存储一些信息,对于比特币来讲存的就是交易信息,就是每次交易的记账信息。这里用data 属性标识。
generate_next_block(self, data)
创建一个块,用块(block)里存储的data,index, 上一个块的唯一标识hash,当前时间戳timestamp,来生成一个新块。
说过区块链(block chain)是一条chain,每一个block 通过自身的previous_hash指向他关联的上一个block,这样一个一个的block就链接成为了一条block 链。
对于每一个新block来讲,previous block 就是当前链条的最后一个块(latest_block)
一条block chain里的block都是有序的,index 就是每个block在block chain的位置。
关于每一个block里究竟存了什么data,可以去blockchain查看。例如
#473054 块的信息。
从上图可以看到存储的主要是p2p之间的交易(transactions)
以上信息表明当前区块链长度(或者叫高度更恰当) Height为473054(如果不算创世块的话)
Block Reward 矿工奖励 12.5 个比特币
Timestamp 时间戳 2017-06-27 04:23:43
Previous Block 上一个块hash
Hash 当前块的hash
Number Of Transactions 这个块里记录的交易数 1092
block chain 第一个块叫 创始块(Genesis block)
比特币的创始块信息如下
创始块是被hard code进去的genesis_block
生成的,通过固定参数初始化。
当一个区块产生后,要加在block chain尾部,在加入前要做系列检查 receive_new_block
之前说个每个block 都会有各种各样的hash,作用一个是唯一标识另一个是用来校验。下面具体讲一下校验的原理。主要校验一下三个
index,previous hash, hash
首先确保当前的index合法,has_valid_index
,保证区块链上的block是有序增加的
其次确保has_valid_previous_hash
再次has_valid_hash
保证这个块的合法性,没有丢失被篡改信息。
通过校验后才会加到区块链中self.blockchain_store.append(new_block)
由于区块链是分布式的,每一个节点(node)都存着一条block chain 的备份,如果两个节点发生了冲突。
因为最终只能有一条唯一有效的block chain,区块链的做法是选择那条最长chain, 对于上图的第一个hash为a350235b00的将被废弃,选择hash为 0934ae8caa的block 作为 #72
|
|
每个节点在产生新块(new block)时必须要进行全网广播告知其余的节点,其余节点收到这个信息后,如果这个new block的index 比自己的block chain 上的index都大,这个节点因为担心自己的block chain 可能不是最全的,得先去问问其余节点完整的block chain 是啥,问完后,校验无误加到现有block chain上