全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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)

以上就是一个区块结构,这里实现的是一个简化版,没有完全对应比特币中的区块。这里的区块包含一个唯一标识符、父节点的哈希值、nonce值和该区块的内容字段。可以看到一个区块的哈希值必须满足一定的条件才是有效的,比如以0000开始。下面对这个区块结构进行初始化。

In [37]:

# 创建一个内容为hello world的内容块

block = Block('Hello World')
block

Out[37]:

Block<Hash: 238a65a101c8829d7fc406eb78a71cfc19ad702b437e2c1be8d9061ddb81e900, Nonce: None>

以上一个区块虽然创建完成,但其哈希值不是有效的。

In [38]:

block.hash_is_valid(block.hash())

Out[38]:

False

改变nonce的值就可以得到一个新的哈希值。

In [39]:

block.hash(1)

Out[39]:

'a6431938ba10270dfcfdf7a2371312446914fedadf79632c2c0adb3b463f4838'

哈希值更新了,但还不是有效的哈希值。为了得到有效哈希值,是一个不断更新nonce值的过程,或者说一个挖矿(mine)过程。下面添加一个mine函数用来得到一个合适的nonce值。

In [78]:

# 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), self.nonce)
 
 
 '''
  新增挖矿函数
 '''
 def mine(self):
  # 初始化nonce为0
  cur_nonce = self.nonce or 0

  # 循环直到生成一个有效的哈希值
  while True:
   the_hash = self.hash(nonce=cur_nonce)
   if self.hash_is_valid(the_hash): # 如果生成的哈希值有效
    self.nonce = cur_nonce   # 保持当前nonce值
    break       # 并退出
   else:
    cur_nonce += 1 # 若当前哈希值无效,更新nonce值,进行加1操作

In [75]:

block = Block('Hello World')

# 挖矿,循环直至找到合适的nonce
block.mine()

# 打印
block

Out[75]:

Block<Hash: 000087359d5264153d624556f0a0c6f25cba06e453975c1c02587862e823911b, Nonce: 64751>

至此,第一个有效的区块生成完成,下面开始定义区块链。

二、定义区块链结构

In [81]:

class BlockChain(object):
 def __init__(self):
  self.head = None # 指向最新的一个区块
  self.blocks = {} # 包含所有区块的一个字典

 '''
  添加区块函数
 '''
 def add_block(self, new_block):
  previous_hash = self.head.hash() if self.head else None
  new_block.previous_hash = previous_hash

  self.blocks[new_block.identifier] = {
   'block': new_block,
   'previous_hash': previous_hash,
   'previous': self.head,
  }
  self.head = new_block

 def __repr__(self):
  num_existing_blocks = len(self.blocks)
  return 'Blockchain<{} Blocks, Head: {}>'.format(
   num_existing_blocks,
   self.head.identifier if self.head else None
  )

定义好区块链结构后,下面就开始初始化一条区块链。

In [82]:

# 初始化
chain = BlockChain()

# 打印
chain

Out[82]:

Blockchain<0 Blocks, Head: None>

In [83]:

# 添加区块
chain.add_block(block)

# 打印
chain

Out[83]:

Blockchain<1 Blocks, Head: 364c0cf963384ca28a2763499a140405>

In [84]:

# 添加更多的区块

for i in range(6):
 new_block = Block(i)
 new_block.mine()
 chain.add_block(new_block)
 
# 打印
chain

Out[84]:

Blockchain<7 Blocks, Head: e7cb24ec7acd42a4aaebe7faee9e0713>

以上就是一个简单区块链,后面还会涉及到区块链的有效性。当区块链中一个区块被改变后,这个区块的哈希就会改变,从而影响到这块区块之后的区块,致使这个区块链不再有效。这些将在后续继续深入。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。


# python  # 区块链  # 区块链开发  # 区块链技术  # 详解python实现简单区块链结构  # python区块及区块链的开发详解  # python简单区块链模拟详解  # Python实现基于POS算法的区块链  # Python实现类似比特币的加密货币区块链的创建与交易实例  # 使用Python从零开始撸一个区块链  # Python从零开始创建区块链  # 用不到50行的Python代码构建最小的区块链  # 如何用用Python制作NFT区块链作品  # 链中  # 挖矿  # 链式  # 的是  # 链结  # 是一个  # 就会  # 会有  # 包含了  # 第一个  # 才是  # 将在  # 不需要  # 一是  # 是由  # 还会  # 是指  # 依赖于  # 它是  # 都很 


相关文章: 如何通过智能用户系统一键生成高效建站方案?  建站之星后台密码遗忘或太弱?如何重置与强化?  上海网站制作网页,上海本地的生活网站有哪些?最好包括生活的各个方面的?  如何用虚拟主机快速搭建网站?详细步骤解析  如何在Golang中使用replace替换模块_指定本地或远程路径  如何确保西部建站助手FTP传输的安全性?  广德云建站网站建设方案与建站流程优化指南  如何零基础开发自助建站系统?完整教程解析  微信小程序 五星评分(包括半颗星评分)实例代码  金*站制作公司有哪些,金华教育集团官网?  东莞市网站制作公司有哪些,东莞找工作用什么网站好?  建站主机功能解析:服务器选择与快速搭建指南  ,在苏州找工作,上哪个网站比较好?  如何通过西部数码建站助手快速创建专业网站?  javascript中的try catch异常捕获机制用法分析  C#如何在一个XML文件中查找并替换文本内容  教程网站设计制作软件,怎么创建自己的一个网站?  定制建站流程解析:需求评估与SEO优化功能开发指南  如何选择服务器才能高效搭建专属网站?  php json中文编码为null的解决办法  制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?  网页制作模板网站推荐,网页设计海报之类的素材哪里好?  建站之星如何实现PC+手机+微信网站五合一建站?  制作表格网站有哪些,线上表格怎么弄?  建站之星展会模版如何一键下载生成?  制作网站的软件下载免费,今日头条开宝箱老是需要下载怎么回事?  在线流程图制作网站手机版,谁能推荐几个好的CG原画资源网站么?  c# 服务器GC和工作站GC的区别和设置  网站制作软件免费下载安装,有哪些免费下载的软件网站?  深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?  宝塔建站无法访问?如何排查配置与端口问题?  如何在香港服务器上快速搭建免备案网站?  建站之星安装后如何自定义网站颜色与字体?  微信小程序制作网站有哪些,微信小程序需要做网站吗?  如何通过虚拟机搭建网站?详细步骤解析  行程制作网站有哪些,第三方机票电子行程单怎么开?  h5在线制作网站电脑版下载,h5网页制作软件?  巅云智能建站系统:可视化拖拽+多端适配+免费模板一键生成  如何高效搭建专业期货交易平台网站?  网站海报制作教学视频教程,有什么免费的高清可商用图片网站,用于海报设计?  企业网站制作公司网页,推荐几家专业的天津网站制作公司?  深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?  ppt制作免费网站有哪些,ppt模板免费下载网站?  如何选择高性价比服务器搭建个人网站?  在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?  自助网站制作软件,个人如何自助建网站?  c# Task.ConfigureAwait(true) 在什么场景下是必须的  如何高效完成自助建站业务培训?  如何快速生成橙子建站落地页链接?  制作销售网站教学视频,销售网站有哪些? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。