欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

從0編寫(xiě)區(qū)塊鏈之用python解釋區(qū)塊鏈最基本原理

 更新時(shí)間:2022年02月14日 15:33:20   作者:tyler_download  
人工智能和區(qū)塊鏈誕生至今已經(jīng)有了十幾年,當(dāng)這些技術(shù)出現(xiàn)時(shí),人們都說(shuō)他們會(huì)改變世界,但至今為止,這兩項(xiàng)技術(shù)對(duì)現(xiàn)實(shí)的影響依然有限,接下來(lái)通過(guò)本文介紹下從0編寫(xiě)區(qū)塊鏈之用python解釋區(qū)塊鏈最基本原理,需要的朋友可以參考下

人工智能和區(qū)塊鏈誕生至今已經(jīng)有了十幾年,當(dāng)這些技術(shù)出現(xiàn)時(shí),人們都說(shuō)他們會(huì)改變世界,但至今為止,這兩項(xiàng)技術(shù)對(duì)現(xiàn)實(shí)的影響依然有限。從技術(shù)上看人工智能的原理其實(shí)是從大量數(shù)據(jù)中尋找規(guī)律或模式,但區(qū)塊鏈的技術(shù)原理是什么呢?在我看來(lái)區(qū)塊鏈的原理一直處于云里霧里,有很多近乎玄學(xué)的解釋將其籠罩,有人從經(jīng)濟(jì)學(xué)解釋?zhuān)腥藦纳鐣?huì)學(xué)解釋?zhuān)瑥?rdquo;人文“角度解釋的區(qū)塊鏈總是過(guò)于夸大其詞,這些說(shuō)法中往往又包含不良用心。

由此我想去蕪存真,我們不用關(guān)心區(qū)塊鏈如何”改變世界“,我們就從純技術(shù)角度去探討,其實(shí)區(qū)塊鏈和人工智能一樣,從技術(shù)的角度看去,他們都有著極為美妙的設(shè)計(jì)思想,這些設(shè)計(jì)的美妙就像唐詩(shī)宋詞,就像畢加索的話(huà),如果我們沒(méi)有去欣賞它的美,那豈不可惜。相比于人工智能,我認(rèn)為區(qū)塊鏈在技術(shù)上更容易被普通人觸碰,因?yàn)榍罢咝枰罅康臄?shù)據(jù)和算力,而后者只要我們掌握其技術(shù)原理就能參與其中,不需要太高的硬件門(mén)檻。

話(huà)不多說(shuō),我們看看如何用python代碼把最基本的區(qū)塊鏈原理編寫(xiě)出來(lái)。首先我們看區(qū)塊鏈的數(shù)據(jù)結(jié)構(gòu),它包含三部分信息,一是用于標(biāo)志自己的id,它是一個(gè)整數(shù),第二個(gè)是用于記錄前一個(gè)區(qū)塊的id,也是一個(gè)整數(shù),由于區(qū)塊用于記錄信息,因此它還包含一個(gè)字段,我們用history來(lái)表示,這個(gè)字段用來(lái)記錄當(dāng)前發(fā)生了的信息,區(qū)塊鏈最大的作用就是讓這段信息可驗(yàn)證而且不可更改,我們先看數(shù)據(jù)結(jié)構(gòu)的定義,先創(chuàng)建文件block.:

class Block:
    def __init__(self):
        self.id = None
        self.history = None
        self.parent_id = None

接下來(lái)我們看看區(qū)塊如何行成”鏈“,同時(shí)如何記錄信息。假設(shè)我們想要記錄這么一個(gè)事件:張三想跟李四用一百塊買(mǎi)三條魚(yú),李四收到一百塊后給了張三三條魚(yú)”,那么我們可以使用下面代碼用區(qū)塊鏈進(jìn)行記錄,創(chuàng)建main.py,然后給出如下代碼:

from block import *

block_A = Block()
block_A.id = 1
block_A.history = '張三想要三條魚(yú)'
block_B = Block()
block_B.id = 2
block_B.parent_id = block_A.id
block_B.history = '張三跟李四買(mǎi)三條魚(yú)'
block_C = Block()
block_C.id = 3
block_C.parent_id = block_B.id
block_C.history = '張三給李四一百塊'
block_D = Block()
block_D.id = 3
block_D.parent_id = block_B.id
block_D.history = '李四收到張三一百塊'
block_E = Block()
block_E.id = 3
block_E.parent_id = block_B.id
block_E.history = '李四給張三三條魚(yú)'

