使用python简单理解区块链

- 2 mins

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

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

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

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

示意图

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

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


#! /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)

程序运行结果如下

运行结果

rss facebook twitter github gitlab youtube mail spotify lastfm instagram linkedin google google-plus pinterest medium vimeo stackoverflow reddit quora quora