Python创建自己的加密货币的示例


Posted in Python onMarch 01, 2021

随着当前加密货币的兴起,区块链在技术界引起了轰动。 

这项技术之所以吸引了如此多的关注,主要是因为它具有保证安全,强制分权和加快多个行业(尤其是金融行业)流程的能力。

本质上,区块链是一个公共数据库,它不可逆地记录和认证数字资产的拥有和传输。像比特币和以太坊这样的数字货币就是基于这个概念。 

区块链是一项令人兴奋的技术,可用于转换应用程序的功能。

最近,我们看到政府,组织和个人使用区块链技术来创建自己的加密货币。值得注意的是,当Facebook提出自己的加密货币Libra时,这一公告激起了全世界的许多热潮。

如果您也可以效仿并创建自己的加密货币版本,你应该如何着手?

我考虑了这一点,决定开发一种可以创建加密货币的算法。

我决定将加密货币称为fccCoin。 

在本教程中,我将逐步说明构建数字货币的过程(我使用了Python编程语言的面向对象概念)。 

这是用于创建fccCoin的区块链算法的基本蓝图:

class Block:

 def __init__():

 #first block class

  pass
 
 def calculate_hash():
 
 #calculates the cryptographic hash of every block
  
 
class BlockChain:
 
 def __init__(self):
  # constructor method
 pass
 
 def construct_genesis(self):
  # constructs the initial block
  pass

 def construct_block(self, proof_no, prev_hash):
  # constructs a new block and adds it to the chain
  pass

 @staticmethod
 def check_validity():
  # checks whether the blockchain is valid
  pass

 def new_data(self, sender, recipient, quantity):
  # adds a new transaction to the data of the transactions
  pass

 @staticmethod
 def construct_proof_of_work(prev_proof):
  # protects the blockchain from attack
  pass
 
 @property
 def last_block(self):
  # returns the last block in the chain
  return self.chain[-1]

现在,让我解释一下接下来应该怎么做……

1.建立第一个Block类

区块链由几个相互连接的块组成,因此,如果一个块被篡改,则链将变为无效。

在应用上述概念时,我创建了以下初始块类:

import hashlib
import time

class Block:

 def __init__(self, index, proof_no, prev_hash, data, timestamp=None):
  self.index = index
  self.proof_no = proof_no
  self.prev_hash = prev_hash
  self.data = data
  self.timestamp = timestamp or time.time()

 @property
 def calculate_hash(self):
  block_of_string = "{}{}{}{}{}".format(self.index, self.proof_no,
            self.prev_hash, self.data,
            self.timestamp)

  return hashlib.sha256(block_of_string.encode()).hexdigest()

 def __repr__(self):
  return "{} - {} - {} - {} - {}".format(self.index, self.proof_no,
            self.prev_hash, self.data,
            self.timestamp)

从上面的代码中可以看到,我定义了__init __()函数,该函数将在启动Block类时执行,就像在其他任何Python类中一样。

我为启动函数提供了以下参数:

  • self-引用Block类的实例,从而可以访问与该类关联的方法和属性;
  • 索引—跟踪区块链在区块链中的位置;
  • proof_no-这是在创建新块(称为挖矿)期间产生的数量;
  • prev_hash —这是指链中上一个块的哈希值;
  • 数据-提供所有已完成交易的记录,例如购买数量;
  • 时间戳记-为事务放置时间戳记。

类中的第二个方法calculate_hash将使用上述值生成块的哈希。SHA-256模块被导入到项目中,以帮助获得块的哈希值。

将值输入到密码哈希算法后,该函数将返回一个256位字符串,表示该块的内容。

这就是在区块链中实现安全性的方式-每个块都将具有哈希,并且该哈希将依赖于前一个块的哈希。

因此,如果有人试图破坏链中的任何区块,其他区块将具有无效的哈希值,从而导致整个区块链网络的破坏。

最终,一个块将如下所示:

{
 "index": 2,
 "proof": 21,
 "prev_hash": "6e27587e8a27d6fe376d4fd9b4edc96c8890346579e5cbf558252b24a8257823",
 "transactions": [
  {'sender': '0', 'recipient': 'Quincy Larson', 'quantity': 1}
 ],
 "timestamp": 1521646442.4096143
}

2.建立区块链类

顾名思义,区块链的主要思想涉及将多个区块相互“链接”。

因此,我将构建一个对管理整个链的工作很有用的Blockchain类。这是大多数动作将要发生的地方。

