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

想学习区块链?那就用 Python 构建一个 | Linux 中国了解区块链是如何工作的最快的方法是构建一个。-- Daniel Van Flymen
有用的原文链接请访问文末的“原文链接”获得可点击的文内链接、全尺寸原图和相关文章。致谢编译自 | 
http://hackernoon.com/learn-blockchains-by-building-one-117428612f46
 
 作者 | Daniel Van Flymen
 译者 | qhwdw 共计翻译:140 篇 贡献时间:270 天

了解区块链是如何工作的最快的方法是构建一个。

[原文来自:www.11jj.com]

你看到这篇文章是因为和我一样,对加密货币的大热而感到兴奋。并且想知道区块链是如何工作的 —— 它们背后的技术基础是什么。

[转载出处:www.11jj.com]

但是理解区块链并不容易 —— 至少对我来说是这样。我徜徉在各种难懂的视频中,并且因为示例太少而陷入深深的挫败感中。

我喜欢在实践中学习。这会使得我在代码层面上处理主要问题,从而可以让我坚持到底。如果你也是这么做的,在本指南结束的时候,你将拥有一个功能正常的区块链,并且实实在在地理解了它的工作原理。

开始之前 …

记住,区块链是一个 不可更改的、有序的 记录(被称为区块)的链。它们可以包括交易transaction、文件或者任何你希望的真实数据。最重要的是它们是通过使用哈希链接到一起的。

如果你不知道哈希是什么,这里有解释[1]

本指南的目标读者是谁? 你应该能轻松地读、写一些基本的 Python 代码,并能够理解 HTTP 请求是如何工作的,因为我们讨论的区块链将基于 HTTP。

