來源? | M edium
作者 | arjuna sky kok
整理 /?Aholiab
出品 |?區塊鏈大本營(blockchain_camp)
根據IEEE此前的一項調查, Python已成為最受開發者歡迎的語言之一。 由于其對于技術小白天然友好的特性,以及不斷更新的新功能。Python越來越受到國內外開發者的喜愛。越來越多被用于獨立、大型項目的開發開始使用Python。
20世紀90年代初荷蘭人Guido van Rossum為了打發圣誕節的無趣,決心開發一個新的腳本解釋程序,作為ABC 語言的一種繼承。
之所以選中Python(大蟒蛇的意思)作為該編程語言的名字,是取自英國20世紀70年代首播的電視喜劇《蒙提.派森的飛行馬戲團》(Monty Python's Flying Circus) 。
?
對于區塊鏈開發者來說,Python也是十分實用的語言之一。 今天,我們就Python開發一個簡單的區塊鏈數據結構。
?
在這篇文章中, 一方面我們會對區塊鏈數據結構的基本概念進行講解 ,例如哈希的工作原理, 另一方面,也會以實際代碼來構建一個區塊鏈基本的數據結構, 讓你對區塊鏈和Python的基礎有個基本的理解。
?
說不多說,下面就進入正題!
?
?
從哈希函數說起
?
在區塊鏈中,數據結構是十分重要的基本組成部分,尤其是比特幣。 雖然單一的數據結構無法構建成加密數字貨幣,但理解數據結構對于理解區塊鏈的基本原理是非常有益處的。
?
但在講數字結構之前,我們還是先從哈希講起,以比特幣的SHA-256哈希函數為例,講講如何利用Python去實現哈希的運算。
?
哈希函數,又稱散列算法,是一種從任何一種數據中創建小的數字“指紋”的方法。 散列函數把消息或數據壓縮成摘要,使得數據量變小,將數據的格式固定下來。該函數將數據打亂混合,重新創建一個叫做散列值(或哈希值)的指紋。散列值通常用一個短的隨機字母和數字組成的字符串來代表。
?
對于任意長度的消息,SHA256都會產生一個256bit長的哈希值,稱作消息摘要。
?
這個摘要相當于是個長度為32個字節的數組,通常用一個長度為64的十六進制字符串來表示。
?
來看一個例子:
?
這句話,經過哈希函數SHA256后得到的哈希值為:
?
說回SHA-256,說白了,它就是一個哈希函數。那么我們如何用Python來實現呢?下面代碼展示了用Python實現「hello world」的過程:
?
看到這里你可能會問,SHA-256中的「256」究竟是什么意思? 哈希算法是一個將任意文本轉換為一個256位隨機二進制字符串的過程。在上面的例子中,「hello world」是一個11位的字符(只算字母),經過哈希運算以后,變成了這樣的一串字符:
?
b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9
?
同樣,即使我的文本長度不是11位,生成的字符數也是一樣的。例如:
?
在上面例子中,「I am the best president. Ever.」(意為:我是史上最好的總統),哈希運算之后的字符串一樣為64位。就算輸入的文本是100位,哈希運算后的字符位數也是64位。
?
之所以這樣,是因為字符是16進制的,如果我們把這樣的字符串轉換為2進制,那么就會得到一個256位的2進制字符串。 如下圖所示:
?
這就是SHA-256中,256這個數字的由來。
?
接下來我們就來看看哈希算法有哪些特征。哈希的特征之一就是「無沖突原則」。這個原則是指要得到一個256位的2進制字符串,顯然有不止一個輸入可以做到。
因為256位的輸出長度是固定的,但輸入的長度卻沒有限制,所以輸入的范圍要遠大于輸出,只要能夠窮盡輸入,就有可能得到2個一樣的256位的輸出。
?
話雖如此,不過要找到這樣兩個輸入的難度卻很大。即使是輸入上改動了一點,輸出的結果都會完全不同。如下圖所示:
?
所以,想要找到2中一樣的輸出的唯一方法,是窮盡所有的字幕、數字組合,這幾乎無法做到。 幾率為2的256次方 。
?
這是個多大的數字?展開來就是醬嬸兒的:
115792089237316195423570985008687907853269984665640564039457584007913129639936
?
幾乎相當于10的77次方。這是個什么概念?在460億光年的宇宙內,可見的原子數量也只有10的78次方。 這個數字幾乎相當于宇宙內的原子數量!
?
?
要運算這個數字需要多長時間?以英偉達Geforce 1080 Ti顯卡,浮點運算11.3的算力來運算, 每個哈希需要運算3000次,以每秒鐘3766666666個哈希的速度來運算,找到兩個相同的哈希運算結果,需要計算2的128次方個哈希 。地球上所有的人一起計算,需要的時間如下:
?
?
這比地球存在的實時間都要長。
?
?
用Python創建第一個區塊
?
了解了什么是哈希,我們接著就來說說什么是區塊。實際上,區塊鏈就是一個互相連接的序列。我們接下來創建第一個區塊,也稱為「創世區塊」。代碼如下所示:
?
區塊鏈中會包含交易,交易很好理解,就是誰轉了多少錢給誰。我們把區塊進行序列,這樣它就可以進行哈希運算:
?
這樣,我們就得到了另一個區塊,我們姑且稱它為「區塊2」:
再對區塊2進行哈希運算:
得到了「區塊3」。
?
再對區塊3進行哈希運算,得到了「區塊4」。
這樣一來,想要確定區塊上的數據沒有被篡改,我只需要檢查最后一個區塊的哈希就行了。而不是從創世區塊開始檢查。這一原理也杜絕了區塊鏈上數據被攢該的可能。
?
?
通過以上代碼,可以得到下面結果:
?
這樣,用Python實現簡單的區塊鏈開發的演示就結束了。 Python是一門強大的語言,區塊鏈是一個強大的信用工具,這兩者結合,勢必能創造出新的可能性。
?
怎么樣,今天的內容你都學會了嗎?還想看哪些技術教程,歡迎留言告訴營長!
?
?
參考鏈接: ?
https://medium.com/coinmonks/building-a-simple-blockchain-data-structure-with-python-e7ebd448647a
https://blog.csdn.net/u011583927/article/details/80905740
推薦閱讀:
-
干貨 | 幾行代碼就能擼一個文檔注冊Dapp,一文學會以太坊Dapp開發
-
預警,CSW的50萬枚塵封BTC即將重返市場
-
TechHQ首席架構師濃縮1000小時的項目經驗總結出5大技能點,架構師必看!
-
AI 假冒老板騙取 24.3 萬美元!
-
倒計時1天 | 2019 AI ProCon報名通道即將關閉(附參會指南)
-
亞馬遜首席科學家李沐「實訓營」國內獨家直播,馬上報名?!
-
Android 10 重磅來襲: 支持 5G 與折疊屏、隱私安全全面升級!
-
阿里云 CDN 業務基于邊緣容器的云原生轉型實踐
老鐵在看了嗎?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