该Blockchain类将在blockchain完成各种任务的各种辅助方法。

让我解释一下每个方法在类中的作用。

A.构造方法

此方法确保实例化区块链。

class BlockChain:

 def __init__(self):
  self.chain = []
  self.current_data = []
  self.nodes = set()
        self.construct_genesis()

以下是其属性的作用:

  • self.chain-此变量保留所有块;
  • self.current_data-此变量将所有已完成的事务保留在该块中;
  • self.construct_genesis() -此方法将负责构造初始块。

B.构建创世块

区块链需要一个construct_genesis方法来构建链中的初始块。在区块链惯例中,此块是特殊的,因为它象征着区块链的开始。

在这种情况下,让我们通过简单地将一些默认值传递给Construct_block方法来构造它。

尽管您可以提供所需的任何值,但我都给了proof_no和prev_hash一个零值。

def construct_genesis(self):
 self.construct_block(proof_no=0, prev_hash=0)


def construct_block(self, proof_no, prev_hash):
 block = Block(
  index=len(self.chain),
  proof_no=proof_no,
  prev_hash=prev_hash,
  data=self.current_data)
 self.current_data = []

 self.chain.append(block)
 return block

C.建造新的街区

该construct_block 方法用于在blockchain创造新的块。

这是此方法的各种属性所发生的情况:

  • 索引-代表区块链的长度;
  • proof_nor&prev_hash —调用者方法传递它们;
  • 数据-包含节点上任何块中未包含的所有事务的记录;
  • self.current_data-用于重置节点上的事务列表。如果已经构造了一个块并将事务分配给该块,则会重置该列表以确保将来的事务被添加到该列表中。并且,该过程将连续进行;
  • self.chain.append()-此方法将新构建的块连接到链;
  • return-最后,返回一个构造的块对象。

D.检查有效性

该check_validity方法是评估blockchain的完整性,确保异常是绝对重要。

如上所述,散列对于区块链的安全至关重要,因为即使对象发生任何细微变化也将导致生成全新的哈希。 

因此,此check_validity 方法使用if语句检查每个块的哈希是否正确。

它还通过比较其哈希值来验证每个块是否指向正确的上一个块。如果一切正确,则返回true;否则,返回true。否则,它返回false。

@staticmethod
def check_validity(block, prev_block):
 if prev_block.index + 1 != block.index:
  return False

 elif prev_block.calculate_hash != block.prev_hash:
  return False

 elif not BlockChain.verifying_proof(block.proof_no, prev_block.proof_no):
  return False

 elif block.timestamp <= prev_block.timestamp:
  return False

 return True

E.添加交易数据

该NEW_DATA方法用于添加事务的数据的块。这是一种非常简单的方法:它接受三个参数(发送者的详细信息,接收者的详细信息和数量),并将交易数据附加到self.current_data列表中。

每当创建新块时,都会将该列表分配给该块,并再次按Construct_block方法中的说明进行重置。

将交易数据添加到列表后,将返回要创建的下一个块的索引。

该索引是通过将当前块的索引(即区块链中的最后一个)的索引加1来计算的。数据将帮助用户将来提交交易。

def new_data(self, sender, recipient, quantity):
 self.current_data.append({
  'sender': sender,
  'recipient': recipient,
  'quantity': quantity
 })
 return True

F.添加工作证明

工作量证明是防止区块链滥用的概念。简而言之,其目的是在完成一定数量的计算工作后,确定一个可以解决问题的编号。

如果识别数字的难度很高,则不鼓励发送垃圾邮件和篡改区块链。

在这种情况下,我们将使用一种简单的算法来阻止人们挖掘区块或轻松创建区块。

@staticmethod
def proof_of_work(last_proof):
 '''this simple algorithm identifies a number f' such that hash(ff') contain 4 leading zeroes
   f is the previous f'
   f' is the new proof
  '''
 proof_no = 0
 while BlockChain.verifying_proof(proof_no, last_proof) is False:
  proof_no += 1

 return proof_no


@staticmethod
def verifying_proof(last_proof, proof):
 #verifying the proof: does hash(last_proof, proof) contain 4 leading zeroes?

 guess = f'{last_proof}{proof}'.encode()
 guess_hash = hashlib.sha256(guess).hexdigest()
 return guess_hash[:4] == "0000"

G.得到最后一块

最后,latest_block 方法是一种帮助程序方法,可帮助获取区块链中的最后一个块。请记住,最后一个块实际上是链中的当前块。

