用不到50行的Python代碼構(gòu)建最小的區(qū)塊鏈
譯者注:隨著比特幣的不斷發(fā)展,它的底層技術(shù)區(qū)塊鏈也逐步走進(jìn)公眾視野,引起大眾注意。本文用不到50行的Python代碼構(gòu)建最小的數(shù)據(jù)區(qū)塊鏈,簡單介紹了區(qū)塊鏈去中心化的結(jié)構(gòu)與其實(shí)現(xiàn)原理。

盡管一些人認(rèn)為區(qū)塊鏈?zhǔn)且粋€(gè)等待問題的解決方案,但毫無疑問,這種新技術(shù)是計(jì)算機(jī)的奇跡。但是,區(qū)塊鏈到底是什么呢?
區(qū)塊鏈
它是比特幣或其他加密貨幣進(jìn)行交易的數(shù)字賬本,賬本按時(shí)間順序記錄并對(duì)外公開。
在更一般的術(shù)語中,它是一個(gè)公共數(shù)據(jù)庫,新數(shù)據(jù)存儲(chǔ)在一個(gè)名為塊的容器中,并被添加到一個(gè)不可變鏈(后來的區(qū)塊鏈)中添加了過去的數(shù)據(jù)。在比特幣和其他加密貨幣的情況下,這些數(shù)據(jù)是一組交易記錄。當(dāng)然,數(shù)據(jù)可以是任何類型的。
區(qū)塊鏈技術(shù)已經(jīng)催生了新的、完全數(shù)字化的貨幣,如比特幣和萊特幣,這些貨幣并不是由中央政府發(fā)行或管理的。因此為那些認(rèn)為今天的銀行系統(tǒng)是騙局或終將失敗的人帶來了新的自由。區(qū)塊鏈所包含的以太坊技術(shù)對(duì)分布式計(jì)算進(jìn)行了變革創(chuàng)新,它引入了一些有趣的概念,比如智能合約。
在本文中,我將用不到50行的Python2代碼來做一個(gè)簡單的區(qū)塊鏈。我稱它為SnakeCoin。
首先將定義塊將是什么樣子。在區(qū)塊鏈中,每個(gè)塊都存儲(chǔ)一個(gè)時(shí)間戳和一個(gè)索引。在SnakeCoin中,需要把兩者都存儲(chǔ)起來。為了確保整個(gè)區(qū)塊鏈的完整性,每個(gè)塊都有一個(gè)自動(dòng)識(shí)別散列。與比特幣一樣,每個(gè)塊的散列將是塊索引、時(shí)間戳、數(shù)據(jù)和前塊哈希的加密哈希。數(shù)據(jù)可以是你想要的任何東西。
import hashlib as hasher
class Block:
def __init__(self, index, timestamp, data, previous_hash):
self.index = index
self.timestamp = timestamp
self.data = data
self.previous_hash = previous_hash
self.hash = self.hash_block()
def hash_block(self):
sha = hasher.sha256()
sha.update(str(self.index) +
str(self.timestamp) +
str(self.data) +
str(self.previous_hash))
return sha.hexdigest()
這一步后有塊結(jié)構(gòu),但現(xiàn)在是創(chuàng)建區(qū)塊鏈,所以需要向?qū)嶋H的鏈中添加塊。如前所述,每個(gè)塊都需要上一個(gè)塊的信息。但是按照這個(gè)說法就有一個(gè)問題,區(qū)塊鏈的第一個(gè)區(qū)塊是如何到達(dá)那里的呢?不得不說,第一個(gè)塊,或者說是起源塊,它是一個(gè)特殊的塊。在很多情況下,它是手動(dòng)添加的,或者有獨(dú)特的邏輯允許添加。
下面將創(chuàng)建一個(gè)函數(shù)簡單地返回一個(gè)起源塊以便產(chǎn)生第一個(gè)區(qū)塊。這個(gè)塊是索引0,它具有任意的數(shù)據(jù)值和“前一個(gè)哈?!眳?shù)中的任意值。
import datetime as date def create_genesis_block(): # Manually construct a block with # index zero and arbitrary previous hash return Block(0, date.datetime.now(), "Genesis Block", "0")
現(xiàn)在已經(jīng)創(chuàng)建好了起源塊,接下來需要一個(gè)函數(shù),以便在區(qū)塊鏈中生成后續(xù)的塊。這個(gè)函數(shù)將把鏈中的前一個(gè)塊作為參數(shù),創(chuàng)建要生成的塊的數(shù)據(jù),并使用適當(dāng)?shù)臄?shù)據(jù)返回新塊。當(dāng)新的塊哈希信息來自前面的塊時(shí),區(qū)塊鏈的完整性會(huì)隨著每個(gè)新塊而增加。如果不這樣做,外部組織就更容易“改變過去”,用全新的方式取代已有的鏈條。這一系列的散列可以作為加密的證據(jù),有助于確保一旦將塊添加到區(qū)塊鏈,它就不能被替換或刪除。
def next_block(last_block): this_index = last_block.index + 1 this_timestamp = date.datetime.now() this_data = "Hey! I'm block " + str(this_index) this_hash = last_block.hash return Block(this_index, this_timestamp, this_data, this_hash)
大部分的工作已經(jīng)完成,現(xiàn)在可以創(chuàng)建區(qū)塊鏈了。在這次的示例中,區(qū)塊鏈本身是一個(gè)簡單的Python列表。列表的第一個(gè)元素是起源塊。當(dāng)然,還需要添加后續(xù)的塊,因?yàn)镾nakeCoin是最小的區(qū)塊鏈,這里只添加20個(gè)新的塊??梢杂胒or循環(huán)來生成新塊。
# Create the blockchain and add the genesis block
blockchain = [create_genesis_block()]
previous_block = blockchain[0]
# How many blocks should we add to the chain
# after the genesis block
num_of_blocks_to_add = 20
# Add blocks to the chain
for i in range(0, num_of_blocks_to_add):
block_to_add = next_block(previous_block)
blockchain.append(block_to_add)
previous_block = block_to_add
# Tell everyone about it!
print "Block #{} has been added to the blockchain!".format(block_to_add.index)
print "Hash: {}\n".format(block_to_add.hash)
下面來測(cè)試一下目前產(chǎn)生的區(qū)塊鏈。

