什么是区块链
区块链其实就相当于一个去中介化的数据库,是由一串数据块组成的。它的每一个数据块当中都包含了一次网络交易的信息,而这些都是用于验证其信息的有效性和生成下一个区块的。
第一个区块为创世区块,从第二个区块开始每个区块都会记录上一个区块的hash值,这样将所有的区块链接在一起形成区块链
定义区块链的结构
我们可以定义一个区块的结构,包括索引,交易时间,交易数据,当前hash和下一个区块的哈希
import hashlib
import datetime
class BlockChain():
def __init__(self, index, timestamp, data, next_hash):
'''
:param index: 索引
:param timestamp: 交易时间
:param data: 交易数据
:param cur_hash: 当前hash
:param next_hash: 下一个hash
'''
self.index = index
self.timestamp = timestamp
self.data = data
self.next_hash = next_hash
self.cur_hash = self.hash_blockchain()
def hash_blockchain(self):
sha = hashlib.sha256()
sha.update(f"{self.index}{self.timestamp}{self.data}{self.next_hash}".encode('utf8'))
return sha.hexdigest()
创世区块的生成
创世区块是第一个区块,它没有上一个区块,所以我们设置成0
def create_first_block(): #创世区块
return BlockChain(0, datetime.datetime.now(), "我是中国人", '0')
生成后续区块
def create_amount_block(last_block): # 区块链的其他区块
this_index = last_block.index + 1 # 索引加1
this_timestamp = datetime.datetime.now() # 当前时间
this_data = f"我是中国人,我爱中国!"
this_hash = last_block.cur_hash
return BlockChain(this_index, this_timestamp, this_data, this_hash)
生成完成区块链
ddBlockChains = [create_first_block()] # 加入创世区块
header_block = ddBlockChains[0]
print(header_block.index, '-----', header_block.data, '------', header_block.cur_hash, '-----', header_block.next_hash)
# nums = 100
for i in range(10): # 加入10个区块
blcok_chain_add = create_amount_block(header_block)
ddBlockChains.append(blcok_chain_add) # 加入区块
header_block = blcok_chain_add # 循环替换
print(blcok_chain_add.index, '-----', blcok_chain_add.data, '------', blcok_chain_add.cur_hash, '-----', blcok_chain_add.next_hash)
完成代码
import hashlib
import datetime
class BlockChain():
def __init__(self, index, timestamp, data, next_hash):
'''
:param index: 索引
:param timestamp: 交易时间
:param data: 交易数据
:param cur_hash: 当前hash
:param next_hash: 下一个hash
'''
self.index = index
self.timestamp = timestamp
self.data = data
self.next_hash = next_hash
self.cur_hash = self.hash_blockchain()
def hash_blockchain(self):
sha = hashlib.sha256()
sha.update(f"{self.index}{self.timestamp}{self.data}{self.next_hash}".encode('utf8'))
return sha.hexdigest()
def create_first_block(): #创世区块
return BlockChain(0, datetime.datetime.now(), "我是中国人", '0')
def create_amount_block(last_block): # 区块链的其他区块
this_index = last_block.index + 1 # 索引加1
this_timestamp = datetime.datetime.now() # 当前时间
this_data = f"我是中国人,我爱中国!"
this_hash = last_block.cur_hash
return BlockChain(this_index, this_timestamp, this_data, this_hash)
ddBlockChains = [create_first_block()] # 加入创世区块
header_block = ddBlockChains[0]
print(header_block.index, '-----', header_block.data, '------', header_block.cur_hash, '-----', header_block.next_hash)
# nums = 100
for i in range(10): # 加入10个区块
blcok_chain_add = create_amount_block(header_block)
ddBlockChains.append(blcok_chain_add) # 加入区块
header_block = blcok_chain_add # 循环替换
print(blcok_chain_add.index, '-----', blcok_chain_add.data, '------', blcok_chain_add.cur_hash, '-----', blcok_chain_add.next_hash)
总结
了解区块链的结构之后,代码实现起来比较简单,所以没有做过多的概念讲述,本文中默认使用hash256的加密方式,你也可以根据你实际的区块去选择不同的加密方法