打造一個最小區塊鏈
讓我們來創造一個最小區塊鏈
僅需不足50行的Python程式碼
注意:本教程的第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)
讓我們來檢驗下工作成果:
別擔心,雖然後面的圖沒截到,但它確實增長到20個了。
完美!我們的區塊鏈已經能正常運轉了。如果您想在控制檯介面中看到更多資訊,你可編輯完整的原始檔並輸出每個區塊的時間戳或資料。
這就是SnakeCoin目前所能做到的一切了。如果要讓SnakeCoin的規模增長跟一些已經被廣泛應用的區塊鏈一樣的話,我們必須新增更多元素,比如服務層來跟蹤在多臺機器上的區塊鏈的變化,以及工作量驗證演算法,以限制一定時間內可以新增的新區塊總數。
如果你想了解更多關於區塊鏈的資訊,你可以去看看比特幣白皮書。
祝您好運!
原文釋出時間為:2018-03-10
本文作者:區塊鏈
本文來源:騰訊雲 雲+社群,如需轉載請聯絡原作者。
相關文章
- 第一章:最小可行區塊鏈區塊鏈
- [譯]如何用 Swift 打造你的第一個區塊鏈 AppSwift區塊鏈APP
- 一文讀懂區塊鏈以及一個區塊鏈的實現區塊鏈
- 區塊鏈有哪些特徵,幣信打造安全好用的區塊鏈區塊鏈特徵
- 一個簡單的區塊鏈區塊鏈
- 用 JavaScript 寫一個區塊鏈JavaScript區塊鏈
- 使用 Go 語言打造區塊鏈(二)Go區塊鏈
- 【譯】用JavaScript寫一個區塊鏈JavaScript區塊鏈
- 區塊鏈應用|CryptoKitties效應:一個與區塊鏈有關的事故區塊鏈
- 區塊鏈教程、區塊鏈指南、區塊鏈中文手冊、區塊鏈原理區塊鏈
- 區塊鏈的幾個小故事.小白學區塊鏈01區塊鏈
- 福布斯:杜拜著眼未來,打造全球首個區塊鏈政府區塊鏈
- 區塊鏈 + 播客:下一個風口!區塊鏈
- 區塊鏈每日一問 | 什麼是區塊鏈的“分叉”?區塊鏈
- 區塊鏈的5個特徵區塊鏈特徵
- 區塊鏈100講:區塊鏈為什麼叫“區塊”“鏈”?區塊鏈
- FISCO BCOS | 搭建第一個區塊鏈網路區塊鏈
- 區塊鏈會是下一個風口麼?區塊鏈
- 走近比特幣:一個故事看懂“區塊鏈”比特幣區塊鏈
- 區塊鏈系列1-區塊鏈概述區塊鏈
- 區塊鏈知識,區塊鏈簡史區塊鏈
- 泉州市積極打造區塊鏈產業生態區塊鏈產業
- 區塊鏈區塊鏈
- 區塊鏈 2.0:介紹(一)區塊鏈
- BSN一面打造“無幣”公鏈,一面提出區塊鏈是項粗笨的技術區塊鏈
- 搭建你的第一個區塊鏈網路(二)區塊鏈
- 用java實現一個簡單的區塊鏈Java區塊鏈
- 50行ruby程式碼開發一個區塊鏈區塊鏈
- 怎麼投資一個好的區塊鏈專案區塊鏈
- 一個簡單的區塊鏈程式碼實現區塊鏈
- FISCO BCOS | 開發第一個區塊鏈應用區塊鏈
- 區塊鏈開發_建立區塊鏈公鏈,聯盟鏈,私有鏈區塊鏈
- 區塊鏈應用|最全區塊鏈生態圖譜釋出,一張圖看清2400個典型專案區塊鏈
- 關於區塊鏈技術的12個誤區 區塊鏈就是比特幣嗎?區塊鏈比特幣
- 區塊鏈 2.0:房地產區塊鏈(四)區塊鏈
- 1.3 初識區塊鏈:區塊鏈分類區塊鏈
- 區塊鏈入門 -- 02 區塊鏈介紹區塊鏈
- 區塊鏈以及區塊鏈技術總結區塊鏈