因为国家领导人的讲话,区块链这个技术变得火热起来,去中心化好像成了潮流。
还是深夜日常睡前刷B站,看看动漫或者科技up主的动态,或者是一些科学的介绍,突然刷到up主落拓一系列关于区块链的视频,听完真的对区块链有了一个了解,所以打算跟着大佬用自己喜欢的语言也实现一个简单的区块链。
视频链接点这里
我觉得即使不是专门研究这方面的,但是对一个很热的话题技术还是得有一定的了解,总之一句话多学点总是没坏处的。
大佬的代码是用js写的,github链接在这里,我用python也来实现一下
#首先导库,导入sha256加密算法
import hashlib
#区块
class Block:
def __init__(self,data,previousHash):
self.data=data
self.previousHash=previousHash
self.hash=self.computeHash()
#计算hash值
def computeHash(self):
return hashlib.sha256((self.data+self.previousHash).encode("utf-8")).hexdigest()
#链
class Chain:
def __init__(self):
self.chain=[self.bigBang()]
#第一个区块
def bigBang(self):
genesisBlock=Block("我是祖先","")
return genesisBlock
#最后的区块
def getLastestBlock(self):
return self.chain[len(self.chain)-1]
#添加区块到区块链上
def addBlockToChain(self,newBlock):
newBlock.previousHash=self.getLastestBlock().hash
newBlock.hash=newBlock.computeHash()
self.chain.append(newBlock)
print("添加新区块成功")
#验证这个当前的区块链是否合法
#当前的数据有没有被篡改
#我们要验证区块的previousHash是否等于previous区块的hash
def validateChain(self):
if(len(self.chain)==1):
if(self.chain[0].hash!=self.chain[0].computeHash()):
return False
return True
else:
# self.chain[1] 是第二个区块
# 我们从第二个区块开始 验证
# 验证到最后一个区块 this.chain.length -1
for i in range(1,len(self.chain)):
blockToValidate=self.chain[i]
#当前的数据有没有被篡改
if(blockToValidate.hash!=blockToValidate.computeHash()):
print("数据篡改")
return False
#我们要验证区块的previousHash是否等于previous区块的hash
previousBlock=self.chain[i-1]
if(blockToValidate.previousHash!=previousBlock.hash):
print("前后区块链接断裂")
return False
else:
return True
#初始化一个区块链
mychain=Chain()
print(mychain.validateChain())
#添加两个新区块
block1=Block("转账十元","")
mychain.addBlockToChain(block1)
block2=Block("转账一百元","")
mychain.addBlockToChain(block2)
print(mychain.validateChain())
#查看区块的数据
print(mychain.chain[0].data,mychain.chain[0].previousHash,mychain.chain[0].hash)
print(mychain.chain[1].data,mychain.chain[1].previousHash,mychain.chain[1].hash)
print(mychain.chain[2].data,mychain.chain[2].previousHash,mychain.chain[2].hash)
#尝试篡改区块链信息
mychain.chain[1].data="转账二元"
mychain.chain[1].hash=mychain.chain[1].computeHash()
print(mychain.chain[1].data)
print(mychain.validateChain())
大佬视频中也说鼓励用自己喜欢的语言去实现一下,所以过几天还打算用正在学的go来写一个试试,大概就这样了,有空再把代码传github。