简单实现一个区块链

因为国家领导人的讲话,区块链这个技术变得火热起来,去中心化好像成了潮流。

还是深夜日常睡前刷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。

发布了85 篇原创文章 · 获赞 55 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/shelgi/article/details/103525307