您的当前位置:首页正文

Python入门:区块链的详细介绍(图)

2020-11-27 来源:伴沃教育
区块链的基础概念很简单:一个分布式数据库,存储一个不断加长的 list,list 中包含着许多有序的记录。下面这篇文章主要给大家介绍了关于Python学习入门之区块链的相关资料,文中通过示例代码介绍的非常详细,需要的朋友们下面来一起看看吧。

前言

本文将给大家简单介绍关于区块链(BlockChain)的相关知识,并用Python做一简单实现。下面话不多说,来一起看看详细的介绍:

什么是区块链

简单来说,区块链就是把加密数据(区块)按照时间顺序进行叠加(链)生成的永久、不可逆向修改的记录。具体来说,它区块链是由一串使用密码学方法产生的数据块组成的,每一个区块都包含了上一个区块的哈希值(hash),从创始区块(genesis block)开始连接到当前区块,形成块链。每一个区块都确保按照时间顺序在上一个区块之后产生,否则前一个区块的哈希值是未知的。它是比特币的一个重要概念。

特点

区块链有如下特点:

  • 去中心化:区块链不依赖于某个中心节点,而是依赖于分布式的各个节点。

  • 无须信任系统:区块链中基于密码学算法,数据需要网络内其他用户的批准,所以不需要一套第三方中介结构或信任机构背书。

  • 不可篡改和加密安全性:区块链采取单向哈希算法,同时每个新产生的区块严格按照时间线形顺序推进,时间的不可逆性导致任何试图入侵篡改区块链内数据 信息的行为都很容易被追溯,导致被其他节点的排斥,从而可以限制相关不法行为。

  • 以上特点使得区块链在银行、证券市场和金融等诸多领域有着越来越多的应用。

    区块链工作原理

    区块链式一系列加密的数据块。这些区块由一个包含元数据的区块头和紧跟其后的构成区块主体的一长串交易组成。比特币中的区块结构如下:

    区块头

    区块头中包含了与区块链中其它区块中的连接信息、时间戳和nonce等信息,具体如下:

    区块标识符

    区块有两个标示符,一是区块头的哈希值,二是区块高度。区块头的哈希值是通过SHA256算法对区块头进行二次哈希计算而得到的数字。区块哈希值可以唯一、明确地标识一个区块,并且任何节点通过简单地对区块头进行哈希计算都可以独立地获取该区块哈希值。区块高度是指该区块在区块链中的位置。区块高度并不是唯一的标识符。虽然一个单一的区块总是会有一个明确的、固定的区块高度,但反过来却并不成立,一个区块高度并不总是识别一个单一的区块。两个或两个以上的区块可能有相同的区块高度,在区块链里争夺同一位置。

    了解了以上基础后下面开始用Python实现一个简单的区块链。

    区块链的Python实现

    一、定义区块结构

    In [16]:


    # block.py
    
    import hashlib
    import uuid
    
    
    class Block(object):
     def __init__(self, data=None, previous_hash=None):
     self.identifier = uuid.uuid4().hex # 产生唯一标示
     self.nonce = None # nonce值
     self.data = data # 区块内容
     self.previous_hash = previous_hash # 父节点哈希值
     
     def hash(self, nonce=None):
     '''
     计算区块的哈希值
     '''
     message = hashlib.sha256()
     message.update(self.identifier.encode('utf-8'))
     message.update(str(nonce).encode('utf-8'))
     message.update(str(self.data).encode('utf-8'))
     message.update(str(self.previous_hash).encode('utf-8'))
    
     return message.hexdigest()
    
     def hash_is_valid(self, the_hash):
     '''
     校验区块哈希值有否有效
     '''
     return the_hash.startswith('0000')
    
     def __repr__(self):
     return 'Block<Hash: {}, Nonce: {}>'.format(self.hash(), self.nonce)
    显示全文