所谓区块链,信息化的族谱而已——简单区块链python代码示例
- 何为区块链?
- 区块的特点:
- 传统的族谱,祖先的区块链
- 链式结构组成
- 起源块(创世区块)
- python区块链代码示例
- 总结
何为区块链?
区块链是一个信息技术领域的术语。从本质上讲,它是一个去中心化的共享数据库,信息会通过点对点传输与加密的形式产生数据块,存储于其中的数据或信息,具有“不可伪造”、“全程留痕”、“可以追溯”、“公开透明”、“集体维护”等特征。
区块的特点:
- data很难篡改,除非控制整个区块链网络50%以上的分布式数据库,才能修改。
- 区块越多,传播越广泛,修改整条链需要的算力CPU/GPU越多。
- 安全的代价,非常冗余。
传统的族谱,祖先的区块链
返回顶部
链式结构组成
【拿历史上最知名的家族——孔家为例,让梨的孔融是孔子20世孙,民国四大家族的孔祥熙是孔子75世孙】
(index)【序号】——相当于族谱中的世代,孔祥熙是孔子75世孙
(timestamp)【时间戳】——相当于生日,1880年9月11日
(hash)【加密信息】——相当于更新后的族谱
(pre-hash)【以前的加密信息】——相当于以前的旧族谱
(Data)【交易数据】——相当于记账或日记信息,比如满月宴请客XX桌、来了XX客人、收了XX礼金……
起源块(创世区块)
起源块,一个王朝的太(高)祖,它是一个特殊的块,没有previous_hash。
【比特币创世区块】记录的信息(Data):“The Times 03/Jan/2009 Chancellor on brink of secondbailout for banks.【2009年1月3日,财政大臣正处于实施第二轮银行紧急援助的边缘。】”
python区块链代码示例
返回顶部
import hashlib # 导入哈希(散列)加密模块
import datetime as dtime # 导入时间模块
class Block: # 定义一个区块类
# index(排行)、timestamp(生日)、data(大胖小子/贴心小棉袄)、previous_hash(相当于祖先信息)以及加密信息摘要
def __init__(self, index, timestamp, data, previous_hash):
self.index = index
self.timestamp = timestamp # 由竞争机制(挖矿、解方程)获得记账权的数据库(节点),来添加时间戳
# data可以是想记录的任意事情(记账、笔记、合同),一旦后面追加了新的区块,就成了新块的previous(历史、经历)一部分
self.data = data
self.previous_hash = previous_hash
self.hash = self.hash_block()
def hash_block(self):
sha = hashlib.sha256() # sha256加密算法接口的一种
# 对索引、时间戳、信息和前一区块的哈希值进行加密
sha.update(f"{self.index}{self.timestamp}{self.data}{self.previous_hash}".encode('utf-8'))
return sha.hexdigest() # 返回16进制的信息摘要
# 第一个块的函数,或者说是起源块(创世区块)。
def create_gensis_block():
return Block(0, dtime.datetime.now(), "1957年,约翰·巴科斯(John Backus)创建了是全世界第一套高阶语言:FORTRAN。", "0")
# 添加后面的区块的函数
# 模拟要添加的信息
data_list = ['1964年,约翰·凯梅尼(John Kemeny)和托马斯·库尔茨(Thomas Kurtz)共同开发了BASIC程序语言。',
'1970年,尼克劳斯·维尔特(Niklaus Wirth)发明了Pascal。',
'1972年,丹尼斯·里奇(Dennis MacAlistair Ritchie)制作带有花括号的C。',
'1983年,比雅尼·斯特劳斯特鲁普(Bjarne Stroustrup)发明了C++。',
'1991年,吉多·范罗苏姆(Guido van Rossum)发明了Python。',
'1995年,布兰登·艾克(Brendan Eich)设计了JavaScript(原名LiveScript)。',
'1996年,詹姆斯·高斯林(James Gosling)发明了Java。']
def next_block(pre_block, n): # 前面块的区块(索引和哈希)作为参数
this_index = pre_block.index + 1 # 前面区块索引+1
this_timestamp = dtime.datetime.now() # 当前时间戳,也可以time.time()
this_data = data_list[n] # 需要记录的相关信息
this_hash = pre_block.hash # 前面块的编码信息
return Block(this_index, this_timestamp, this_data, this_hash)
# 测试代码
pre_block = create_gensis_block() # 创世区块
str_gensis = f"{pre_block.index}---{pre_block.timestamp}---{pre_block.data}---{pre_block.hash}"
print(str_gensis)
nums = len(data_list)
for i in range(nums):
add_block = next_block(pre_block, i) # 增加后续区块
pre_block = add_block
str_add = f"{pre_block.index}---{pre_block.timestamp}---{pre_block.data}---{pre_block.hash}"
print(str_add)
【运行结果】
0---2020-04-29 16:51:55.328838---1957年,约翰·巴科斯(John Backus)创建了是全世界第一套高阶语言:FORTRAN。---eee2a1bc47f2de44f14bdb37a40ae8806b16ac99670bc3bcc9d76c274a79f3a8
1---2020-04-29 16:51:55.329830---1964年,约翰·凯梅尼(John Kemeny)和托马斯·库尔茨(Thomas Kurtz)共同开发了BASIC程序语言。---3b8e76002244de23bd8636111a52c5500ba791a09c7762fb654284ce59557a96
2---2020-04-29 16:51:55.329830---1970年,尼克劳斯·维尔特(Niklaus Wirth)发明了Pascal。---419bd1cfd54544d8b4d2b022cad3619916ecbe9f1ef423e8cfdc9dc9f7e40466
3---2020-04-29 16:51:55.329830---1972年,丹尼斯·里奇(Dennis MacAlistair Ritchie)制作带有花括号的C。---02fc182ed17189db671d516f2327e0803d51f675e0df095fa6a2599647932f13
4---2020-04-29 16:51:55.329830---1983年,比雅尼·斯特劳斯特鲁普(Bjarne Stroustrup)发明了C++。---9f2b6646c68afbebaa98d8dcbfca999ac840e6d4757a2187828b734baea48d3b
5---2020-04-29 16:51:55.329830---1991年,吉多·范罗苏姆(Guido van Rossum)发明了Python。---cb71fe7a95a49adddac762f266b2dbb4a82d381ea14dfcd7aa83fff7020b072a
6---2020-04-29 16:51:55.329830---1995年,布兰登·艾克(Brendan Eich)设计了JavaScript(原名LiveScript)。---236dd1f06440ca95e0f8921f753ef708b1ff3acbbf2520792252fe88068c3e43
7---2020-04-29 16:51:55.329830---1996年,詹姆斯·高斯林(James Gosling)发明了Java。---60538287422bccf76fca17bf78b7fb72a096384acf6137103183f65cf7bb0915
总结
- 区块链难篡改,但信息冗余。
- 区块链的链式结构,和过去的族谱很像。
欢迎关注,敬请点赞!
返回顶部