@property
 def latest_block(self):
  return self.chain[-1]

总结

这是用于创建fccCoin加密货币的完整代码。

import hashlib
import time


class Block:

 def __init__(self, index, proof_no, prev_hash, data, timestamp=None):
  self.index = index
  self.proof_no = proof_no
  self.prev_hash = prev_hash
  self.data = data
  self.timestamp = timestamp or time.time()

 @property
 def calculate_hash(self):
  block_of_string = "{}{}{}{}{}".format(self.index, self.proof_no,
            self.prev_hash, self.data,
            self.timestamp)

  return hashlib.sha256(block_of_string.encode()).hexdigest()

 def __repr__(self):
  return "{} - {} - {} - {} - {}".format(self.index, self.proof_no,
            self.prev_hash, self.data,
            self.timestamp)


class BlockChain:

 def __init__(self):
  self.chain = []
  self.current_data = []
  self.nodes = set()
  self.construct_genesis()

 def construct_genesis(self):
  self.construct_block(proof_no=0, prev_hash=0)

 def construct_block(self, proof_no, prev_hash):
  block = Block(
   index=len(self.chain),
   proof_no=proof_no,
   prev_hash=prev_hash,
   data=self.current_data)
  self.current_data = []

  self.chain.append(block)
  return block

 @staticmethod
 def check_validity(block, prev_block):
  if prev_block.index + 1 != block.index:
   return False

  elif prev_block.calculate_hash != block.prev_hash:
   return False

  elif not BlockChain.verifying_proof(block.proof_no,
           prev_block.proof_no):
   return False

  elif block.timestamp <= prev_block.timestamp:
   return False

  return True

 def new_data(self, sender, recipient, quantity):
  self.current_data.append({
   'sender': sender,
   'recipient': recipient,
   'quantity': quantity
  })
  return True

 @staticmethod
 def proof_of_work(last_proof):
  '''this simple algorithm identifies a number f' such that hash(ff') contain 4 leading zeroes
   f is the previous f'
   f' is the new proof
  '''
  proof_no = 0
  while BlockChain.verifying_proof(proof_no, last_proof) is False:
   proof_no += 1

  return proof_no

 @staticmethod
 def verifying_proof(last_proof, proof):
  #verifying the proof: does hash(last_proof, proof) contain 4 leading zeroes?

  guess = f'{last_proof}{proof}'.encode()
  guess_hash = hashlib.sha256(guess).hexdigest()
  return guess_hash[:4] == "0000"

 @property
 def latest_block(self):
  return self.chain[-1]

 def block_mining(self, details_miner):

  self.new_data(
   sender="0", #it implies that this node has created a new block
   receiver=details_miner,
   quantity=
   1, #creating a new block (or identifying the proof number) is awarded with 1
  )

  last_block = self.latest_block

  last_proof_no = last_block.proof_no
  proof_no = self.proof_of_work(last_proof_no)

  last_hash = last_block.calculate_hash
  block = self.construct_block(proof_no, last_hash)

  return vars(block)

 def create_node(self, address):
  self.nodes.add(address)
  return True

 @staticmethod
 def obtain_block_object(block_data):
  #obtains block object from the block data

  return Block(
   block_data['index'],
   block_data['proof_no'],
   block_data['prev_hash'],
   block_data['data'],
   timestamp=block_data['timestamp'])

现在,让我们测试我们的代码,看看它是否有效。

blockchain = BlockChain()

print("***Mining fccCoin about to start***")
print(blockchain.chain)

last_block = blockchain.latest_block
last_proof_no = last_block.proof_no
proof_no = blockchain.proof_of_work(last_proof_no)

blockchain.new_data(
 sender="0", #it implies that this node has created a new block
 recipient="Quincy Larson", #let's send Quincy some coins!
 quantity=
 1, #creating a new block (or identifying the proof number) is awarded with 1
)

last_hash = last_block.calculate_hash
block = blockchain.construct_block(proof_no, last_hash)

print("***Mining fccCoin has been successful***")
print(blockchain.chain)

有效!

这是挖掘过程的输出:

***Mining fccCoin about to start***
[0 - 0 - 0 - [] - 1566930640.2707076]
***Mining fccCoin has been successful***
[0 - 0 - 0 - [] - 1566930640.2707076, 1 - 88914 - a8d45cb77cddeac750a9439d629f394da442672e56edfe05827b5e41f4ba0138 - [{'sender': '0', 'recipient': 'Quincy Larson', 'quantity': 1}] - 1566930640.5363243]

