当前位置 博文首页 > shelgi的博客:简单实现一个区块链

    shelgi的博客:简单实现一个区块链

    作者:[db:作者] 时间:2021-07-28 08:47

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

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

    cs