Py学习  »  Python

用 Python 创建你自己的加密货币(附源码)

Python中文社区 • 3 年前 • 442 次点击  

央行数字货币DECP钱包内测截图

随着加密货币的兴起,区块链技术逐渐进入大众的视野。这项技术之所以吸引如此多的关注,主要是因为它具有分布式、可追溯性、共识机制、安全性、高可用性和不变性等特性。区块链本质上是一个公共数据库,它记录和认证数字资产的持有和传输,并且不可逆,像比特币和以太坊这样的数字货币就是基于这个概念。

很多政府、组织和个人都在使用区块链技术来创建自己的加密货币,世界社交媒体巨头Facebook主导的Libra数字货币项目发布了新版Libra白皮书,最近关于中国人民银行数字货币DCEP进入市场测试也见诸众多媒体报道。

那么我们能否效仿并建立自己的加密货币呢?在本教程中,我们会用 Python 来逐步说明构建数字货币的过程,我们把将要创建的加密货币命名为PyCoin,下面是创建PyCoin的区块链算法基本蓝图:

class Block:
    def __init__():
    #第一个区块类
        pass

    def calculate_hash():   
    #计算每一个区块的哈希值


class BlockChain:

    def __init__(self):
     # 构造方法
    pass

    def construct_genesis(self):
        # 构建初始区块
        pass

    def construct_block(self, proof_no, prev_hash) :
        # 构建新的区块并添加到区块链
        pass

    @staticmethod
    def check_validity():
        # 检验区块链是否有效
        pass

    def new_data(self, sender, recipient, quantity):
        # 添加一个新的交易数据
        pass

    @staticmethod
    def construct_proof_of_work(prev_proof):
        # 避免区块链被攻击
        pass

    @property
    def last_block(self):
        # 返回链上最后一个区块
        return self.chain[-1]

一、创建第一个区块的类

区块链由多个相互连接的区块组成,如果一个区块被篡改,那么链上的其它部分将变得无效。对应以上概念,我们创建以下的初始区块类函数:

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类的实例,从而可以访问与该类关联的方法和属性;

  • index:记录某个区块在区块链中的位置;

  • proof_no:在创建新区块(即挖矿)期间产生的数量;

  • prev_hash:指上一个区块的哈希值;

  • data:记录所有已完成的交易,例如购买数量;

  • timestamp:标记交易的时间戳

类中的第二个方法calculate_hash将由上一个区块的哈希值来生成当前区块的哈希值,SHA-256算法模块将被导入用来获得区块的哈希值。

当值输入加密哈希算法中后,该函数将返回一个256位的字符串,表示该区块所包含的内容。

这就是为什么区块链具有安全性这一特征,因为每个区块都有一个哈希值,而该哈希值将依赖于前一个区块的哈希值。因此,如果有人试图篡改链中的任何区块,其他区块将具有无效的哈希值,从而破坏整个区块链网络。

最终一个区块将会是像下面这样:

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

二、创建区块链的类

顾名思义,区块链的主要思想是将多个区块相互“链接”。因此我们将构建一个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_noprev_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、构建新的区块

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/62356
 
442 次点击