3.1 python 实现区块链环境准备

安装 postman
安装 python

创建文件目录 lesson1
安装 pip
命令:pip install pipenv
pipenv --python=python
安装 flask
命令 pipenv install flask0.12.2
安装 requests
命令 pipenv install requests
2.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 返回整个区块链

创建节点

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