擁有自己第一個區塊鏈——手把手教你用python搭建
看一百本書學習游泳,不如下一次水。實踐永遠是掌握一門知識最有效的方法。
要發車為零基礎小白準備了此文,如果你有一定的python基礎,會獲得更好的閱讀體驗。
python是一款簡單易上手的計算機程序設計語言,本文中代碼所用python版本為最新的python3.6版;用到的python庫為hashlib庫(用來生成哈希值),以及datetime庫(用來生成時間戳)
那我們開始吧。
我們先來梳理一下。
區塊鏈是什麼?
簡單說它就是一個全民參與記錄的大賬本,在坐的各位都能平等地參與其中。
區塊鏈用來幹什麼的?
讓歷史記錄數據的可靠程度達到最高級,因為全民參與都盯著呢,誰都無法偷偷篡改數據。
區塊一般長啥樣?
你腦海中浮現的第一個形象,對,就是它。我們再把它打理一下,給戴上一個哈希散列帽子、拿著本寫著交易數據的紅本本,胸前掛上個印有當前時間戳和員工號的工牌,是的,區塊鏈就長這樣。如果再完成一些訓練,它就可以光榮上崗啦。
鏈是怎麼形成的呢?
依然是上面那個區塊小哥,它第一天到要發車上班,要和崗位上的前一個老員工交接,交接的主要工作就是用自己的哈希帽上的儀器掃描下交接的員工,包括這個老員工的紅本本和哈希帽,這樣老員工的所有信息都變了種形式保存在區塊小哥的哈希帽里了。
如此一來,一方面可以通過區塊小哥頭上的哈希帽查到交接員工的身份,另一方面如果之後交接的老員工偷偷改了自己的工作數據,在區塊小哥這也能查出來。這樣該崗位上的坐過班的所有員工的身份及工作記錄就被哈希帽連接了起來,形成一個區塊鏈。
基於以上內容,我們來直接上手做一個發車鏈(fachechain),這個發車鏈的工作就是記錄新來的員工及其工作內容。
上面我們說到的區塊小哥就具有區塊鏈的一般結構:除了自己的交易數據和當前區塊產生時的時間戳,還包含前個區塊的哈希值。
那麼一個發車鏈中,區塊員工在程序中的定義就是下邊這樣子。
接下來的部分是對代碼的解說,可以左右拖動噢~
classyaofacher:#定義員工類,以後在要發車上班的區塊員工們都長這樣
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_hat()#自己的哈希值
defhash_hat(self):#生成區塊自身的哈希值,也就是按照區塊小哥的情況做出的專屬於自己的哈希帽
sha = hasher.sha256()
sha.update(
bytes(
str(self.index) + str(self.timestamp) + str(self.data) + str(
self.previous_hash),"utf-8"))
returnsha.hexdigest()
我們剛知道區塊小哥需要用哈希帽掃描老員工來完成工作交接,那麼老員工之前交接時得掃描老老員工,老老員工交接時......這麼一直追朔回去,那第一個員工應該掃描誰?
答案是第一個元老員工它一般是被直接手動創造出來的,所以我們也尊稱它為創世區塊。
那麼我們接下來就設計一個創造創世區塊的簡單函數,如下。記得左右拖動,哈哈~
有了創世區塊之後,接下來就是招募新的區塊來換崗~~
我們來生成後續區塊的函數,設計招募工作。(左右拖動~我的滑板鞋)
做好以上準備工作之後,我們就可以發車了。
設計讓發車鏈運行起來的函數!
defmain():
fachechain = [create_genesis_yaofacher()]#創建發車鏈,並為其創造一個創世區塊
previous_yaofacher = fachechain[]#創世區塊變成後一個區塊的『上一個區塊』
num_of_yaofacher =5#定好要在發車鏈上加入幾個發車員工,我們先預定五個
foriinrange(, num_of_yaofacher):#用循環的形式來實現新區塊員工的不斷加入
yaofacher_to_add = next_yaofacher(previous_yaofacher)#在上一個區塊員工的基礎上,創建新的區塊員工
fachechain.append(yaofacher_to_add)#把新區塊員工也加入發車鏈上
previous_yaofacher = yaofacher_to_add
# 需要把要發車員工的工作情況廣播給所有人,這裡先用最簡單的列印來代替廣播
print("員工{} 加入了發車鏈!".format(yaofacher_to_add.index))
print("它的工作是: {}".format(yaofacher_to_add.data))
print("它的哈希值是: {}".format(yaofacher_to_add.hash))
print("時間戳: {}".format(yaofacher_to_add.timestamp))
print("--Y--F--C--
")
if__name__ =="__main__":
main()
以上發車鏈的代碼運行後輸出結果是這樣的
員工1 加入了發車鏈!
它的工作是: 發車 1
它的哈希值是: afdfad2001384f6b2e27d782e4cc12fb67d677f1a56da06065fe66176efcabe8
時間戳: 2018-03-23 07:35:09.541714
--Y--F--C--
員工2 加入了發車鏈!
它的工作是: 發車 2
它的哈希值是: 5a690108397e64247462ed9f9efb24f60aacf22cc7d5bea9231f9b86ace5685c
時間戳: 2018-03-23 07:35:09.541765
--Y--F--C--
員工3 加入了發車鏈!
它的工作是: 發車 3
它的哈希值是: 3a851e8ab43a6ffca3de9372f8cc81063d746504d6ed0275657c4be6114a235f
時間戳: 2018-03-23 07:35:09.541795
--Y--F--C--
員工4 加入了發車鏈!
它的工作是: 發車 4
它的哈希值是: 816680e6ae36f17ee4918cb8dd1226b6fd61ea1d85d76aec294ef831777b0b1e
時間戳: 2018-03-23 07:35:09.541825
--Y--F--C--
員工5 加入了發車鏈!
它的工作是: 發車 5
它的哈希值是: d0361583819228548191f969b2c49d2e2937cce2b0124c8d4f52a1d20b08da82
時間戳: 2018-03-23 07:35:09.541853
--Y--F--C--
到此我們已經完成鏈一個最簡單的區塊鏈——發車鏈的搭建。
如果同學們有興趣進一步了解,我們可以在後續的文章中繼續,在上文發車鏈的基礎上,添加工作量證明模塊、挖礦功能等,來使你的區塊鏈更豐滿。
最後附上完整的代碼,同學們可以直接複製代碼,在以下網站上直接粘貼運行
https://c.runoob.com/compile/9
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import hashlib as hasher
import datetime as date
classyaofacher:#定義員工類,以後在要發車上班的區塊員工們都長這樣
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_hat()#自己的哈希值
defhash_hat(self):#生成區塊自身的哈希值,也就是按照區塊小哥的情況做出的專屬於自己的哈希帽
sha = hasher.sha256()
sha.update(
bytes(
str(self.index) + str(self.timestamp) + str(self.data) + str(
self.previous_hash),"utf-8"))
returnsha.hexdigest()
defcreate_genesis_yaofacher():
returnyaofacher(, date.datetime.now(),"創世","0")#編號為0,時間戳就是被創造時刻的時間,數據內容就為『創世區塊』,前個區塊的哈希部分就可以任意填。
defnext_yaofacher(last_yaofacher):
this_index = last_yaofacher.index +1#新區塊員工編號,在老員工的編號上加1
this_timestamp = date.datetime.now()#新區塊員工坐班時間點
this_data ="發車 "+ str(this_index)
this_hash = last_yaofacher.hash
returnyaofacher(this_index, this_timestamp, this_data, this_hash)#表示引用這個函數後就會得到一個後續的區塊
defmain():
fachechain = [create_genesis_yaofacher()]#創建發車鏈,並為其創造一個創世區塊
previous_yaofacher = fachechain[]#創世區塊變成後一個區塊的『上一個區塊』
num_of_yaofacher =5#定好要在發車鏈上加入幾個發車員工,我們先預定五個
foriinrange(, num_of_yaofacher):#用循環的形式來實現新區塊員工的不斷加入
yaofacher_to_add = next_yaofacher(previous_yaofacher)#在上一個區塊員工的基礎上,創建新的區塊員工
fachechain.append(yaofacher_to_add)#把新區塊員工也加入發車鏈上
previous_yaofacher = yaofacher_to_add
# 需要把要發車員工的工作情況廣播給所有人,這裡先用最簡單的列印來代替廣播
print("員工{} 加入了發車鏈!".format(yaofacher_to_add.index))
print("它的工作是: {}".format(yaofacher_to_add.data))
print("它的哈希值是: {}".format(yaofacher_to_add.hash))
print("時間戳: {}".format(yaofacher_to_add.timestamp))
print("--Y--F--C--
")
if__name__=="__main__":
main()
交流行業可加作者微信:
吳嗷:wfshan。我…...我是一個區塊!嗷~~嗚!
往期原創精選
※幣安通緝黑客治標不治本,該如何保住你的幣?
※區塊鏈是個骰子
TAG:要發車資訊 |