零基礎如何實現Python來實現一個區塊鏈?我來告訴你就是這么簡單
2018年最火的技術是什么,毫無疑問是區塊鏈,今年年初區塊鏈橫空出世,其實對于我們碼農來說,除了平時埋頭苦干,對新技術需要保持一定敏感性!每一種新的技術的出現都和未來的產業發展非常相關,蘊含著巨大的機會,除了干活還要擴張自己的眼界,對自己大有裨益!
那作為當下最火的語言Python,其實可以干很多事情,今天我們用Python來簡單的實現一個區塊鏈吧,想想都覺得很酷!
01.什么是區塊
首先區塊鏈就是一種去中心化的分布式賬本數據庫,簡單說就是一組區塊組合的鏈條。那么里面每一個單元就是區塊:
區塊上面有幾個重要的屬性:一個數據data,一個pre_hash和自身的hash:
1.我們用hashlib這個庫函數來處理hash計算操作
2.新建一個Block類,來表示區塊,里面有兩個屬性(一個pre_hash,一個data)
3.這個為了簡便用了類屬性@property裝飾器來除了hash的值,即當我用block.hash=xxx的時候,會系統自動調用這個hash函數。
4.這個hash函數很關鍵,以為你區塊鏈里面的都是用sha256來加密的,也是安全性比較搞的一種加密方式,我們***會得到一個十六進制數據字符串值。
區塊中有一個非常特殊,就是創世區塊!它是所有區塊里面的頭,他是父區塊,因此沒有pre_hash
02.定義一個區塊鏈
我們上面已經定義了區塊,下面來定義一個區塊鏈,把一個一個區塊連起來!
我們需要再寫一個類,用一個列表把一個一個區塊存起來,形成一個列表鏈!
1).我們聲明一個BlockChain的類,然后里面設置一個blocks列表數據結果,用來存放區塊,先把父區塊鏈放進去
2).增加一個add_block函數,用來添加區塊:
- 先生成一個新的區塊內存
- 然后添加data和它的hash值
- ***把區塊添加到區塊鏈中
03.實現區塊鏈
我們的區塊和區塊鏈都已經準備好了,是不是有點小興奮,大名鼎鼎的區塊鏈,Python幾十行代碼就模擬出來了,Python確實快速開發的神奇,我們來看一下效果:
- >>
- Prev Hash:
- Data:Genesis Block
- Hash:89eb0ac031a63d2421cd05a2fbe41f3ea35f5c3712ca839cbf6b85c4ee07b7a3
- --------------------------------------------------------------------------------
- PrevHash:89eb0ac031a63d2421cd05a2fbe41f3ea35f5c3712ca839cbf6b85c4ee07b7a3
- Data:Jack send 1 BTC to Sam
- Hash:ad3ebab374b25e6f3d4f0f14465ff3f86020ce036b5b538c2a506de800dac524
- --------------------------------------------------------------------------------
- PrevHash:ad3ebab374b25e6f3d4f0f14465ff3f86020ce036b5b538c2a506de800dac524
- Data:Sam send 2 BTC to lili
- Hash:f9ba725838192731e73b8f28b33c88be9798c314ea7a538fc77e80039413b872
- --------------------------------------------------------------------------------
看我們一共創建了3個區塊:
***個區塊:是父區塊,沒有pre_hash,只有數據和一串hash碼
第二個區塊:是 "Jack發送1個比特幣給Sam"它的區塊的pre_hash指像前面的父區塊hash碼
第三個區塊:是"Sam發送了2個比特幣給lili"它的區塊的pre_hash指像前面的Jack區塊
04.區塊鏈的不可篡改
看完前面基本是不是對區塊鏈有了一個感性的認識,那么區塊鏈最牛逼的地方就是不可篡改,為啥這么說呢?
比如我們修改了中間的一個區塊的內容,會到時它的hash改變,那么后面的區塊的pre_hash就會和前面的區塊的里面hash對應不起來!
我們用代碼看一下:
我把第二個block里面的數據改一下,隨便改一下里面的內容。然后我們看一下這個block里面的hash的變化:
- Prev Hash:
- Data:Genesis Block
- Hash:89eb0ac031a63d2421cd05a2fbe41f3ea35f5c3712ca839cbf6b85c4ee07b7a3
- Valid Block
- --------------------------------------------------------------------------------
- PrevHash:89eb0ac031a63d2421cd05a2fbe41f3ea35f5c3712ca839cbf6b85c4ee07b7a3
- Data:Jack send 1.3 BTC to Alice
- Hash:ec7b877b3a47a74ababf298e047352e8805fed3fa99ad15ab788ec47a70776d0
- Valid Block
- --------------------------------------------------------------------------------
- PrevHash:ad3ebab374b25e6f3d4f0f14465ff3f86020ce036b5b538c2a506de800dac524
- Data:Sam send 2 BTC to lili
- Hash:f9ba725838192731e73b8f28b33c88be9798c314ea7a538fc77e80039413b872
- Invalid Block
- --------------------------------------------------------------------------------
因為修改了第二個區塊的內容,里面hash值也隨著改變,這樣的后面的區塊就無法和前面的區塊的hash對應起來,這就是區塊鏈的不可篡改性!因為是用sha256加密的方法,那怕改動一點點都不行!
好了,上面就是用Python簡單入門區塊鏈,還沒有加入挖礦(工作量證明)的環節,這次通過Python語言本身來理解區塊鏈,不知道大家感覺如何,歡迎留言討論!
文末知識點摘要:99% 會陷入的編程誤區
前天一位讀者在微信上問了我這樣一個問題。
這樣的問題可以衍生出,在學習編程的過程中,那些難以理解的編程概念,我們需要怎么樣去學習。
每個編程語言都會有它自己的特性,比如 C++ 有指針操作,Java 有類的概念,Python 有字典數據結構。這些語言獨有的特性,也正是它們魅力所在。在學習一門編程語言,起初大家都是從最基礎的語法學起。比如 Python,很多教程在簡單介紹了下 Python 的一些語言特點,就會開始固有的章節「編寫你的***個 XXX 代碼」,即寫個輸出「hello world」。
隨著進一步的學習,你會遇到更高級的語法。比如 Python 的多線程、正則表達式、匿名函數、裝飾器等等。掌握這些高級語法,能讓你的代碼更加優雅。但對應的也就更加難以理解。大部分人在學習高級語法的時候,都是一頭霧水。看了很多資料,始終還是無法掌握。
概念學習
這時候你已經陷入「概念學習」的誤區。覺得我一定要先把概念學好,學懂,我才能使用的好。以至于到了***,就像最開始的讀者一樣,越學越抽象,越學越不知所措。
編程原本就是注重實戰的科目,用所學的知識,來解決實際項目。在項目中,磨練已學到的知識。但大部分人卻本末倒置,心想我一定要把編程語法全學好,一個都不能落下。然而這樣的學習效率是非常低下,并且只會越學越迷茫,越學越失去對編程的興趣,最終放棄編程。
項目驅動學習
不要一味的陷入編程語法,要懂的項目驅動學習。你只要稍微把編程基礎知識學習下,然后盡可能多的做項目。在做項目的過程中,肯定會遇到很多困難,也會遇到很多自己不懂的語法。但在項目中遇到的語法,會讓你清楚知道這語法可以做什么。這就好比,你在打游戲的時候,買了一件裝備,知道這件裝備很厲害。這時候你在回去看下裝備的介紹,就會明白裝備為什么那么厲害。
在項目中學習也是如此,遇到難以理解的地方,這時候在回頭查找相關資料,學習的效率會大幅度的提升。那些晦澀難懂的概念,也就很容易理解。