区块链是数据保存的一种方式,借由密码学的思想来保证数据难以被篡改。

区块链每一块的基本数据包括 索引时间戳哈希值上一区块的哈希值当前区块数据值几个基本字段,当然可以在此基础上添加其他所需字段来存储更多必要的数据。

区块链可以借鉴链表的思路,可以简单将区块链理解为通过对数据值进行加密,将加密值作为自己的指纹,并成为下一条数据的头结点。对于创世区块(即第一个区块)其头结点为空。

每个区块的连结方式,是通过hash来连结的,新增的区块要加入区块链,必须要将pre_hash值存储为上一块区块的hash值,并且下一块区块的pre_hash值存储当前区块的hash值,才能保证该区块是保存在区块链上的,否则只是一个独立的区块(这里暂不提分叉概念)。

示意图

这种场景下,任何数据已经写入完成,并且不能修改,如果数据修改,必然会导致数据指纹发生变化,继而出现无法查找到到下一个区块数据的情况。就好比链表这中在头指针找不到的情况下,后面的数据就成了僵尸数据,无法处理也无法被利用。

以上为理解区块链的简单说明,以下是简单的代码实现。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47

#! /usr/bin/python
# encoding=utf8

import hashlib, time

'''
区块链的基本实现
'''
class Chain:
def __init__(self, index, timestramp, pre_hash, data):
self.index = index # 区块索引值
self.timestramp = timestramp # 区块时间戳
self.pre_hash = pre_hash # 区块头结点
self.data = data # 区块数据
self.hash = self.hash_block() # 区块的数据指纹

def hash_block(self): # 区块的数据指纹,用sha256算法示意
string = str(self.index) + str(self.timestramp) + str(self.data) + str(self.pre_hash) # 通过区块中部分的数据,计算出区块数据指纹。要保证部分的数据与其他区块数据值完全不同。
sha = hashlib.sha256()
sha.update(string.encode("utf-8"))
return sha.hexdigest()

'''
第一个区块生成
'''
def create_gene_block():
return Chain(0, time.time(), '00000000', 'First_Block')

'''
其他区块生成
'''
def create_block(pre_block):
return Chain(pre_block.index + 1, time.time(), pre_block.hash, 'line_block')


pre_block = create_gene_block()
nums = 99 # 假定需要生成99个区块
print(str(pre_block.index) + "---" + str(pre_block.timestramp) + "---" + str(pre_block.data) + "---hash:" + pre_block.hash) # 打印第一个区块的数据

'''
创建剩余的98个区块并做关联
'''
for i in range(nums):
add_block = create_block(pre_block)
pre_block = add_block
print(str(pre_block.index) + "---" + str(pre_block.timestramp) + "---" + str(pre_block.data) + "---pre_hash:" + pre_block.pre_hash + "---hash:" +pre_block.hash)

程序运行结果如下

运行结果