對數(shù)字貨幣的崛起感到新奇的我們,并且想知道其背后的技術(shù)——區(qū)塊鏈是怎樣實現(xiàn)的。
但是完全搞懂區(qū)塊鏈并非易事,我喜歡在實踐中學習,通過寫代碼來學習技術(shù)會掌握得更牢固。通過構(gòu)建一個區(qū)塊鏈可以加深對區(qū)塊鏈的理解。
準備工作
本文要求讀者對Python有基本的理解,能讀寫基本的Python,并且需要對HTTP請求有基本的了解。
我們知道區(qū)塊鏈是由區(qū)塊的記錄構(gòu)成的不可變、有序的鏈結(jié)構(gòu),記錄可以是交易、文件或任何你想要的數(shù)據(jù),重要的是它們是通過哈希值(hashes)鏈接起來的。
環(huán)境準備
環(huán)境準備,確保已經(jīng)安裝Python3.5, pip , django, requests,urllib,json,hashlib
安裝方法:
pip install django requests
同時還需要一個HTTP客戶端,比如Postman,cURL或其它客戶端,本文以Postman為例。
開始創(chuàng)建Blockchain
通過django-admin startproject block創(chuàng)建一個block的項目,在項目中創(chuàng)建一個demo項目django-admin startproject demo ,目錄結(jié)構(gòu):
Blockchain類
在views中創(chuàng)建一個Blockchain類,在構(gòu)造函數(shù)中創(chuàng)建了兩個列表,一個用于儲存區(qū)塊鏈,一個用于儲存交易。
以下是Blockchain類的框架:
class Blockchain(object): def __init__(self): self.chain = [] self.current_transactions = [] def new_block(self): # Creates a new Block and adds it to the chain pass def new_transaction(self): # Adds a new transaction to the list of transactions pass @staticmethod def hash(block): # Hashes a Block pass @property def last_block(self): # Returns the last Block in the chain pass
Blockchain類用來管理鏈條,它能存儲交易,加入新塊等,下面我們來進一步完善這些方法。
塊結(jié)構(gòu)
每個區(qū)塊包含屬性:索引(index),Unix時間戳(timestamp),交易列表(transactions),工作量證明(稍后解釋)以及前一個區(qū)塊的Hash值。
以下是一個區(qū)塊的結(jié)構(gòu):
block = { 'index': 1, 'timestamp': 1506057125.900785, 'transactions': [ { 'sender': "8527147fe1f5426f9dd545de4b27ee00", 'recipient': "a77f5cdfa2934df3954a5c7c7da5df1f", 'amount': 5, } ], 'proof': 324984774000, 'previous_hash': "2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824"}到這里,區(qū)塊鏈的概念就清楚了,每個新的區(qū)塊都包含上一個區(qū)塊的Hash,這是關鍵的一點,它保障了區(qū)塊鏈不可變性。如果攻擊者破壞了前面的某個區(qū)塊,那么后面所有區(qū)塊的Hash都會變得不正確。不理解的話,慢慢消化,可參考區(qū)塊鏈記賬原理
新聞熱點
疑難解答
圖片精選