如何使用Python创建加密货币

开发 后端
在构建自己的加密货币或区块链之前,您需要了解Python和区块链的基础知识。区块链或许看起来很复杂,但可以肯定的是其核心概念确实非常简单。

[[399524]]

本文转载自微信公众号「区块链研究实验室」,作者链三丰 。转载本文请联系区块链研究实验室公众号

本文将向大家介绍如何使用Python 3.9.4建立属于自己的区块链和加密货币。在构建自己的加密货币或区块链之前,您需要了解Python和区块链的基础知识。区块链或许看起来很复杂,但可以肯定的是其核心概念确实非常简单。

要求

确保您已安装最新版本的Python。

入门

创建一个新的Python文件,文件名app.py。首先,我们应该创建一个Block类。

我将参考dzone.com的代码:

  1. class Block(object): 
  2.     def __init__(self): 
  3.         pass 
  4.  
  5.     def compute_hash(self): 
  6.         pass 

我们还需要创建Blockchain类蓝图:

  1. class Blockchain(object): 
  2.     def __init__(self): 
  3.         pass 
  4.  
  5.     def build_genesis(self): 
  6.         pass 
  7.  
  8.     def build_block(self): 
  9.         pass 
  10.  
  11.     @staticmethod 
  12.     def confirm_validity(block, previous_block): 
  13.         pass 
  14.  
  15.     def get_data(self, sender, receiver, amount): 
  16.         pass 
  17.  
  18.     @staticmethod 
  19.     def proof_of_work(last_proof): 
  20.         pass 
  21.  
  22.     @property 
  23.     def latest_block(self): 
  24.         pass 

积木类

