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

简介

说到区块链,大家不免会想到比特币、加密货币、智能合约、交易、支付,但是这些都是区块链解决的问题,不是其本身,并且这些把理解区块链变得复杂,下面配合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这个字段找到上一个区块的哈希值,把每一个区块都链接到上一个区块上,如下图所示:

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

下面我创建了一个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),并且还需要全网「共识机制」的认可。

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

《块说链语:用Python撸一串区块链》 image.png

    原文作者:heha37
    原文地址: https://www.jianshu.com/p/31fb8b8f09ab
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