如何使用 Python 建立加密貨幣

買賣虛擬貨幣

本文將向大家介紹如何使用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 hashlibimport timeclass 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 hashlibimport timeclass 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建立了自己的區塊鏈。

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;