现在,让我们看一下我们刚刚创建的这些类。块类将如下所示:

  1. import hashlib 
  2. import time 
  3.  
  4. class Block(object): 
  5.     def __init__(self, index, proof_number, previous_hash, data, timestamp=None): 
  6.         self.index = index 
  7.         self.proof_number = proof_number 
  8.         self.previous_hash = previous_hash 
  9.         self.data = data 
  10.         self.timestamp = timestamp or time.time() 
  11.  
  12.     @property     
  13.     def compute_hash(self): 
  14.         string_block = "{}{}{}{}{}".format(self.index, self.proof_number, self.previous_hash, self.data, self.timestamp
  15.         return hashlib.sha256(string_block.encode()).hexdigest() 

Block类采用几个参数:index,proof_number,previous_hash,data和timestamp。

  • 索引用于查看块在链中的哪个位置。
  • 我认为,前者是不言而喻的。
  • 数据是一个对象,它收集有关该区块的所有信息(id,金额,发送者,接收者等)。
  • 时间戳是指生成块的时刻。

在def compute_hash()方法中,我们的哈希将使用hash方法创建。

链条类

单独的块没有任何价值,并且使用链来加密数据,因此很重要。让我们为Chain类创建构造函数:

  1. class Blockchain(object): 
  2.     def __init__(self): 
  3.         self.chain = [] 
  4.         self.current_data = [] 
  5.         self.nodes = set() 
  6.         self.build_genesiss() 

让我们看一下这些参数的作用。

  • 该self.chain是一个变量,它存储所有的块。
  • 该self.current_data是一个变量,它存储所有关于该块的信息。
  • 这self.nodes是用于设置节点的示例方法。
  • 所述self.build_genesis方法变量是创建第一块中的方法。

建立创世方法

此方法将用于创建初始块。因此,我们需要调用该build_block()方法。

  1. def build_genesis(self): 
  2.         self.build_block(proof_number=0, previous_hash=0) 
  3.  
  4.     def build_block(self, proof_number, previous_hash): 
  5.         block = Block( 
  6.             index=len(self.chain), 
  7.             proof_number=proof_number, 
  8.             previous_hash=previous_hash, 
  9.             data=self.current_data 
  10.         ) 
  11.  
  12.         self.current_data = [] 
  13.         self.chain.append(block) 
  14.  
  15.         return block 

在此方法中,创建一个新Block对象并输入所需的参数:索引,证明,previous_hash和数据。然后,我们设置当前数据并将该块附加到链中。

确认有效性方法

创建加密货币/区块链的重要部分是检查区块是否有效。我们用一种新方法来做到这一点。

  1. @staticmethod 
  2.     def confirm_validity(block, previous_block): 
  3.         if previous_block.index + 1 != block.index
  4.             return False 
  5.  
  6.         elif previous_block.compute_hash() != block.previous_hash: 
  7.             return False 
  8.  
  9.         elif block.timestamp & lt; = previous_block.timestamp
  10.             return False 
  11.  
  12.         return True 

让我们解释一下:此方法使用几个if语句来检查Block是否是它应该的块。它compute_hash()再次使用该方法。

获取数据方法

当然,您希望能够读取您的块和区块链的数据,这是通过以下get_data()方法完成的:

  1. def get_data(self, sender, receiver, amount): 
  2.             self.current_data.append({ 
  3.                 'sender': sender, 
  4.                 'receiver': receiver, 
  5.                 'amount': amount 
  6.             }) 
  7.  
  8.             return True 

该方法非常简单,它采用三个参数并将它们添加到对象中。

工作证明

在这个项目中,我们将添加一个工作量证明算法以使挖掘成为可能。

让我们创建def block_mining方法:

  1. def block_mining(self, details_miner): 
  2.         self.get_data( 
  3.             sender="0"
  4.             receiver=details_miner, 
  5.             quantity=1, 
  6.         ) 
  7.  
  8.         last_block = self.latest_block 
  9.         last_proof_number = last_block.proof_number 
  10.         proof_number = self.proof_of_work(last_proof_number) 
  11.         last_hash = last_block.compute_hash 
  12.  
  13.         block = self.build_block(proof_number, last_hash) 
  14.  
  15.         return vars(block) 

定稿

为了结束我们的项目,我们将以下代码行添加到def latest_block方法中,

  1. return self.chain[-1] 

现在,我们将测试我们的项目:

  1. bc = Blockchain() 
  2. print("READY"
  3. print(bc.chain) 
  4. #output
  5. READY 
  6. [<__main__.Block object at 0x00000241A23C5EE0>] 

当您看到类似的结果时,您的区块链蓝图已成功构建。如果您想添加额外的功能,则可以这样做,请告诉我您所构建的内容!

完整代码示例:

  1. import hashlib 
  2. import time 
  3.  
  4.  
  5. class Block(object): 
  6.     def __init__(self, index, proof_number, previous_hash, data, timestamp=None): 
  7.         self.index = index 
  8.         self.proof_number = proof_number 
  9.         self.previous_hash = previous_hash 
  10.         self.data = data 
  11.         self.timestamp = timestamp or time.time() 
  12.  
  13.     @property 
  14.     def compute_hash(self): 
  15.         string_block = "{}{}{}{}{}".format( 
  16.             self.index, self.proof_number, self.previous_hash, self.data, self.timestamp
  17.         return hashlib.sha256(string_block.encode()).hexdigest() 
  18.  
  19.  
  20. class Blockchain(object): 
  21.     def __init__(self): 
  22.         self.chain = [] 
  23.         self.current_data = [] 
  24.         self.nodes = set() 
  25.         self.build_genesis() 
  26.  
  27.     def build_genesis(self): 
  28.         self.build_block(proof_number=0, previous_hash=0) 
  29.  
  30.     def build_block(self, proof_number, previous_hash): 
  31.         block = Block( 
  32.             index=len(self.chain), 
  33.             proof_number=proof_number, 
  34.             previous_hash=previous_hash, 
  35.             data=self.current_data 
  36.         ) 
  37.  
  38.         self.current_data = [] 
  39.         self.chain.append(block) 
  40.  
  41.         return block 
  42.  
  43.     @staticmethod 
  44.     def confirm_validity(block, previous_block): 
  45.         if previous_block.index + 1 != block.index
  46.             return False 
  47.  
  48.         elif previous_block.compute_hash() != block.previous_hash: 
  49.             return False 
  50.  
  51.         elif block.timestamp >= previous_block.timestamp
  52.             return False 
  53.  
  54.         return True 
  55.  
  56.     def get_data(self, sender, receiver, amount): 
  57.         self.current_data.append({ 
  58.             'sender': sender, 
  59.             'receiver': receiver, 
  60.             'amount': amount 
  61.         }) 
  62.  
  63.         return True 
  64.  
  65.     @staticmethod 
  66.     def proof_of_work(last_proof): 
  67.         pass 
  68.  
  69.     @property 
  70.     def latest_block(self): 
  71.         return self.chain[-1] 
  72.  
  73.     def block_mining(self, details_miner): 
  74.         self.get_data( 
  75.             sender="0"
  76.             receiver=details_miner, 
  77.             quantity=1, 
  78.         ) 
  79.  
  80.         last_block = self.latest_block 
  81.         last_proof_number = last_block.proof_number 
  82.         proof_number = self.proof_of_work(last_proof_number) 
  83.         last_hash = last_block.compute_hash 
  84.  
  85.         block = self.build_block(proof_number, last_hash) 
  86.  
  87.         return vars(block) 
  88.  
  89.  
  90. bc = Blockchain() 
  91. print("READY"
  92. print(bc.chain) 

终于我们使用Python创建了自己的区块链。

 

责任编辑:武晓燕 来源: 区块链研究实验室
相关推荐

2022-06-06 15:41:51

加密货币安全勒索软件

2021-04-12 16:31:09

加密货币资金金融

2021-03-23 12:15:32

加密货币比特币货币

2022-07-29 15:08:05

加密货币去中心化工具

2021-04-12 11:23:43

加密货币技术比特币

2022-06-10 14:10:38

加密货币代币比特币

2022-01-12 11:12:21

区块链加密货币技术

2021-02-02 21:43:47

加密货币以太坊比特币

2022-05-04 23:29:42

加密货币代币比特币

2022-02-18 00:02:31

加密货币爱情安全

2021-11-14 22:25:18

加密货币物联网区块链

2021-06-04 10:31:41

PythonUniswap加密货币

2021-02-26 20:32:40

加密货币比特币货币

2022-04-19 15:39:08

区块链加密货币交易

2022-05-26 14:52:00

加密货币金融女性

2022-04-08 14:06:08

加密货币捐赠慈善

2021-06-09 14:26:50

加密货币比特币货币

2021-04-12 10:29:56

加密货币货币比特币

2021-10-22 22:49:29

加密货币区块链货币

2021-11-15 15:37:14

加密货币银行比特币
点赞
收藏

51CTO技术栈公众号