您好,登錄后才能下訂單哦!
這篇文章主要介紹“怎么用Python創(chuàng)建加密貨幣”,在日常操作中,相信很多人在怎么用Python創(chuàng)建加密貨幣問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”怎么用Python創(chuàng)建加密貨幣”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!
本文將向大家介紹如何使用Python 3.9.4建立屬于自己的區(qū)塊鏈和加密貨幣。在構(gòu)建自己的加密貨幣或區(qū)塊鏈之前,您需要了解Python和區(qū)塊鏈的基礎(chǔ)知識(shí)。區(qū)塊鏈或許看起來(lái)很復(fù)雜,但可以肯定的是其核心概念確實(shí)非常簡(jiǎn)單。
確保您已安裝最新版本的Python。
創(chuàng)建一個(gè)新的Python文件,文件名app.py。首先,我們應(yīng)該創(chuàng)建一個(gè)Block類。
我將參考dzone.com的代碼:
class Block(object): def __init__(self): pass def compute_hash(self): pass
我們還需要?jiǎng)?chuàng)建Blockchain類藍(lán)圖:
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
現(xiàn)在,讓我們看一下我們剛剛創(chuàng)建的這些類。塊類將如下所示:
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類采用幾個(gè)參數(shù):index,proof_number,previous_hash,data和timestamp。
索引用于查看塊在鏈中的哪個(gè)位置。
我認(rèn)為,前者是不言而喻的。
數(shù)據(jù)是一個(gè)對(duì)象,它收集有關(guān)該區(qū)塊的所有信息(id,金額,發(fā)送者,接收者等)。
時(shí)間戳是指生成塊的時(shí)刻。
在def compute_hash()方法中,我們的哈希將使用hash方法創(chuàng)建。
單獨(dú)的塊沒(méi)有任何價(jià)值,并且使用鏈來(lái)加密數(shù)據(jù),因此很重要。讓我們?yōu)镃hain類創(chuàng)建構(gòu)造函數(shù):
class Blockchain(object): def __init__(self): self.chain = [] self.current_data = [] self.nodes = set() self.build_genesiss()
讓我們看一下這些參數(shù)的作用。
該self.chain是一個(gè)變量,它存儲(chǔ)所有的塊。
該self.current_data是一個(gè)變量,它存儲(chǔ)所有關(guān)于該塊的信息。
這self.nodes是用于設(shè)置節(jié)點(diǎn)的示例方法。
所述self.build_genesis方法變量是創(chuàng)建第一塊中的方法。
此方法將用于創(chuàng)建初始?jí)K。因此,我們需要調(diào)用該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
在此方法中,創(chuàng)建一個(gè)新Block對(duì)象并輸入所需的參數(shù):索引,證明,previous_hash和數(shù)據(jù)。然后,我們?cè)O(shè)置當(dāng)前數(shù)據(jù)并將該塊附加到鏈中。
創(chuàng)建加密貨幣/區(qū)塊鏈的重要部分是檢查區(qū)塊是否有效。我們用一種新方法來(lái)做到這一點(diǎn)。
@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
讓我們解釋一下:此方法使用幾個(gè)if語(yǔ)句來(lái)檢查Block是否是它應(yīng)該的塊。它c(diǎn)ompute_hash()再次使用該方法。
當(dāng)然,您希望能夠讀取您的塊和區(qū)塊鏈的數(shù)據(jù),這是通過(guò)以下get_data()方法完成的:
def get_data(self, sender, receiver, amount): self.current_data.append({ 'sender': sender, 'receiver': receiver, 'amount': amount }) return True
該方法非常簡(jiǎn)單,它采用三個(gè)參數(shù)并將它們添加到對(duì)象中。
在這個(gè)項(xiàng)目中,我們將添加一個(gè)工作量證明算法以使挖掘成為可能。
讓我們創(chuàng)建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)
為了結(jié)束我們的項(xiàng)目,我們將以下代碼行添加到def latest_block方法中,
return self.chain[-1]
現(xiàn)在,我們將測(cè)試我們的項(xiàng)目:
bc = Blockchain() print("READY") print(bc.chain) #output: READY [<__main__.Block object at 0x00000241A23C5EE0>]
當(dāng)您看到類似的結(jié)果時(shí),您的區(qū)塊鏈藍(lán)圖已成功構(gòu)建。如果您想添加額外的功能,則可以這樣做,請(qǐng)告訴我您所構(gòu)建的內(nèi)容!
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創(chuàng)建了自己的區(qū)塊鏈。
到此,關(guān)于“怎么用Python創(chuàng)建加密貨幣”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。