看到了吧,這就是區(qū)塊鏈。如果希望在控制臺(tái)中查看更多信息,可以編輯完整的源文件并打印每個(gè)塊的時(shí)間戳或數(shù)據(jù)。
這就是SnakeCoin要提供的所有東西。為了使SnakeCoin規(guī)模達(dá)到今天生產(chǎn)區(qū)塊鏈的規(guī)模,必須添加更多的功能,比如服務(wù)器層,以跟蹤多臺(tái)機(jī)器上的鏈變化,以及在給定的時(shí)間段內(nèi)限制添加的塊數(shù)量的工作算法。
作者丨Gerald Nash
翻譯丨黑色巧克力
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python對(duì)接六大主流數(shù)據(jù)庫(只需三步)
這篇文章主要介紹了Python對(duì)接六大主流數(shù)據(jù)庫(只需三步),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
使用python從三個(gè)角度解決josephus問題的方法
這篇文章主要介紹了使用python從三個(gè)角度解決josephus問題的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03
如何使用Python對(duì)Excel表格進(jìn)行拼接合并
這篇文章主要介紹了Python處理EXCEL基礎(chǔ)操作篇3用Python對(duì)Excel表格進(jìn)行拼接合并,文中提供了解決思路和部分實(shí)現(xiàn)代碼,需要的朋友可以參考下2023-03-03
Python設(shè)計(jì)模式編程中Adapter適配器模式的使用實(shí)例
這篇文章主要介紹了Python設(shè)計(jì)模式編程中Adapter適配器模式的使用實(shí)例,一般來說適配器模式可以細(xì)分為類適配器和對(duì)象適配器模式,需要的朋友可以參考下2016-03-03
Pytorch Dataset,TensorDataset,Dataloader,Sampler關(guān)系解讀
這篇文章主要介紹了Pytorch Dataset,TensorDataset,Dataloader,Sampler關(guān)系,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09
Python?ChineseCalendar包主要類和方法詳解
ChineseCalendar?是一個(gè)?Python?包,用于獲取中國傳統(tǒng)日歷信息。這個(gè)包提供了中國農(nóng)歷、二十四節(jié)氣、傳統(tǒng)節(jié)日、黃歷等信息,這篇文章主要介紹了Python?ChineseCalendar包簡介,需要的朋友可以參考下2023-03-03

