python 实现区块链环境准备
3.1 python 实现区块链环境准备安装 postman安装 python创建文件目录 lesson1安装 pip命令:pip install pipenvpipenv --python=python安装 flask命令 pipenv install flask0.12.2安装 requests命令 pipenv install requests2.18.4使用 pych...
3.1 python 实现区块链环境准备
安装 postman
安装 python
创建文件目录 lesson1
安装 pip
命令:pip install pipenv
pipenv --python=python
安装 flask
命令 pipenv install flask0.12.2
安装 requests
命令 pipenv install requests2.18.4
使用 pycharm 在刚才目录下新建项目
new project --> 选择目录 --> pipenv --py 查看响应地址
3.2 创建 blockchain.py
“”"
首先创建一个Blockchain类,
在构造函数中创建了两个列表,一个用于储存区块链,一个用于储存交易。
“”"
加入交易
“”" new_transaction()
生成新交易信息,信息将加入到下一个待挖的区块中
:param sender: Address of the Sender
:param recipient: Address of the Recipient
:param amount: Amount
:return: The index of the Block that will hold this transaction
方法向列表中添加一个交易记录,并返回该记录将被添加到的区块(下一个待挖掘的区块)的索引,
等下在用户提交交易时会有用。
“”"
#创建新块
当Blockchain实例化后,我们需要构造一个创世块(没有前区块的第一个区块),并且给它加上一个工作量证明。
每个区块都需要经过工作量证明,俗称挖矿,稍后会继续讲解。
为了构造创世块 self.new_block(pre_hash=1, proof=100) ,我们还需要完善new_block(), new_transaction() 和hash() 方法
“”"
生成新块 new_block()
:param proof: The proof given by the Proof of Work algorithm
:param previous_hash: (Optional) Hash of previous Block
:return: New Block
“”"
构造block的json对象
清空当前交易信息
把生成的区块加入到链条中
返回当前块
“”" hash()
生成块的 SHA-256 hash值 hashlib.sha256()
:param block: Block
:return:
“”"
block为json对象,需转换为string,然后编码 json.dumps().encode()
We must make sure that the Dictionary is Ordered, or we’ll have inconsistent hashes
工作量证明
新的区块依赖工作量证明算法(PoW)来构造,PoW的目标是找出一个符合特定条件的数字,这个数字很难计算出来,但容易验证。
让我们来实现一个相似PoW算法,规则是:寻找一个数 p,使得它与前一个区块的 proof 拼接成的字符串的 Hash 值以 4 个零开头。
“”"
简单的工作量证明:
- 查找一个 p’ 使得 hash(pp’) 以4个0开头
- p 是上一个块的证明, p’ 是当前的证明
:param last_proof:
:return:
“”"
“”"
验证证明: 是否hash(last_proof, proof)以4个0开头?
:param last_proof: Previous Proof
:param proof: Current Proof
:return: True if correct, False if not.
“”"
验证工作量证明
testPOW = BlockChain()
testPOW.proof_of_work(100)
代码:
区块结构
{
“index”:0, //索引
“timestamp”:"",//时间戳
“transactions”:[//交易信息
{
“sender”:"",//交易发送者
“recipient”:"",//交易接受者
“amount”:5,//交易的金额
}
],
“proof”:"",//工作量证明
“previous_hash”:"",//前区块的hash值
}
定义类
import hashlib
import json
from time import time
from flask import Flask
class BlockChain:
# 定义结构函数
def init(self):
self.chain = [] # 链
self.current_transactions = [] # 当前交易信息
# 创世区块 工作量证明:任意值;上一个区块的hash:任意值
self.new_block(proof=100, previou_hash=1)
# 新区块
def new_block(self, proof, previou_hash=None):
# 构造block的json对象
block = {
"index": len(self.chain) + 1,
"timestamp": time(),
"transactions": self.current_transactions,
"proof": proof,
"previous_hash": previou_hash or self.hash(self.last_block)
}
# 清空当前交易信息
self.current_transactions = []
# 把生成的区块加入到链条中
self.chain.append(block)
return block
# 新的交易信息,参数:交易信息三元素。 返回 int
def new_transaction(self, sender, recipient, amount) -> int:
# 将交易信息添加到当前交易信息数组中
self.current_transactions.append(
{
"sender": sender,
"recipient": recipient,
"amount": amount
}
)
# 返回将来所在区块:上一区块索引+1
return self.last_block["index"] + 1
# 静态的 计算HASH之后的摘要信息
@staticmethod
def hash(block):
"""
生成块的 SHA-256 hash值
:param block: <dict> Block
:return: <str>
"""
# block为json对象,需转换为string,然后编码
block_string = json.dumps(block, sort_key=True).encode()
return hashlib.sha256(block_string).hexdigest()
# 作为属性处理
@property
def last_block(self):
return self.chain(-1)
# 工作量证明
def proof_of_work(self, last_proof: int) -> int:
proof = 0
# 不停的尝试一个值,至到其满足某个条件
while self.valid_proof(last_proof, proof) is False:
proof += 1
print(proof)
return proof
# 条件:上一区块工作量证明和需验证的值进行hash运算
@staticmethod
def valid_proof(last_proof: int, proof: int) -> bool:
# 将两个值拼接后,进行编码
guess = f'{last_proof}{proof}'.encode()
# 计算编码后的guess的hash
guess_hash = hashlib.sha256(guess).hexdigest()
print(guess_hash)
# 判断hash前四位是否为0
return guess_hash[0:4] == "0000"
验证工作量证明
testPOW = BlockChain()
testPOW.proof_of_work(100)
3.3 Blockchain作为API接口
使用Python Flask框架,这是一个轻量Web应用框架,它方便将网络请求映射到 Python函数,现在让Blockchain运行在基于Flask web上。
创建三个接口:
/transactions/new 创建一个交易并添加到区块
/mine 告诉服务器去挖掘新的区块
/chain 返回整个区块链
创建节点
更多推荐
所有评论(0)