從代碼上看不同區(qū)塊之間通過(guò)parent_id形成了前后連接關(guān)系,這就是區(qū)塊鏈中的“鏈”,但現(xiàn)在還有一個(gè)嚴(yán)重問(wèn)題,那就是信息可以更改,假設(shè)張三想來(lái)著,他把block_E里面的history改成李四給張三兩條魚(yú),然后找李四算賬那怎辦,或者李四想賴(lài)賬,把block_D中的history改成“李四收到張三五十塊”,然后又找張三要錢(qián),那怎么辦。

為了確保信息不被更改,我們需要對(duì)每個(gè)區(qū)塊的內(nèi)容進(jìn)行加密或者哈希,因此上面代碼修改如下:

# This is a sample Python script.

# Press ?R to execute it or replace it with your code.
# Press Double ? to search everywhere for classes, files, tool windows, actions, and settings.
from block import *
import hashlib
import json
block_A = Block()
block_A.id = 1
block_A.history = '張三想要三條魚(yú)'
block_B = Block()
block_B.id = 2
block_B.parent_id = block_A.id
block_B.history = '張三跟李四買(mǎi)三條魚(yú)'
block_B.parent_hash = hashlib.sha256(json.dumps(block_A.__dict__).encode('utf-8')).hexdigest()
block_C = Block()
block_C.id = 3
block_C.parent_id = block_B.id
block_C.history = '張三給李四一百塊'
block_C.parent_hash = hashlib.sha256(json.dumps(block_B.__dict__).encode('utf-8')).hexdigest()
block_D = Block()
block_D.id = 4
block_D.parent_id = block_C.id
block_D.history = '李四收到張三一百塊'
block_D.parent_hash = hashlib.sha256(json.dumps(block_C.__dict__).encode('utf-8')).hexdigest()
block_E = Block()
block_E.id = 5
block_E.parent_id = block_B.id
block_E.history = '李四給張三三條魚(yú)'
block_E.parent_hash = hashlib.sha256(json.dumps(block_D__dict__).encode('utf-8')).hexdigest()

有了哈希,如何任何一個(gè)區(qū)塊被修改,那么當(dāng)前區(qū)塊和后續(xù)區(qū)塊的哈希都得修改,例如李四把block_C的history改成“張三給李四五十塊”,那么我們看到李四必須要把block_C到block_E的哈希全部改了,如果這條鏈很長(zhǎng)的話(huà),李四改起來(lái)就非常吃力。同時(shí)為了確保信息的可靠性,
張三和李四需要把上面的區(qū)塊鏈發(fā)送給其他一百個(gè)人進(jìn)行存儲(chǔ),這樣一來(lái)張三或李四想要賴(lài)賬那就更加困難,因?yàn)橛幸话賯€(gè)見(jiàn)證者。

區(qū)塊鏈信息記錄的特點(diǎn)是只增不刪,因此張三想要賴(lài)賬的話(huà),他只能在上面基礎(chǔ)上再增加一個(gè)區(qū)塊,也就是block_F, 里面的history寫(xiě)上了“張三收到李四兩條魚(yú)”,然后將這個(gè)區(qū)塊發(fā)給其他100個(gè)人,為了防止隨意添加區(qū)塊造成信息混亂的情況,在區(qū)塊鏈中有一個(gè)專(zhuān)門(mén)的角色負(fù)責(zé)將新增的區(qū)塊添加到現(xiàn)有的區(qū)塊鏈上,這個(gè)角色拿到區(qū)塊數(shù)據(jù)后,,在不考慮parent_hash字段的情況下將數(shù)據(jù)序列化,接著找到一個(gè)特定字符串,這個(gè)字符串必須滿(mǎn)足給定要求,那就是它與區(qū)塊序列化的數(shù)據(jù)合并后,算出來(lái)的哈希值必須以5個(gè)0開(kāi)頭,我們從代碼上看看這是什么意思:

#proof-of-work
block_F = Block()
block_F.id = 6
block_E.parent_id = block_E.id
block_E.history = '李四給張三三條魚(yú)'
#注意我們這里沒(méi)有設(shè)置parent_hash字段
block_F_serialized = json.dumps(block_F.__dict__).encode('utf-8')
print(block_F_serialized)
for i in range(10000000):
    proof_of_work = str(i).encode('utf-8')
    result = hashlib.sha256(block_F_serialized + proof_of_work).hexdigest()
    if result[:5] == '00000': #哈希結(jié)果只有以5個(gè)0開(kāi)頭才能添加區(qū)塊到公鏈
        print(proof_of_work)
        print(result)
        break 
    #找到特定字符串后獲取回報(bào),所謂挖礦就是干這個(gè)事情

上面代碼運(yùn)行后所得結(jié)果為:

b'{"id": 6, "history": null, "parent_id": null, "parent_hash": null}'
b'553448'
0000034ba1dabbf794212082b47a6bcc98cb33eed86d363993270ca58e243bb9

也就是說(shuō)特定字符串內(nèi)容為"553448",它能使得新區(qū)塊內(nèi)容和它結(jié)合后算出來(lái)的哈希以5個(gè)0開(kāi)頭,專(zhuān)門(mén)負(fù)責(zé)給區(qū)塊查找這種字符串的角色就叫“礦工”,這個(gè)查找過(guò)程就叫挖礦,一旦找到這個(gè)特定字符串后他就能獲取回報(bào),也就是加密貨幣。

現(xiàn)在我們實(shí)現(xiàn)了數(shù)據(jù)的修改很困難,同時(shí)區(qū)塊的添加也需要付出一定成本,但假設(shè)李四就是拼了老命也想把以前記錄的信息修改掉,并為此愿意付出一切代價(jià),假設(shè)當(dāng)前區(qū)塊鏈有1000個(gè)數(shù)據(jù)塊,他想修改第一個(gè)塊記錄的信息,于是他修改了后面999個(gè)數(shù)據(jù)塊的數(shù)據(jù),但原始數(shù)據(jù)被其他人掌握著,因此他自己修改的數(shù)據(jù)就不會(huì)被采納。由于區(qū)塊鏈數(shù)據(jù)被分布存儲(chǔ)在不同地方,于是在某項(xiàng)地方數(shù)據(jù)可能會(huì)被修改,這樣就會(huì)出現(xiàn)數(shù)據(jù)不一致的情況,區(qū)塊鏈還有一個(gè)重要任務(wù)就是在這種情況下達(dá)成共識(shí)。

同時(shí)當(dāng)有新的區(qū)塊需要加入公鏈時(shí),我們需要將新增區(qū)塊通過(guò)廣播的方式通知所有人,于是就有個(gè)問(wèn)題,那就是有些人較早獲得通知,有些獲得通知較晚,更有可能你會(huì)同時(shí)收到多個(gè)消息,假設(shè)現(xiàn)在公鏈上最后一個(gè)消息編號(hào)為5,此時(shí)你同時(shí)收到了兩個(gè)消息東邊發(fā)來(lái)的消息為history:王五想跟李四買(mǎi)一斤蝦;西邊發(fā)來(lái)的消息為history:李六想跟張三買(mǎi)兩條魚(yú),那么我們應(yīng)該將哪個(gè)消息作為編號(hào)6呢,此時(shí)的做法是先等等,如果過(guò)了一會(huì)西邊發(fā)來(lái)了5條消息,同時(shí)東邊只發(fā)來(lái)2條消息,那么就把消息少的拋棄,將消息多的經(jīng)過(guò)處理后添加到公鏈。

通過(guò)選擇數(shù)據(jù)多的添加到公鏈有個(gè)好處就是讓數(shù)據(jù)的修改變得幾乎不可能,例如李四辛辛苦苦花了半小時(shí)修改了999個(gè)區(qū)塊,然后想要廣播給其他人,但是很可能這段時(shí)間內(nèi)有10000個(gè)新區(qū)塊生成,于是他修改的999個(gè)區(qū)塊就會(huì)被丟棄掉,這樣他就無(wú)法進(jìn)行任何修改。這個(gè)過(guò)程其實(shí)涉及到非常復(fù)雜的分布式計(jì)算理論,我們無(wú)法簡(jiǎn)單使用代碼實(shí)現(xiàn)。

