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

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