怎樣用五十行Python代碼自造比特幣?

一篇譯文,原文位於:用不到 50 行的 Python 代碼構建最小的區塊鏈

引用

譯者註:隨著比特幣的不斷發展,它的底層技術區塊鏈也逐步走進公眾視野,引起大眾注意。本文用不到50行的Python代碼構建最小的數據區塊鏈,簡單介紹了區塊鏈去中心化的結構與其實現原理。

儘管一些人認為區塊鏈是一個等待問題的解決方案,但毫無疑問,這種新技術是計算機的奇蹟。但是,區塊鏈到底是什麼呢?

區塊鏈

它是比特幣或其他加密貨幣進行交易的數字賬本,賬本按時間順序記錄並對外公開。

在更一般的術語中,它是一個公共資料庫,新數據存儲在一個名為塊的容器中,並被添加到一個不可變鏈(後來的區塊鏈)中添加了過去的數據。在比特幣和其他加密貨幣的情況下,這些數據是一組交易記錄。當然,數據可以是任何類型的。

區塊鏈技術已經催生了新的、完全數字化的貨幣,如比特幣和萊特幣,這些貨幣並不是由中央政府發行或管理的。因此為那些認為今天的銀行系統是騙局或終將失敗的人帶來了新的自由。區塊鏈所包含的以太坊技術對分散式計算進行了變革創新,它引入了一些有趣的概念,比如智能合約。

在本文中,我將用不到50行的Python2代碼來做一個簡單的區塊鏈。我稱它為SnakeCoin。

首先將定義塊將是什麼樣子。在區塊鏈中,每個塊都存儲一個時間戳和一個索引。在SnakeCoin中,需要把兩者都存儲起來。為了確保整個區塊鏈的完整性,每個塊都有一個自動識別散列。與比特幣一樣,每個塊的散列將是塊索引、時間戳、數據和前塊哈希的加密哈希。數據可以是你想要的任何東西。

import hashlib as hasherclass Block:def __init__(self, index, timestamp, data, previous_hash):self.index = indexself.timestamp = timestampself.data = dataself.previous_hash = previous_hashself.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()

這一步後有塊結構,但現在是創建區塊鏈,所以需要向實際的鏈中添加塊。如前所述,每個塊都需要上一個塊的信息。但是按照這個說法就有一個問題,區塊鏈的第一個區塊是如何到達那裡的呢?不得不說,第一個塊,或者說是起源塊,它是一個特殊的塊。在很多情況下,它是手動添加的,或者有獨特的邏輯允許添加。

下面將創建一個函數簡單地返回一個起源塊以便產生第一個區塊。這個塊是索引0,它具有任意的數據值和「前一個哈希」參數中的任意值。

import datetime as datedef create_genesis_block():# Manually construct a block with# index zero and arbitrary previous hashreturn Block(0, date.datetime.now(), "Genesis Block", "0")

現在已經創建好了起源塊,接下來需要一個函數,以便在區塊鏈中生成後續的塊。這個函數將把鏈中的前一個塊作為參數,創建要生成的塊的數據,並使用適當的數據返回新塊。當新的塊哈希信息來自前面的塊時,區塊鏈的完整性會隨著每個新塊而增加。如果不這樣做,外部組織就更容易「改變過去」,用全新的方式取代已有的鏈條。這一系列的散列可以作為加密的證據,有助於確保一旦將塊添加到區塊鏈,它就不能被替換或刪除。

def next_block(last_block):this_index = last_block.index + 1this_timestamp = date.datetime.now()this_data = "Hey! Im block " + str(this_index)this_hash = last_block.hashreturn Block(this_index, this_timestamp, this_data, this_hash)

大部分的工作已經完成,現在可以創建區塊鏈了。在這次的示例中,區塊鏈本身是一個簡單的Python列表。列表的第一個元素是起源塊。當然,還需要添加後續的塊,因為SnakeCoin是最小的區塊鏈,這裡只添加20個新的塊。可以用for循環來生成新塊。

# Create the blockchain and add the genesis blockblockchain = [create_genesis_block()]previous_block = blockchain[0]# How many blocks should we add to the chain# after the genesis blocknum_of_blocks_to_add = 20# Add blocks to the chainfor 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: {}
".format(block_to_add.hash)

下面來測試一下目前產生的區塊鏈。

看到了吧,這就是區塊鏈。如果希望在控制台中查看更多信息,可以編輯完整的源文件並列印每個塊的時間戳或數據。

這就是SnakeCoin要提供的所有東西。為了使SnakeCoin規模達到今天生產區塊鏈的規模,必須添加更多的功能,比如伺服器層,以跟蹤多台機器上的鏈變化,以及在給定的時間段內限制添加的塊數量的工作演算法。

如果想了解更多的技術信息,可以在這裡查看原始的比特幣白皮書。

——————————————————————

譯文結束!

當然這個區塊鏈示例實際上是一個非常簡單的範例,想要和比特幣一樣火爆不太現實,不過做一個大致的展示還是可以的。

你想更深入了解學習Python知識體系,你可以看一下我們花費了一個多月整理了上百小時的幾百個知識點體系內容:

【超全整理】《Python自動化全能開發從入門到精通》筆記全放送


推薦閱讀:

[23] Python模塊和引入
python中的時間處理大總結
用數據告訴你在上海你得這樣租(sheng)房(dian)子(qian)
Python · 樸素貝葉斯(零)· 簡介

TAG:Python | Python入门 | 区块链Blockchain |