區(qū)塊鏈的設(shè)計(jì)思想非常偉大,它集合了很多智慧的結(jié)晶,例如加密算法,分布式算法,心理學(xué),經(jīng)濟(jì)學(xué)等,由于它跨越領(lǐng)域太多,這也是它特別“玄學(xué)”的原因,我們后面僅從技術(shù)的角度進(jìn)行思考,看看區(qū)塊鏈采用的算法原理,同時(shí)也逐步探討如何基于區(qū)塊鏈的基礎(chǔ)上進(jìn)行應(yīng)用開(kāi)發(fā)。

到此這篇關(guān)于從0編寫(xiě)區(qū)塊鏈之用python解釋區(qū)塊鏈最基本原理的文章就介紹到這了,更多相關(guān)python解釋區(qū)塊鏈內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python opencv對(duì)圖像進(jìn)行旋轉(zhuǎn)且不裁剪圖片的實(shí)現(xiàn)方法

    python opencv對(duì)圖像進(jìn)行旋轉(zhuǎn)且不裁剪圖片的實(shí)現(xiàn)方法

    今天小編就為大家分享一篇python opencv對(duì)圖像進(jìn)行旋轉(zhuǎn)且不裁剪圖片的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-07-07
  • 自己用python做的一款超炫酷音樂(lè)播放器

    自己用python做的一款超炫酷音樂(lè)播放器

    這篇文章主要介紹了自己用python做的一款超炫酷音樂(lè)播放器,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-08-08
  • Python3使用requests發(fā)閃存的方法

    Python3使用requests發(fā)閃存的方法

    requests是一個(gè)python 輕量的http客戶(hù)端庫(kù),相比python的標(biāo)準(zhǔn)庫(kù)要優(yōu)雅很多。接下來(lái)通過(guò)本文給大家介紹Python3使用requests發(fā)閃存的方法,感興趣的朋友一起學(xué)習(xí)吧
    2016-05-05
  • Python實(shí)現(xiàn)地圖可視化folium完整過(guò)程

    Python實(shí)現(xiàn)地圖可視化folium完整過(guò)程

    Folium是一個(gè)基于leaflet.js的Python地圖庫(kù),其中,Leaflet是一個(gè)非常輕的前端地圖可視化庫(kù),本文重點(diǎn)給大家介紹Python實(shí)現(xiàn)地圖可視化folium完整過(guò)程,感興趣的朋友跟隨小編一起看看吧
    2021-05-05
  • Python中用Decorator來(lái)簡(jiǎn)化元編程的教程

    Python中用Decorator來(lái)簡(jiǎn)化元編程的教程

    這篇文章主要介紹了Python中用Decorator來(lái)簡(jiǎn)化元編程的教程,來(lái)自于IBM官方開(kāi)發(fā)者技術(shù)文檔,需要的朋友可以參考下
    2015-04-04
  • Python將json文件寫(xiě)入ES數(shù)據(jù)庫(kù)的方法

    Python將json文件寫(xiě)入ES數(shù)據(jù)庫(kù)的方法

    這篇文章主要介紹了Python將json文件寫(xiě)入ES數(shù)據(jù)庫(kù)的方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下
    2019-04-04
  • python3.9實(shí)現(xiàn)pyinstaller打包python文件成exe

    python3.9實(shí)現(xiàn)pyinstaller打包python文件成exe

    這篇文章主要介紹了python3.9實(shí)現(xiàn)pyinstaller打包python文件成exe,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • python使用tcp傳輸圖片數(shù)據(jù)

    python使用tcp傳輸圖片數(shù)據(jù)

    這篇文章主要為大家詳細(xì)介紹了python使用tcp傳輸圖片數(shù)據(jù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • 淺談python之新式類(lèi)

    淺談python之新式類(lèi)

    這篇文章主要介紹了淺談python之新式類(lèi),詳細(xì)的介紹了如何使用新式類(lèi)和經(jīng)典類(lèi)的區(qū)別。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-08-08
  • 關(guān)于你不想知道的所有Python3 unicode特性

    關(guān)于你不想知道的所有Python3 unicode特性

    我的讀者知道我是一個(gè)喜歡痛罵Python3 unicode的人。這次也不例外。我將會(huì)告訴你用unicode有多痛苦和為什么我不能閉嘴。我花了兩周時(shí)間研究Python3,我需要發(fā)泄我的失望。在這些責(zé)罵中,仍然有有用的信息,因?yàn)樗涛覀內(nèi)绾蝸?lái)處理Python3。如果沒(méi)有被我煩到,就讀一讀吧
    2014-11-11

最新評(píng)論