我需要做什么? 确保安装了 Python 3.6[2]+(以及 pip),还需要去安装 Flask 和非常好用的 Requests 库:

  • pip install Flask==0.12.2 requests==2.18.4

  • 当然,你也需要一个 HTTP 客户端,像 Postman[3] 或者 cURL。哪个都行。

    最终的代码在哪里可以找到? 源代码在 这里[4]

    第 1 步:构建一个区块链

    打开你喜欢的文本编辑器或者 IDE,我个人喜欢 PyCharm[5]。创建一个名为 blockchain.py 的新文件。我将仅使用一个文件,如果你看晕了,可以去参考 源代码[4]

    描述一个区块链

    我们将创建一个 Blockchain 类,它的构造函数将去初始化一个空列表(去存储我们的区块链),以及另一个列表去保存交易。下面是我们的类规划:

  • class Blockchain(object):

  •    def __init__(self):

  •        self.chain = []

  •        self.current_transactions = []

  •    def new_block(self):

  •        # Creates a new Block and adds it to the chain

  •        pass

  •    def new_transaction(self):

  •        # Adds a new transaction to the list of transactions

  •        pass

  •    @staticmethod

  •    def hash(block):

  •        # Hashes a Block

  •        pass

  •    @property

  •    def last_block(self):

  •        # Returns the last Block in the chain

  •        pass

  • 我们的 Blockchain 类的原型

    我们的 Blockchain 类负责管理链。它将存储交易并且有一些为链中增加新区块的辅助性质的方法。现在我们开始去充实一些类的方法。

    区块是什么样子的?

    每个区块有一个索引、一个时间戳(Unix 时间)、一个交易的列表、一个证明(后面会详细解释)、以及前一个区块的哈希。

    单个区块的示例应该是下面的样子:

  • block = {

  •    "index": 1,

  •    "timestamp": 1506057125.900785,

  •    "transactions": [

  •        {

  •            "sender": "8527147fe1f5426f9dd545de4b27ee00",

  •            "recipient": "a77f5cdfa2934df3954a5c7c7da5df1f",

  •            "amount": 5,

  •        }

  •    ],

  •    "proof": 324984774000,

  •    "previous_hash": "2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824"

  • }

  • 我们的区块链中的块示例

    此刻,链的概念应该非常明显 —— 每个新区块包含它自身的信息和前一个区域的哈希。这一点非常重要,因为这就是区块链不可更改的原因:如果攻击者修改了一个早期的区块,那么所有的后续区块将包含错误的哈希。

    这样做有意义吗?如果没有,就让时间来埋葬它吧 —— 这就是区块链背后的核心思想。

    添加交易到一个区块

    我们将需要一种区块中添加交易的方式。我们的 new_transaction() 就是做这个的,它非常简单明了:

  • class Blockchain(object):

  •    ...

  •    def new_transaction(self, sender, recipient, amount):

  •        """

  •        Creates a new transaction to go into the next mined Block

  •        :param sender: <str> Address of the Sender

  •        :param recipient: <str> Address of the Recipient

  •        :param amount: <int> Amount

  •        :return: <int> The index of the Block that will hold this transaction

  •        """

  •        self.current_transactions.append({

  •            "sender": sender,

  •            "recipient": recipient,

  •            "amount": amount,

  •        })

  •        return self.last_block["index"] + 1

  • 在 new_transaction() 运行后将在列表中添加一个交易,它返回添加交易后的那个区块的索引 —— 那个区块接下来将被挖矿。提交交易的用户后面会用到这些。

    创建新区块

    当我们的 Blockchain 被实例化后,我们需要一个创世区块(一个没有祖先的区块)来播种它。我们也需要去添加一些 “证明” 到创世区块,它是挖矿(工作量证明 PoW)的成果。我们在后面将讨论更多挖矿的内容。

    除了在我们的构造函数中创建创世区块之外,我们还需要写一些方法,如 new_block()、new_transaction() 以及 hash():

  • import hashlib

  • import json

  • from time import time

  • class Blockchain(object):

  •    def __init__(self):

  •        self.current_transactions = []

  •        self.chain = []

  •        # Create the genesis block

  •        self.new_block(previous_hash=1, proof=100)

  •    def new_block(self, proof, previous_hash=None):

  •        """

  •        Create a new Block in the Blockchain

  •        :param proof: <int> The proof given by the Proof of Work algorithm

  •        :param previous_hash: (Optional) <str> Hash of previous Block

  •        :return: <dict> New Block

  •        """

  •        block = {

  •            "index": len(self.chain) + 1,

  •            "timestamp": time(),

  •            "transactions": self.current_transactions,

  •            "proof": proof,

  •            "previous_hash": previous_hash or self.hash(self.chain[-1]),

  •        }

  •        # Reset the current list of transactions

  •        self.current_transactions = []

  •        self.chain.append(block)

  •        return block

  •    def new_transaction(self, sender, recipient, amount):

  •        """

  •        Creates a new transaction to go into the next mined Block

  •        :param sender: <str> Address of the Sender

  •        :param recipient: <str> Address of the Recipient

  •        :param amount: <int> Amount

  •        :return: <int> The index of the Block that will hold this transaction

  •        """

  •        self.current_transactions.append({

  •            "sender": sender,

  •            "recipient": recipient,

  •            "amount": amount,

  •        })

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

    小编推荐

    1. 1

      揭阳爱维艾夫医院临床医生(4.29-5.5)出诊信息

      有疑问,点击“阅读原文”咨询!喜欢我,你就点个“在看”吧!

    2. 2

      肿瘤患者不能吃“发物”?医生:真正需要忌口的是这些!

      点亮星标,不错过每一次推送本文作者:冯艳,山东省烟台毓璜顶病院临床营养科副主任医师在临床中,我经常会被肿瘤患者扣问关于“忌口”和“

    3. 3

      氯雷他定冲上热搜!医生提醒

      山西青年你想看的都在这里近日,全国各地的飞絮期光降跟着杨柳絮纷飞打喷嚏、鼻塞、鼻子痒又起头“骚扰”过敏性鼻炎患者的生活为了缓解症状

    4. 4

      larva动画(larva动画合集)

      大家好,小伟今天来为大家解答larva动画以下问题,larva动画合集很多人还不知道,现在让我们一起来看看吧!1、《爆笑虫子》。2、《爆笑虫子》(

    5. 5

      牛股推荐股票交流群(牛股推荐股票交流群)

      大家好,小娟今天来为大家解答牛股推荐股票交流群以下问题,牛股推荐股票交流群很多人还不知道,现在让我们一起来看看吧!1、179533491,大陆股

    6. 6

      营销培训课程(营销培训课程小吃营销)

      大家好,小娟今天来为大家解答营销培训课程以下问题,营销培训课程小吃营销很多人还不知道,现在让我们一起来看看吧!1、品牌管理课程:品牌

    7. 7

      中国人民银行征信中心(中国人民银行征信中心官网查询入口)

      大家好,小美今天来为大家解答中国人民银行征信中心以下问题,中国人民银行征信中心官网查询入口很多人还不知道,现在让我们一起来看看吧!

    8. 8

      死猪图片表情包(死猪图片大全猪瘟)

      大家好,小美今天来为大家解答死猪图片表情包以下问题,死猪图片大全猪瘟很多人还不知道,现在让我们一起来看看吧!1、这个梗出自于动画《猪

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