块说链语:用Python撸一串区块链

作者: heha37 | 来源:发表于2017-10-10 13:17 被阅读115次

    简介

    说到区块链,大家不免会想到比特币、加密货币、智能合约、交易、支付,但是这些都是区块链解决的问题,不是其本身,并且这些把理解区块链变得复杂,下面配合Python代码理解区块链结构。
    先总结一下区块链的定义,区块链本质上是一个能够保证系统诚实可信的分布式数据库,是由多种技术整合而成,该数据库由使用密码学技术产生的数据区块有序链接而成,每个区块包含一定时间内产生的不可篡改信息。
    下面使用Python语言一步步打造一个简单的区块链原型。

    区块结构

    学习区块链,就要先从区块的结构开始说起,因为价值信息就存在区块中,比如比特币的区块存储的是交易记录。除此以外,区块还含有一些技术信息,来维持区块的结构,抽取其中最关键的5个技术信息,分别是下标(Index),时间戳(Timestamp),前一个区块的哈希值(Previous Hash)和当前区块的哈希值(Current Hash),下面用类来封装这些信息,Python代码如下:

    import hashlibclass Block(object):    
        def __init__(self, index, data, prev_hash, timestamp):         
            self.index = index        
            self.data = data        
            self.prev_hash = prev_hash        
            self.timestamp = timestamp        
            self.cur_hash = self.do_hash(index, data, prev_hash, timestamp)   
        def do_hash(self, *args):        
            sha256 = hashlib.sha256() 
            for arg in args:   
                sha256.update(str(arg).encode('utf-8'))                
            return sha256.hexdigest()
    

    index、timestamp、prev_hash和cur_hash这四个技术信息构成了区块的头部数据,这是一个独立的数据结构;data参数储存价值信息,比如交易记录,也是一个单独的数据结构,但是在这里为了使其简单、便于理解,就混合在一个结构中。
    上面代码的do_hash方法,是用来对区块进行哈希加密的,跟「挖矿」无关,没有解决工作量证明(POW)的问题,计算哈希是区块链中的重要环节。这里把区块里的字段数据关联起来后,使用SHA256算法进行哈希计算,得出当前哈希值cur_hash。

    区块链结构

    区块链本质上就是一个拥有特定结构的数据库,是一个有序且反向链接的列表,在这个列表里,区块按照插入的顺序排列,通过prev_hash这个字段找到上一个区块的哈希值,把每一个区块都链接到上一个区块上,如下图所示:


    下面我创建了一个Manager类,用来封装区块链的一些操作,达到维护区块链结构的目的:

    import datetimeclass 
    Manager(object):       
    """Blockchain manager"""    
        blockchain = []    
        def __init__(self):        
            self.origin_index = 0     
            self.origin_prev_hash = '0'       
            self.origin_data = 'origin block'      
            self.origin_timestamp = datetime.datetime(2016, 4, 1, 0, 0).timestamp()         
            Manager.blockchain.append(self.get_origin_block())
    

    比特币使用LevelDB来存储区块链,为了简化,在上面代码上使用Python的列表(List)把区块链直接存储在内存中。刚刚初始化的时候区块链中没有区块,为了能够不断添加新的区块,我们需要区块链中至少有一个区块,这第一个区块被称为「创始块(Genesis Block)」,下面给出创建「创始块」的方法:

    class Manager(object):    
        ...    
        def get_origin_block(self): 
            return  Block(self.origin_index, self.origin_data, self.origin_prev_hash, self.origin_timestamp)   
        ...
    

    有了「创始块」之后,就可以根据当前最新的区块生成下一个区块,代码如下:

    class Manager(object):    
        ...   
        def get_latest_block(self):       
            return Manager.blockchain[-1]   
        def generate_next_block(self, new_data):      
            prev_block = self.get_latest_block()       
            next_index = prev_block.index + 1       
            next_timestamp = datetime.datetime.now().timestamp()         
            return  Block(next_index, new_data, prev_block.cur_hash, next_timestamp)   
       ...
    

    结论

    以上创建了一个简单的区块链原型,只是一个区块列表,真正的区块链在添加区块的时候需要经历大量的计算,这个过程就是传说中的「工作量证明」(POW,Proof-Of-Work),并且还需要全网「共识机制」的认可。

    想要了解更多区块链相关信息,扫码关注「简思细想」

    image.png

    相关文章

      网友评论

      • 8337ea5e8883:您好,看到您的文章质量非常高,想邀请您成为虫洞社区的首批优质内容签约作者。虫洞社区是专业的区块链技术学习社区。虫洞社区鼓励内容生产者产生高质量内容,并给予合理的回报,也希望能帮助内容消费者获得高质量的区块链内容,并让数字货币投资者获得有价值的投资洞见。同时,虫洞社区已经积累了大量的区块链深度从业者,便于作者建立个人品牌。不知道是否方便加您微信细聊?
      • 割空合月:不错
        heha37:谢谢

      本文标题:块说链语:用Python撸一串区块链

      本文链接:https://www.haomeiwen.com/subject/oclvyxtx.html