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