结论

以上就是使用Python创建自己的区块链的方式。

如果按原样部署该代币,它将无法满足当前市场对稳定,安全且易于使用的加密货币的需求。

因此,仍可以通过添加其他功能来增强其挖掘和发送财务交易的功能,从而对其进行改进。

以上就是Python创建自己的加密货币的示例的详细内容,更多关于Python创建自己的加密货币的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python中SOAP项目的介绍及其在web开发中的应用
Apr 14 Python
Python编程中字符串和列表的基本知识讲解
Oct 14 Python
详解Python的Flask框架中的signals信号机制
Jun 13 Python
python+selenium+autoit实现文件上传功能
Aug 23 Python
Django数据库表反向生成实例解析
Feb 06 Python
TensorFlow打印tensor值的实现方法
Jul 27 Python
django celery redis使用具体实践
Apr 08 Python
了解不常见但是实用的Python技巧
May 23 Python
python 读取数据库并绘图的实例
Dec 03 Python
python 实时调取摄像头的示例代码
Nov 25 Python
python 检测图片是否有马赛克
Dec 01 Python
python神经网络Xception模型
May 06 Python
python 实现网易邮箱邮件阅读和删除的辅助小脚本
Mar 01 #Python
详解Django中的FBV和CBV对比分析
Mar 01 #Python
Python3压缩和解压缩实现代码
Mar 01 #Python
python re模块常见用法例举
Mar 01 #Python
Python实现简单的2048小游戏
Mar 01 #Python
Python使用Turtle模块绘制国旗的方法示例
Feb 28 #Python
Python页面加载的等待方式总结
Feb 28 #Python
You might like
解析php中反射的应用
2013/06/18 PHP
php插入含有特殊符号数据的处理方法
2016/11/24 PHP
PHP获取表单数据与HTML嵌入PHP脚本的实现
2017/02/09 PHP
JS实现打开本地文件或文件夹
2021/03/09 Javascript
用nodejs写的一个简单项目打包工具
2013/05/11 NodeJs
基于jquery的文章中所有图片width大小批量设置方法
2013/08/01 Javascript
js将json格式内容转换成对象的方法
2013/11/01 Javascript
js post提交调用方法
2014/02/12 Javascript
JS判断、校验MAC地址的2个实例
2014/05/05 Javascript
基于bootstrap3和jquery的分页插件
2015/07/31 Javascript
基于JavaScript实现仿京东图片轮播效果
2015/11/06 Javascript
Bootstrap每天必学之表格
2015/11/23 Javascript
js过滤HTML标签完整实例
2015/11/26 Javascript
JS触发服务器控件的单击事件(详解)
2016/08/06 Javascript
前端编码规范(3)JavaScript 开发规范
2017/01/21 Javascript
利用webstrom调试Vue.js单页面程序的方法教程
2017/06/06 Javascript
ionic2自定义cordova插件开发以及使用(Android)
2017/06/19 Javascript
vue router使用query和params传参的使用和区别
2017/11/13 Javascript
使用Electron构建React+Webpack桌面应用的方法
2017/12/15 Javascript
vue中element-ui表格缩略图悬浮放大功能的实例代码
2018/06/26 Javascript
详解Angular-ui-BootStrap组件的解释以及使用
2018/07/13 Javascript
关于vue 项目中浏览器跨域的配置问题
2020/11/10 Javascript
[53:44]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Magma BO3 第一场 1月31日
2021/03/11 DOTA
Python IDE PyCharm的基本快捷键和配置简介
2015/11/04 Python
全面了解python中的类,对象,方法,属性
2016/09/11 Python
Python查找两个有序列表中位数的方法【基于归并算法】
2018/04/20 Python
Python获取指定字符前面的所有字符方法
2018/05/02 Python
解决Python pandas plot输出图形中显示中文乱码问题
2018/12/12 Python
python默认参数调用方法解析
2020/02/09 Python
如何向scrapy中的spider传递参数的几种方法
2020/11/18 Python
css3背景_动力节点Java学院整理
2017/07/11 HTML / CSS
Bally美国官网:经典瑞士鞋履、手袋及配饰奢侈品牌
2018/05/18 全球购物
下面这个程序执行后会有什么错误或者效果
2014/11/03 面试题
酒店出纳岗位职责
2013/12/29 职场文书
邮政员工辞职信
2014/01/16 职场文书
如何设置多台电脑共享打印机?多台电脑共享打印机的方法
2022/04/08 数码科技