想学习区块链?那就用 Python 构建一个 | Linux 中国(2)

       return self.last_block["index"] + 1 [好文分享:www.11jj.com]

  •    @property [好文分享:www.11jj.com]

  •    def last_block(self):

  •        return self.chain[-1]

  •    @staticmethod

  •    def hash(block):

  •        """

  •        Creates a SHA-256 hash of a Block

  •        :param block: <dict> Block

  •        :return: <str>

  •        """

  •        # We must make sure that the Dictionary is Ordered, or we"ll have inconsistent hashes

  •        block_string = json.dumps(block, sort_keys=True).encode()

  •        return hashlib.sha256(block_string).hexdigest()

  • 上面的内容简单明了 —— 我添加了一些注释和文档字符串,以使代码清晰可读。到此为止,表示我们的区块链基本上要完成了。但是,你肯定想知道新区块是如何被创建、打造或者挖矿的。

    理解工作量证明

    工作量证明Proof of Work(PoW)算法是在区块链上创建或者挖出新区块的方法。PoW 的目标是去撞出一个能够解决问题的数字。这个数字必须满足“找到它很困难但是验证它很容易”的条件 —— 网络上的任何人都可以计算它。这就是 PoW 背后的核心思想。

    我们来看一个非常简单的示例来帮助你了解它。

    我们来解决一个问题,一些整数 x 乘以另外一个整数 y 的结果的哈希值必须以 0 结束。因此,hash(x * y) = ac23dc…0。为简单起见,我们先把 x = 5 固定下来。在 Python 中的实现如下:

  • from hashlib import sha256

  • x = 5

  • y = 0  # We don"t know what y should be yet...

  • while sha256(f"{x*y}".encode()).hexdigest()[-1] != "0":

  •    y += 1

  • print(f"The solution is y = {y}")

  • 在这里的答案是 y = 21。因为它产生的哈希值是以 0 结尾的:

  • hash(5 * 21) = 1253e9373e...5e3600155e860

  • 在..中,工作量证明算法被称之为 Hashcash[6]。与我们上面的例子没有太大的差别。这就是矿工们进行竞赛以决定谁来创建新块的算法。一般来说,其难度取决于在一个字符串中所查找的字符数量。然后矿工会因其做出的求解而得到奖励的币——在一个交易当中。

    网络上的任何人都可以很容易地去核验它的答案。

    实现基本的 PoW

    为我们的区块链来实现一个简单的算法。我们的规则与上面的示例类似:

    找出一个数字 p,它与前一个区块的答案进行哈希运算得到一个哈希值,这个哈希值的前四位必须是由 0 组成。

  • import hashlib

  • import json

  • from time import time

  • from uuid import uuid4

  • class Blockchain(object):

  •    ...

  •    def proof_of_work(self, last_proof):

  •        """

  •        Simple Proof of Work Algorithm:

  •         - Find a number p" such that hash(pp") contains leading 4 zeroes, where p is the previous p"

  •         - p is the previous proof, and p" is the new proof

  •        :param last_proof: <int>

  •        :return: <int>

  •        """

  •        proof = 0

  •        while self.valid_proof(last_proof, proof) is False:

  •            proof += 1

  •        return proof

  •    @staticmethod

  •    def valid_proof(last_proof, proof):

  •        """

  •        Validates the Proof: Does hash(last_proof, proof) contain 4 leading zeroes?

  •        :param last_proof: <int> Previous Proof

  •        :param proof: <int> Current Proof

  •        :return: <bool> True if correct, False if not.

  •        """

  •        guess = f"{last_proof}{proof}".encode()

  •        guess_hash = hashlib.sha256(guess).hexdigest()

  •        return guess_hash[:4] == "0000"

  • 为了调整算法的难度,我们可以修改前导 0 的数量。但是 4 个零已经足够难了。你会发现,将前导 0 的数量每增加一,那么找到正确答案所需要的时间难度将大幅增加。

    我们的类基本完成了,现在我们开始去使用 HTTP 请求与它交互。

    第 2 步:以 API 方式去访问我们的区块链

    我们将使用 Python Flask 框架。它是个微框架,使用它去做端点到 Python 函数的映射很容易。这样我们可以使用 HTTP 请求基于 web 来与我们的区块链对话。

    我们将创建三个方法:

    ◈ /transactions/new 在一个区块上创建一个新交易◈ /mine 告诉我们的服务器去挖矿一个新区块◈ /chain 返回完整的区块链

    配置 Flask

    我们的 “服务器” 将在我们的区块链网络中产生一个单个的节点。我们来创建一些样板代码:

  • import hashlib

  • import json

  • from textwrap import dedent

  • from time import time

  • from uuid import uuid4

  • from flask import Flask

  • class Blockchain(object):

  •    ...

  • # Instantiate our Node

  • app = Flask(__name__)

  • # Generate a globally unique address for this node

  • node_identifier = str(uuid4()).replace("-", "")

  • # Instantiate the Blockchain

  • blockchain = Blockchain()

  • @app.route("/mine", methods=["GET"])

  • def mine():

  •    return "We"ll mine a new Block"

  • @app.route("/transactions/new", methods=["POST"])

  • def new_transaction():

  •    return "We"ll add a new transaction"

  • @app.route("/chain", methods=["GET"])

  • def full_chain():

  •    response = {

  •        "chain": blockchain.chain,

  •        "length": len(blockchain.chain),

  •    }

  •    return jsonify(response), 200

  • if __name__ == "__main__":

  •    app.run(host="0.0.0.0", port=5000)

  • 对上面的代码,我们做添加一些详细的解释:

    ◈ Line 15:实例化我们的节点。更多关于 Flask 的知识读 这里[7]。◈ Line 18:为我们的节点创建一个随机的名字。◈ Line 21:实例化我们的区块链类。◈ Line 24–26:创建 /mine 端点,这是一个 GET 请求。◈ Line 28–30:创建 /transactions/new 端点,这是一个 POST 请求,因为我们要发送数据给它。◈ Line 32–38:创建 /chain 端点,它返回全部区块链。◈ Line 40–41:在 5000 端口上运行服务器。

    交易端点

    这就是对一个交易的请求,它是用户发送给服务器的:

  • {

  • "sender": "my address",

  • "recipient": "someone else"s address",

  • "amount": 5

  • }

  • 因为我们已经有了添加交易到块中的类方法,剩下的就很容易了。让我们写个函数来添加交易:

  • import hashlib

  • import json

  • from textwrap import dedent

  • from time import time

  • from uuid import uuid4

  • from flask import Flask, jsonify, request

  • ...

  • @app.route("/transactions/new", methods=["POST"])

  • def new_transaction():

  •    values = request.get_json()

  •    # Check that the required fields are in the POST"ed data

  •    required = ["sender", "recipient", "amount"]

  •    if not all(k in values for k in required):

  •        return "Missing values", 400

  •    # Create a new Transaction

  • 自媒体 微信号:11jj 扫描二维码关注公众号
    爱八卦,爱爆料。

    小编推荐

    1. 1

      节后上班!消防安全提示来啦!

      上 班 啦!上 班 啦!!是不是感受.....没有一丝丝预防没有一丝丝挂念好多人如今的表情是不是如许▼明明感受假期还没起头,懒觉还没睡够几天几

    2. 2

      通辽职业学院召开实验动物伦理审查委员会第一次工作会议

      每年4.24日是世界实验动物纪念日,为增强学院实验动物治理,保障实验动物福利。按拍照关文件要求,通辽职业学院实验动物伦理审查委员会召开第

    3. 3

      如何把word转换成excel(如何将word文档转换成excel表格)

      大家好,小娟今天来为大家解答如何把word转换成excel以下问题,如何将word文档转换成excel表格很多人还不知道,现在让我们一起来看看吧!1、方法一

    4. 4

      荒岛余生60天国语版(荒岛余生60天第二集国语版)

      大家好,小乐今天来为大家解答荒岛余生60天国语版以下问题,荒岛余生60天第二集国语版很多人还不知道,现在让我们一起来看看吧!1、链接: htt

    5. 5

      三年级作文美丽的校园300字(三年级作文美丽的校园300字左右三个自然都)

      大家好,小美今天来为大家解答三年级作文美丽的校园300字以下问题,三年级作文美丽的校园300字左右三个自然都很多人还不知道,现在让我们一起

    6. 6

      蔓越莓粉功效和作用(蔓越莓粉的服用方法)

      大家好,小乐今天来为大家解答蔓越莓粉功效和作用以下问题,蔓越莓粉的服用方法很多人还不知道,现在让我们一起来看看吧!1、密私爱当中含有

    7. 7

      2024中大人自己的租房群 | 5000+校友在群互助,杜绝黑中介!

      卒业答辩已拿下一只脚已经踏出亲爱的鸭大了对于即将卒业的同窗留校时间不足2个月啦大学时光即将竣事也该物色房子了总得为新的本身预备一个平

    8. 8

      usb无线网卡怎么安装(无线网卡怎么安装使用)

      大家好,小豪今天来为大家解答usb无线网卡怎么安装以下问题,无线网卡怎么安装使用很多人还不知道,现在让我们一起来看看吧!1、首先,将USB无线

    Copyright 2024.依依自媒体,让大家了解更多图文资讯!