打造一個最小區塊鏈

雪花又一年發表於2018-04-17

讓我們來創造一個最小區塊鏈

僅需不足50行的Python程式碼

1620

注意:本教程的第2部分可以在這個連結找到。

雖然有人認為區塊鏈本身仍有很多問題需要解決,但毫無疑問,這種新穎的技術是計算機界的奇蹟。 但是,究竟什麼是區塊鏈?

區塊鏈

區塊鏈是一種數字賬本,它會按照時間順序公開地記錄比特幣等數字貨幣產生的交易記錄。

通俗點來說,它就是一個公共資料庫。新的資料被儲存到一個稱為區塊的容器中,接著會被不可逆地新增到已經有很多資料的資料鏈中,(這時候就可以叫它區塊鏈了)。在對比特幣和其他加密貨幣來說,這些資料型別就是是交易資料組。當然,這些資料當然可以是任何其他型別。

區塊鏈技術帶來了全新數字貨幣的崛起,如比特幣和萊特幣,而這些貨幣並非由中央機構發行或管理。這為一些認為當今的銀行體系是一種騙局或失敗品的人帶來了福音。區塊鏈中的新技術,以太坊也為分散式計算帶來了革新,以太坊引入了智慧合約等有趣的概念。

在本文中,我將用少於50行的Python 2程式碼創造一個簡單的區塊鏈。我叫他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()

搞定!現在我們有區塊結構了,但我們要的是區塊。所以我們就得把區塊新增到資料鏈中。正如我前面提到的,每個區塊需要來自前一個區塊的資訊。那麼問題就來了:區塊鏈中的第一個區塊是怎樣產生的?其實首個區塊是一個特殊的區塊,他也被稱為起源區塊。一般它會有獨特的邏輯以允許新增,或者我們直接手動新增。

為了簡化,我們將建立一個只需返回起源區塊的函式,該起源區塊的索引為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")

現在我們建立了一個起源區塊,我們需要一個函式來生成區塊鏈中的後續區塊。該函式將以鏈中的前一個區塊作為引數,建立要生成的區塊的資料,並返回具有其相應資料的新塊。新產生的區塊會儲存先前區塊中的雜湊值,區塊鏈的完整性隨著每個新的區塊而增加。如果我們沒有這樣做,其他人會很容易篡改歷史記錄,並用自己的全新資料替代我們的鏈條。這個雜湊鏈作為加密證明,有助於確保一旦新區塊被新增到區塊鏈中,它不能被替換或刪除。

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)

這樣我們就完成了主要工作了。現在,我們可以開始打造我們自己的區塊鏈!在我們的例子中,區塊鏈本身就是一個簡單的Python列表。列表的第一個元素是起源區塊。當然,我們需要新增後續的區塊。因為SnakeCoin是最小的區塊鏈,所以我們只新增20個新區塊就行了。我們可以用for迴圈來做到這一點。

# 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: {}
".format(block_to_add.hash) 

讓我們來檢驗下工作成果:

1620

別擔心,雖然後面的圖沒截到,但它確實增長到20個了。

完美!我們的區塊鏈已經能正常運轉了。如果您想在控制檯介面中看到更多資訊,你可編輯完整的原始檔並輸出每個區塊的時間戳或資料。

這就是SnakeCoin目前所能做到的一切了。如果要讓SnakeCoin的規模增長跟一些已經被廣泛應用的區塊鏈一樣的話,我們必須新增更多元素,比如服務層來跟蹤在多臺機器上的區塊鏈的變化,以及工作量驗證演算法,以限制一定時間內可以新增的新區塊總數。

如果你想了解更多關於區塊鏈的資訊,你可以去看看比特幣白皮書。

祝您好運!

原文釋出時間為:2018-03-10
本文作者:區塊鏈
本文來源:騰訊雲 雲+社群,如需轉載請聯絡原作者。


相關文章