如何用Python 3.9.4创建加密货币 详解

huobi管理981个月前

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


要求

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


入门

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


我将参考dzone.com的代码:


class Block(object):

    def __init__(self):

        pass



    def compute_hash(self):

        pass

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


class Blockchain(object):

    def __init__(self):

        pass



    def build_genesis(self):

        pass



    def build_block(self):

        pass



    @staticmethod

    def confirm_validity(block, previous_block):

        pass



    def get_data(self, sender, receiver, amount):

        pass



    @staticmethod

    def proof_of_work(last_proof):

        pass



    @property

    def latest_block(self):

        pass

积木类

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


import hashlib

import time



class Block(object):

    def __init__(self, index, proof_number, previous_hash, data, timestamp=None):

        self.index = index

        self.proof_number = proof_number

        self.previous_hash = previous_hash

        self.data = data

        self.timestamp = timestamp or time.time()



    @property    

    def compute_hash(self):

        string_block = "{}{}{}{}{}".format(self.index, self.proof_number, self.previous_hash, self.data, self.timestamp)

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


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


索引用于查看块在链中的哪个位置。

我认为,前者是不言而喻的。

数据是一个对象,它收集有关该区块的所有信息(id,金额,发送者,接收者等)。

时间戳是指生成块的时刻。

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


链条类

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


class Blockchain(object):

    def __init__(self):

        self.chain = []

        self.current_data = []

        self.nodes = set()

        self.build_genesiss()

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


该self.chain是一个变量,它存储所有的块。

该self.current_data是一个变量,它存储所有关于该块的信息。

这self.nodes是用于设置节点的示例方法。

所述self.build_genesis方法变量是创建第一块中的方法。

建立创世方法

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




def build_genesis(self):

        self.build_block(proof_number=0, previous_hash=0)



    def build_block(self, proof_number, previous_hash):

        block = Block(

            index=len(self.chain),

            proof_number=proof_number,

            previous_hash=previous_hash,

            data=self.current_data

        )



        self.current_data = []

        self.chain.append(block)



        return block

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


确认有效性方法

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




@staticmethod

    def confirm_validity(block, previous_block):

        if previous_block.index + 1 != block.index:

            return False



        elif previous_block.compute_hash() != block.previous_hash:

            return False



        elif block.timestamp & lt; = previous_block.timestamp:

            return False



        return True

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


获取数据方法

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




def get_data(self, sender, receiver, amount):

            self.current_data.append({

                'sender': sender,

                'receiver': receiver,

                'amount': amount

            })



            return True

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


工作证明

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


让我们创建def block_mining方法:


def block_mining(self, details_miner):

        self.get_data(

            sender="0",

            receiver=details_miner,

            quantity=1,

        )



        last_block = self.latest_block

        last_proof_number = last_block.proof_number

        proof_number = self.proof_of_work(last_proof_number)

        last_hash = last_block.compute_hash



        block = self.build_block(proof_number, last_hash)



        return vars(block)

定稿

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


return self.chain[-1]

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


bc = Blockchain()

print("READY")

print(bc.chain)

#output:

READY

[<__main__.Block object at 0x00000241A23C5EE0>]

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


完整代码示例:

import hashlib

import time





class Block(object):

    def __init__(self, index, proof_number, previous_hash, data, timestamp=None):

        self.index = index

        self.proof_number = proof_number

        self.previous_hash = previous_hash

        self.data = data

        self.timestamp = timestamp or time.time()



    @property

    def compute_hash(self):

        string_block = "{}{}{}{}{}".format(

            self.index, self.proof_number, self.previous_hash, self.data, self.timestamp)

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





class Blockchain(object):

    def __init__(self):

        self.chain = []

        self.current_data = []

        self.nodes = set()

        self.build_genesis()



    def build_genesis(self):

        self.build_block(proof_number=0, previous_hash=0)



    def build_block(self, proof_number, previous_hash):

        block = Block(

            index=len(self.chain),

            proof_number=proof_number,

            previous_hash=previous_hash,

            data=self.current_data

        )



        self.current_data = []

        self.chain.append(block)



        return block



    @staticmethod

    def confirm_validity(block, previous_block):

        if previous_block.index + 1 != block.index:

            return False



        elif previous_block.compute_hash() != block.previous_hash:

            return False



        elif block.timestamp >= previous_block.timestamp:

            return False



        return True



    def get_data(self, sender, receiver, amount):

        self.current_data.append({

            'sender': sender,

            'receiver': receiver,

            'amount': amount

        })



        return True



    @staticmethod

    def proof_of_work(last_proof):

        pass



    @property

    def latest_block(self):

        return self.chain[-1]



    def block_mining(self, details_miner):

        self.get_data(

            sender="0",

            receiver=details_miner,

            quantity=1,

        )



        last_block = self.latest_block

        last_proof_number = last_block.proof_number

        proof_number = self.proof_of_work(last_proof_number)

        last_hash = last_block.compute_hash



        block = self.build_block(proof_number, last_hash)



        return vars(block)





bc = Blockchain()

print("READY")

print(bc.chain)

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


上一篇:火币btc怎么转换usdt,比特币转泰达币 图文

下一篇:火币比特币合约对冲交易赚钱技巧 100%胜率

网友评论