基于Python3区块链简单Demo,帮助了解区块链。
---
> ***今年早些时候区块链可谓是火热到不行,不管是技术人员还是非技术人员,都知道这样一项改革性的技术。介绍区块链的文章书籍颇多,但是实践才会让你更好的理解,这篇文章将用Python3来创建一个简单的区块链来演示区块链到底是如何工作的。***
本文将分为四个部分:
- 创建一个基本的区块链
- 实现共识算法(本文采用POW工作量证明)
- 实现交易和挖矿奖励
# 1. 创建基本的区块链
> 区块链简单来说实际上是一个去中心化的由一个个数据区块链接在一起的公共数据库,数据区块在添加到区块链后,是不会再被改变的,这依赖于区块链的共识机制。当然万事都不可能是绝对的,例如在POW下,如果有用全网一半以上的算力,是有可能改变链上的数据的,但是达到这种条件并作出数据改变所带来的利益是赶不上你付出的代价的。
## 1.1 创建一个区块
- ***首先我们创建一个区块类,代表区块链上的每一个区块,新建`Block.py`***
```python
import hashlib
class Block:
def __init__(self, timestamp, data, previous_hash=''):
'''
区块的初始化
:param timestamp: 创建时的时间戳
:param data: 区块数据
:param previous_hash: 上一个区块的hash
:param hash: 区块的hash
'''
self.previous_hash = previous_hash
self.timestamp = timestamp
self.data = data
self.hash = self.calculate_hash()
def calculate_hash(self):
'''
计算区块哈希值
:return:
'''
# 将区块信息拼接然后生成sha256的hash值
raw_str = self.previous_hash + str(self.timestamp) + json.dumps(self.data, ensure_ascii=False)
sha256 = hashlib.sha256()
sha256.update(raw_str.encode('utf-8'))
hash = sha256.hexdigest()
return hash
```
引入`hashlib`模块用于计算hash值,是Block的`__init__`方法中我们对区块进行了基本的初始化,每个区块都包含着上个区块的hash值,用于校验数据完整。`data`保存着此区块的数据,如果是加密货币,如比特币,那这个data就是交易的事务。`calculate_hash`方法用于计算当前区块的hash值。
<table><tr><td bgcolor=#0096ff > <font color=white>Tip:Hash算法简单来说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。sha256是SHA密码散列函数家族中的一种Hash算法,不同的输入的散列刷出都是不同的,输入的一点改动都会导致hash值的完全不同。所以hash算法可用来校验数据是否改动。</font></td></tr></table>
## 1.2 创建一个链
- ***创建一个区块链,新建`BlockChain.py`***
```python
from Block import Block
import time
class BlockChain:
def __init__(self):
# 初始化链,添加创世区块
self.chain = [self._create_genesis_block()]
@staticmethod
def _create_genesis_block():
'''
生成创世区块
:return: 创世区块
'''
timestamp = time.mktime(time.strptime('2018-06-11 00:00:00', '%Y-%m-%d %H:%M:%S'))
block = Block(timestamp, [], '')
return block
def get_latest_block(self):
'''
获取链上最后一个也是最新的一个区块
:return:最后一个区块
'''
return self.chain[-1]
def add_block(self, block):
'''
添加区块
:param block: 要添加的区块
:return:
'''
block.previous_hash = self.get_latest_block().hash
block.hash = block.calculate_hash()
self.chain.append(block)
def verify_blockchain(self):
'''
校验区块链数据是否完整 是否被篡改过
:return: 校验结果
'''
for i in range(1, len(self.chain)):
current_block = self.chain[i] # 当前遍历到的区块
previous_block = self.chain[i - 1] # 当前区块的上一个区块
if current_block.hash != current_block.calculate_hash():
# 如果当前区块的hash值不等于计算出的hash值,说明数据有变动
return False
if current_block.previous_hash != previous_block.calculate_hash():
# 如果当前区块记录的上个区块的hash值不等于计算出的上个区块的hash值 说明上个区块数据有变动或者本区块记录的上个区块的hash值被改动
return False
return True
if __name__ == '__main__':
# 测试使用区块链
blockChain = BlockChain()
# 添加区块
blockChain.add_block(Block(time.time(), {'amount': 100}))
blockChain.add_block(Block(time.time(), {'amount': 200}))
# 检查区块链有效性 有效
print('区块链是否有效? ', '有效' if blockChain.verify_blockchain() else '无效')
# 尝试修改区块数据
blockChain.chain[1].data = {'amount': 10}
# 检查区块链有效性 无效
print('区块链是否有效? ', '有效' if blockChain.verify_blockchain() else '无效')
```
在区块链初始化的时候我们创建了一个创世区块并添加到链上(这里我们用的是一个数组),创建好区块链后,我们给区块链上增加了两个区块,然后校验区块链的有有效性,运行结果是有效的,随后我们改动了一个区块的数据,再次校验的结果就是无效了。
---
## 2. 实现共识算法 POW
> 我们已经创建好一个区块链了,但是这个区块链并不完整,有着很多问题:
- 人们可以快速的创建任何区块添加到区块链中,这会导致我们的区块链充满着垃圾数据导致区块链过载而无法正常使用
- 创建区块过于容易,所以我们可以不需要多大的算力和代价,就可以轻易的篡改数据并重新计算所有的Hash值使我们的篡改有效。
> 所以我们需要共识机制来解决这样的问题,这里我们介绍比特币使用的***POW***工作量证明。
### 2.1 什么是POW
POW是一种共识机制,通过一定量的的复杂的耗时运算获取到指定的结果,并且这个结果能迅速的被验证。以耗用的时间、设备与能源做为担保成本,从而防止数据滥用。
***因为Hash散列的输入稍有变动,就会生成完全不一样的散列值,所以几乎无法通过hash值推导出原来的数据,我们让区块链的节点通过大量的穷举运算找到指定值从而实现POW。***
比特币通过要求hash以特定0的数目来实现POW。这也被称之为难度。那我们如何改变区块的hash值呢,因为区块的创建时间和区块所包含的数据是不希望被改变的,所以我们需要引入一个新的值,通过这个值的变化来改变区块的hash值
我们给区块添加一个`nonce`值。`nonce`是用来查找一个有效hash的次数。由于无法预测hash函数的输出,因此在获得满足难度条件的hash之前,我们只能通过大量的尝试来找个一个有效的hash值创建一个新的区块,这就是所谓的挖矿。
比特币规定每10分钟只能添加一个区块。可以想象创建一个区块需要多大的算力,要想篡改区块几乎是不可能的。
### 2.2 实现POW
- 首先我们给Block类增加`nonce`随机数属性,并初始化为`0`。
```python
def __init__(self, timestamp, data, previous_hash=''):
'''
区块的初始化
:param timestamp: 创建时的时间戳
:param data: 区块数据
:param previous_hash: 上一个区块的hash
:param hash: 区块的hash
'''
self.previous_hash = previous_hash
self.timestamp = timestamp
self.data = data
self.nonce = 0
self.hash = self.calculate_hash()
```
没有合适的资源?快使用搜索试试~ 我知道了~
基于Python3的区块链简单Demo,帮助了解区块链,有详细说明
共5个文件
py:3个
md:1个
gitignore:1个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 75 浏览量
2024-07-31
16:58:39
上传
评论
收藏 10KB ZIP 举报
温馨提示
本文将分为四个部分: 创建一个基本的区块链 实现共识算法(本文采用POW工作量证明) 实现交易和挖矿奖励 1. 创建基本的区块链 区块链简单来说实际上是一个去中心化的由一个个数据区块链接在一起的公共数据库,数据区块在添加到区块链后,是不会再被改变的,这依赖于区块链的共识机制。当然万事都不可能是绝对的,例如在POW下,如果有用全网一半以上的算力,是有可能改变链上的数据的,但是达到这种条件并作出数据改变所带来的利益是赶不上你付出的代价的。 2. 实现共识算法 POW 我们已经创建好一个区块链了,但是这个区块链并不完整,有着很多问题: 人们可以快速的创建任何区块添加到区块链中,这会导致我们的区块链充满着垃圾数据导致区块链过载而无法正常使用 创建区块过于容易,所以我们可以不需要多大的算力和代价,就可以轻易的篡改数据并重新计算所有的Hash值使我们的篡改有效。 所以我们需要共识机制来解决这样的问题,这里我们介绍比特币使用的POW工作量证明。
资源推荐
资源详情
资源评论
收起资源包目录
BlockChainSimpleDemo-master.zip (5个子文件)
BlockChainSimpleDemo-master
BlockChain.py 4KB
Transaction.py 777B
.gitignore 1KB
Block.py 2KB
README.md 18KB
共 5 条
- 1
资源评论
yanglamei1962
- 粉丝: 2528
- 资源: 838
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功