本文将简单介绍区块链(BlockChain)并用Python做一简单实现。

什么是区块链

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

特点

区块链有如下特点:

  1. 去中心化:区块链不依赖于某个中心节点,而是依赖于分布式的各个节点。
  2. 无须信任系统:区块链中基于密码学算法,数据需要网络内其他用户的批准,所以不需要一套第三方中介结构或信任机构背书。
  3. 不可篡改和加密安全性:区块链采取单向哈希算法,同时每个新产生的区块严格按照时间线形顺序推进,时间的不可逆性导致任何试图入侵篡改区块链内数据 信息的行为都很容易被追溯,导致被其他节点的排斥,从而可以限制相关不法行为。

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

区块链工作原理

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

区块头

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

区块标识符

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

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

区块链的Python实现

一、定义区块结构

In [16]:

# block.pyimport hashlib
import uuidclass 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.pyimport hashlib
import uuidclass 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为0cur_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(self.head.nonce) if self.head else Nonenew_block.previous_hash = previous_hashself.blocks[new_block.identifier] = {'block': new_block,'previous_hash': previous_hash,'previous': self.head,}self.head = new_blockdef __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>

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

作者:Walker Python爱好者社区专栏作者 授权原创发布,请勿转载,谢谢。
出处:Python之区块链入门

Python之区块链入门,揭秘比特币相关推荐

  1. Python之区块链简单记账本实现

    在上一篇<Python之区块链入门>中讲述了区块链的基础知识,并用Python实现了区块和区块链的结构.在本篇中,将基于上面的内容实现一个简单的记账本功能. 记账本的功能如下: 实现基本的 ...

  2. 干货!区块链入门、进阶、行业专家观点!1000篇好文帮你破解区块链密码!(中篇)...

    随着区块链概念理论的不断成熟以及强劲技术的不断深耕,区块链已经成为投资圈中备受关注的热点,从区块链1.0时代落地数字货币比特币.莱特币等,打开了区块链通向新弯道的高速路口,到区块链2.0时代开始通过智 ...

  3. 区块链需要学习哪些东西_区块链入门需要学哪些知识?

    区块链入门需要学哪些知识? 区块链技术近年来发展迅速,全球范围内都掀起了区块链的热潮. 那么区块链入门需要学哪些知识? 首先学习区块链需要知道区块链与编程语言之间的关系 1.区块链是一种编程思想,使用 ...

  4. 兄弟连区块链入门教程分享区块链POW证明代码实现demo

    区块链入门教程分享区块链POW证明代码实现demo 这里强调一下区块链的协议分层 应用层 合约层 激励机制 共识层 网络层 数据层 上 一篇主要实现了区块链的 数据层,数据层主要使用的技术 ...

  5. hyperledger v1.0.5 区块链入门

    2019独角兽企业重金招聘Python工程师标准>>> hyperledger v1.0.5 区块链入门 本文作者最近在找工作,有意向致电 13113668890 Mr. Neo C ...

  6. python区块链框架_20分钟,我用Python实现区块链架构!

    文章目录区块链到底多神奇 一起动手创建一个极简的区块链 为"瘦小的"区块链"增肥" 添加POW共识算法 开采新的区块测试 零基础Python实现区块链架构视频观 ...

  7. BlockChain:区块链入门课程 -- 区块链应用于能源 POWER LEDGER案例

    BlockChain:区块链入门课程-- 区块链应用于能源 POWER LEDGER案例 Power Ledger:如何启用区块链 概述能源部门的现状,将区块链作为关键推动因素之一. 3.1 欢迎来到 ...

  8. java 区块链开发_Java开发人员的区块链入门

    java 区块链开发 顶级技术专家将区块链列为十大新兴技术之一,它们有潜力在未来十年内改变我们的世界,这值得您花时间学习. 如果您是一名具有Java背景的开发人员,并且想快速了解区块链技术,那么本文将 ...

  9. python和区块链哪个好_10个最流行的Python区块链开源项目

    Python不是主流的区块链底层平台开发语言,但是在DApp 开发.区块链仿真与数据分析.智能合约安全分析等领域,Python 依然是不错的选择.本文介绍了10个最流行的Python区块链项 并提供了 ...

最新文章

  1. Android:如何将Enum放入捆绑包中?
  2. vue小米商城源代码_微信商城信息管理系统(java后台+小程序)
  3. rabbitmq java 应用实例
  4. 查oracle事务超时时间,ORA-24756: 事务处理不存在 分析
  5. JAVA代码实现按列表中元素的时间字段排序
  6. pycharm 更改创建文件默认路径
  7. ACM 2018 Fellow名单公布:李飞飞等多位华人入选,无国内成员
  8. ArrayList list = new ArrayList(20);中的list扩充几次
  9. java图片失真_java 图片合成 解决图片失真问题
  10. cisco ASA
  11. opensaml2.0 java例子_OpenSAML 使用引导 I : 简介——关于OpenSAML你所需知道的一切
  12. Objective-C 继承新的认识以及作用
  13. 友勤2017年1月份Oracle P6软件培训班圆满结束
  14. 【高等数学】第 5 讲 偏导数
  15. python 实现批量抠图
  16. Matlab课后笔记之霍夫变换(Hough Transform)
  17. 微信聊天记录不小心被删了怎么办?看看如何恢复吧!
  18. python通过两点之间的经纬度测算距离
  19. 办理《北京市工作居住证》各项变更须提交材料
  20. 2019年iOS开发者中心证书生成方法以及极光推送证书使用方法!

热门文章

  1. [转]Windows Shell 编程 第十四章【来源:http://blog.csdn.net/wangqiulin123456/article/details/7988010】...
  2. spring配置连接mysqlxml
  3. 批量操作WinRAR实用技巧七招
  4. 零基础入门NLP之搭建中文分词工具
  5. 第一部分:TCL基本知识
  6. 科大星云诗社动态20210216
  7. 科大星云诗社动态20210225
  8. 科大星云诗社动态20210905
  9. 四、“一场跨越时空持续数世纪的对话”
  10. 3DSlicer18:Layouts