儘管一些人認爲區塊鏈是一個等待問題的解決方案,但毫無疑問,這種新技術是計算機的奇蹟。可是,區塊鏈究竟是什麼呢?git
它是比特幣或其餘加密貨幣進行交易的數字帳本,帳本按時間順序記錄並對外公開。github
在更通常的術語中,它是一個公共數據庫,新數據存儲在一個名爲塊的容器中,並被添加到一個不可變鏈(後來的區塊鏈)中添加了過去的數據。在比特幣和其餘加密貨幣的狀況下,這些數據是一組交易記錄。固然,數據能夠是任何類型的。web
區塊鏈技術已經催生了新的、徹底數字化的貨幣,如比特幣和萊特幣,這些貨幣並非由中央政府發行或管理的。所以爲那些認爲今天的銀行系統是騙局或終將失敗的人帶來了新的自由。區塊鏈所包含的以太坊技術對分佈式計算進行了變革創新,它引入了一些有趣的概念,好比智能合約。算法
在本文中,我將用不到50行的Python2代碼來作一個簡單的區塊鏈。我稱它爲SnakeCoin。數據庫
首先將定義塊將是什麼樣子。在區塊鏈中,每一個塊都存儲一個時間戳和一個索引。在SnakeCoin中,須要把二者都存儲起來。爲了確保整個區塊鏈的完整性,每一個塊都有一個自動識別散列。與比特幣同樣,每一個塊的散列將是塊索引、時間戳、數據和前塊哈希的加密哈希。數據能夠是你想要的任何東西。服務器
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()
1
2
3
4
5
6
7
89
10
11
12114151617
|
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()
|
這一步後有塊結構,但如今是建立區塊鏈,因此須要向實際的鏈中添加塊。如前所述,每一個塊都須要上一個塊的信息。可是按照這個說法就有一個問題,區塊鏈的第一個區塊是如何到達那裏的呢?不得不說,第一個塊,或者說是起源塊,它是一個特殊的塊。在不少狀況下,它是手動添加的,或者有獨特的邏輯容許添加。app
下面將建立一個函數簡單地返回一個起源塊以便產生第一個區塊。這個塊是索引0,它具備任意的數據值和「前一個哈希」參數中的任意值。分佈式
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")
1
256
|
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")
|
如今已經建立好了起源塊,接下來須要一個函數,以便在區塊鏈中生成後續的塊。這個函數將把鏈中的前一個塊做爲參數,建立要生成的塊的數據,並使用適當的數據返回新塊。當新的塊哈希信息來自前面的塊時,區塊鏈的完整性會隨着每一個新塊而增長。若是不這樣作,外部組織就更容易「改變過去」,用全新的方式取代已有的鏈條。這一系列的散列能夠做爲加密的證據,有助於確保一旦將塊添加到區塊鏈,它就不能被替換或刪除。函數
1
2
3
4
5
6
|
1 def next_block(last_block): 2 this_index = last_block.index + 1 3 this_timestamp = date.datetime.now() 4 this_data = "Hey! I'm block " + str(this_index) 5 this_hash = last_block.hash 6 return Block(this_index, this_timestamp, this_data, this_hash)
|
大部分的工做已經完成,如今能夠建立區塊鏈了。在此次的示例中,區塊鏈自己是一個簡單的Python列表。列表的第一個元素是起源塊。固然,還須要添加後續的塊,由於SnakeCoin是最小的區塊鏈,這裏只添加20個新的塊。能夠用for循環來生成新塊。區塊鏈
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
1 # Create the blockchain and add the genesis block 2 blockchain = [create_genesis_block()] 3 previous_block = blockchain[0] 4 5 # How many blocks should we add to the chain 6 # after the genesis block 7 num_of_blocks_to_add = 20 8 9 # Add blocks to the chain 10 for i in range(0, num_of_blocks_to_add): 11 block_to_add = next_block(previous_block) 12 blockchain.append(block_to_add) 13 previous_block = block_to_add 14 # Tell everyone about it! 15 print "Block #{} has been added to the blockchain!".format(block_to_add.index) 16 print "Hash: {}\n".format(block_to_add.hash)
|
下面來測試一下目前產生的區塊鏈。
看到了吧,這就是區塊鏈。若是但願在控制檯中查看更多信息,能夠編輯完整的源文件並打印每一個塊的時間戳或數據。
這就是SnakeCoin要提供的全部東西。爲了使SnakeCoin規模達到今天生產區塊鏈的規模,必須添加更多的功能,好比服務器層,以跟蹤多臺機器上的鏈變化,以及在給定的時間段內限制添加的塊數量的工做算法。
原文出處: Gerald Nash 譯文出處:黑色巧克力