一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

【大神課堂】關(guān)于區(qū)塊鏈發(fā)展及數(shù)字構(gòu)架的深入了解

lviY_AI_shequ ? 來(lái)源:未知 ? 作者:steve ? 2018-04-19 15:53 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

在前面區(qū)塊鏈的架構(gòu)部分介紹過(guò)區(qū)塊鏈的產(chǎn)生過(guò)程,如下圖

【大神課堂】關(guān)于區(qū)塊鏈發(fā)展及數(shù)字構(gòu)架的深入了解

簡(jiǎn)單來(lái)說(shuō),區(qū)塊鏈就是把(加密)數(shù)據(jù)存入?yún)^(qū)塊中,經(jīng)“挖礦”加入整個(gè)鏈條,生成的永久、不可逆向修改的記錄。在本節(jié)中,將從代碼的角度深入理解這一過(guò)程。實(shí)踐是最好的老師,下面將動(dòng)手實(shí)現(xiàn)一個(gè)簡(jiǎn)單的區(qū)塊鏈。

為方便講解區(qū)塊鏈基礎(chǔ),在下面開(kāi)始用Python實(shí)現(xiàn)一個(gè)簡(jiǎn)化版的區(qū)塊鏈。區(qū)塊的數(shù)據(jù)結(jié)構(gòu)包含下面幾個(gè)字段:

identifier: 一個(gè)唯一的字符串作為標(biāo)示

previous_hash: 前一個(gè)區(qū)塊的哈希值

data:區(qū)塊中的數(shù)據(jù)

nonce:隨機(jī)數(shù),用來(lái)找到正確的哈希值

其中identifier這個(gè)唯一的字符串可以用python的uuid庫(kù)uuid4()生成。previous_hash是在接入?yún)^(qū)塊鏈的時(shí)候賦值。data是區(qū)塊中寫入的任意數(shù)據(jù)。比較特別的是nonce,它有什么用呢?它的作用很簡(jiǎn)單,用來(lái)找到正確哈希值。

至于為什么要找正確的哈希值,就要講到區(qū)塊的有效性。由上圖中可以看到,區(qū)塊鏈中的區(qū)塊不是新生成就完成,而是需要通過(guò)“挖礦”這一步驟才可以。簡(jiǎn)單來(lái)說(shuō),挖礦的本質(zhì)就是找到一個(gè)合適的nonce值使得區(qū)塊的哈希值有效。

【大神課堂】關(guān)于區(qū)塊鏈發(fā)展及數(shù)字構(gòu)架的深入了解

挖礦

哈希值是通過(guò)哈希算法計(jì)算得到的一段二進(jìn)制值,不同的數(shù)據(jù)得到不同的哈希值。

In[1]:

# 這里舉個(gè)簡(jiǎn)單的例子# 導(dǎo)入相關(guān)類庫(kù)import hashlib# 定義數(shù)據(jù)data = "Hello World"# 計(jì)算哈希值msg = hashlib.sha256()msg.update(data.encode('utf-8')) # 主要計(jì)算前必須將數(shù)據(jù)轉(zhuǎn)成utf-8msg.hexdigest()

Out[1]:

'a591a6d40bf420404a011733cfb7b190d62c65bf0bcda32b57b277d9ad9f146e'

上面就一個(gè)哈希值,如果修改數(shù)據(jù),比如添加一個(gè)nonce值就可以產(chǎn)生不同的哈希值

In[2]:

nonce = 0msg = hashlib.sha256()msg.update(data.encode('utf-8'))msg.update(str(nonce).encode("utf-8"))msg.hexdigest()

Out[2]:

'1370eeaaba7a6c7a234b1f82cc3b6d013a0088fd5e16408300f05b28b0015463'

在區(qū)塊鏈中區(qū)塊的哈希值必須滿足一定條件才能算是有效的區(qū)塊。這里設(shè)定區(qū)塊的哈希值必須以0000開(kāi)頭才是有效的區(qū)塊。為了得到以0000開(kāi)頭的哈希值,需要不斷的修改nonce(挖礦)直到滿足條件。下面定義一個(gè)函數(shù)來(lái)尋找該nonce值。

In[3]:

def mine(data): nonce = 0 # nonce初始值為0 # 尋找正確的哈希值 while True: msg = hashlib.sha256() msg.update(data.encode("utf-8")) msg.update(str(nonce).encode("utf-8")) hash_code = msg.hexdigest() # 如果滿足條件,打印相應(yīng)值并退出循環(huán) if hash_code.startswith("0000"): print("nonce:{}".format(nonce)) print("hash:{}".format(hash_code)) break # 否則繼續(xù)尋找 else: nonce += 1

In[4]:

mine("Hello, World")
nonce:104803hash:000022635160d3ae1c8c90261e0df5eb6538d7f6d42108d6ffdec17b585fb464

【大神課堂】關(guān)于區(qū)塊鏈發(fā)展及數(shù)字構(gòu)架的深入了解

上面只是用data和nonce來(lái)計(jì)算哈希值,實(shí)際區(qū)塊鏈中還會(huì)包含其他字段。下面定義一個(gè)區(qū)塊的數(shù)據(jù)結(jié)構(gòu)。

實(shí)現(xiàn)區(qū)塊結(jié)構(gòu)

In[83]:

# block.pyimport hashlibimport uuidclass Block(object): def __init__(self, data=None, previous=None): self.identifier = uuid.uuid4().hex # 產(chǎn)生唯一標(biāo)示 self.previous = previous # 父節(jié)點(diǎn) if previous: self.previous_hash = previous.hash() # 父節(jié)點(diǎn)哈希值 else: self.previous_hash = None self.data = data # 區(qū)塊內(nèi)容 self.nonce = 0 # nonce值 def hash(self): ''' 計(jì)算區(qū)塊的哈希值,包括區(qū)塊的標(biāo)示、數(shù)據(jù)、前一區(qū)塊的哈希值和nonce值 ''' message = hashlib.sha256() message.update(self.identifier.encode('utf-8')) message.update(str(self.nonce).encode('utf-8')) message.update(str(self.data).encode('utf-8')) if self.previous: message.update(str(self.previous_hash.encode('utf-8'))) return message.hexdigest() def refresh_hash(self): if self.previous: self.previous_hash = previous.hash() # 父節(jié)點(diǎn)哈希值 else: self.previous_hash = None def mine(self): ''' 挖礦函數(shù) ''' # 初始化nonce為0 cur_nonce = self.nonce or 0 # 循環(huán)直到生成一個(gè)有效的哈希值 while True: if self.hash_is_valid(): # 如果生成的哈希值有效 break # 退出 else: self.nonce += 1 # 若當(dāng)前哈希值無(wú)效,更新nonce值,進(jìn)行加1操作 def hash_is_valid(self): ''' 校驗(yàn)區(qū)塊哈希值有否有效 ''' return self.hash().startswith('0000') def __repr__(self): return 'Block'.format(self.identifier)

以上就是一個(gè)區(qū)塊結(jié)構(gòu),這里的區(qū)塊包含一個(gè)唯一標(biāo)識(shí)符、父節(jié)點(diǎn)的哈希值、nonce值和該區(qū)塊的內(nèi)容字段。其中定義一個(gè)mine函數(shù)用了尋找合適的nonce值。另外定義了一個(gè)hash_is_valid函數(shù)用來(lái)判斷這個(gè)是否以0000開(kāi)頭,即是否有效。下面對(duì)這個(gè)區(qū)塊結(jié)構(gòu)進(jìn)行初始化。

In[84]:

# 創(chuàng)建一個(gè)內(nèi)容為hello world的內(nèi)容塊block = Block('Hello, World')

In[85]:

# 區(qū)塊鏈的有效性block.hash_is_valid()

Out[85]:

False

In[86]:

# 挖礦,循環(huán)直至找到合適的nonceblock.mine()

In[87]:

# 再次檢查區(qū)塊的有效性block.hash_is_valid()

Out[87]:

True

至此,第一個(gè)有效的區(qū)塊生成完成,下面開(kāi)始實(shí)現(xiàn)區(qū)塊鏈。

實(shí)現(xiàn)區(qū)塊鏈結(jié)構(gòu)

In[88]:

class BlockChain(object): def __init__(self): self.head = None # 指向最新的一個(gè)區(qū)塊 self.blocks = {} # 包含所有區(qū)塊的一個(gè)字典 ''' 添加區(qū)塊函數(shù) ''' def add_block(self, new_block): new_block.previous = new_block.previous new_block.mine() self.blocks[new_block.identifier] = block self.head = new_block def __repr__(self): num_existing_blocks = len(self.blocks) return 'Blockchain<{} Blocks, Head: {}>'.format( num_existing_blocks, self.head.identifier if self.head else None )

定義好區(qū)塊鏈結(jié)構(gòu)后,下面就開(kāi)始初始化一條區(qū)塊鏈。

In[89]:

# 初始化chain = BlockChain()# 打印chain

Out[89]:

Blockchain<0 Blocks, Head: None>

In[90]:

# 添加區(qū)塊chain.add_block(block)# 打印chain

Out[90]:

Blockchain<1 Blocks, Head: 1294d073adf5476db720d7b2e752d62b>

In[91]:

# 添加更多的區(qū)塊for i in range(6): new_block = Block(i) chain.add_block(new_block) # 打印chain

Out[91]:

Blockchain<7 Blocks, Head: 7f8291bedac845af8637112136c41fd3>

In[92]:

for i,v in chain.blocks.items(): if v.hash_is_valid(): print("{} is valid".format(k)) else: print("\033[0;31m{} is invalid\033[0m")a70c66dec8154a37864838638bc1ef71 is valida70c66dec8154a37864838638bc1ef71 is valida70c66dec8154a37864838638bc1ef71 is valida70c66dec8154a37864838638bc1ef71 is valida70c66dec8154a37864838638bc1ef71 is valida70c66dec8154a37864838638bc1ef71 is valida70c66dec8154a37864838638bc1ef71 is valid

以上就是一個(gè)簡(jiǎn)單區(qū)塊鏈,可以看到當(dāng)前的區(qū)塊都是有效的。但是,值的注意的是,每個(gè)區(qū)塊包括前一個(gè)區(qū)塊的哈希值,所以,當(dāng)區(qū)塊鏈中一個(gè)區(qū)塊被改變后,這個(gè)區(qū)塊的哈希就會(huì)改變,從而影響到這塊區(qū)塊之后的區(qū)塊。

In[93]:

# 比如改變第一個(gè)區(qū)塊的內(nèi)容block.data = "Modify Data"block.hash_is_valid()

Out[93]:

False

【大神課堂】關(guān)于區(qū)塊鏈發(fā)展及數(shù)字構(gòu)架的深入了解

這將使這個(gè)區(qū)塊哈希值改變并導(dǎo)致區(qū)塊無(wú)效,并且,這個(gè)修改將影響之后的區(qū)塊,因?yàn)橹蟮膮^(qū)塊中的previous_hash依賴于前面的區(qū)塊。改變?nèi)缦拢?/p>

In[95]:

for k,v in chain.blocks.items(): # 更新區(qū)塊 v.refresh_hash() if v.hash_is_valid(): print("{} is valid".format(k)) else: print("\033[0;31m{} is invalid\033[0m".format(k))b41171e618334412871495fb6d6f1a28 is invalid1294d073adf5476db720d7b2e752d62b is invalid97dd4e3905584c18ab2028c92b3afaad is invalid02cb150841d6420ead9388d0ecfa3eef is invalid7f8291bedac845af8637112136c41fd3 is invalid2cfe78eac1db48f099a10ea968d468dd is invalid2119e357b03442e1bbc12f355ffdf00c is invalid

可以看到由于前面區(qū)塊的改變導(dǎo)致之后的區(qū)塊也無(wú)效了。

【大神課堂】關(guān)于區(qū)塊鏈發(fā)展及數(shù)字構(gòu)架的深入了解

以上模擬了單個(gè)用戶的區(qū)塊鏈操作,在實(shí)際過(guò)程中挖礦和校驗(yàn)的行為由區(qū)塊鏈中其他用戶進(jìn)行的,并根據(jù)挖礦產(chǎn)生的勞動(dòng)得到對(duì)應(yīng)的報(bào)酬。這樣就保證了單個(gè)用戶無(wú)法修改區(qū)塊鏈中的數(shù)據(jù)。并且這個(gè)過(guò)程是通過(guò)加密算法進(jìn)行的,這就實(shí)現(xiàn)了區(qū)塊鏈的去信任。

【大神課堂】關(guān)于區(qū)塊鏈發(fā)展及數(shù)字構(gòu)架的深入了解


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴

原文標(biāo)題:從零開(kāi)始學(xué)區(qū)塊鏈(3)--深入淺出區(qū)塊鏈(四)--區(qū)塊鏈基礎(chǔ)

文章出處:【微信號(hào):AI_shequ,微信公眾號(hào):人工智能愛(ài)好者社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    如何為不同的電機(jī)選擇合適的驅(qū)動(dòng)芯片?納芯微帶你深入了解!

    在現(xiàn)代生活中,電機(jī)廣泛使用在家電產(chǎn)品、汽車電子、工業(yè)控制等眾多應(yīng)用領(lǐng)域,每一個(gè)電機(jī)的運(yùn)轉(zhuǎn)都離不開(kāi)合適的驅(qū)動(dòng)芯片。納芯微提供豐富的電機(jī)驅(qū)動(dòng)產(chǎn)品選擇,本期技術(shù)分享將重點(diǎn)介紹常見(jiàn)電機(jī)種類與感性負(fù)載應(yīng)用,幫助大家更深入了解如何選擇合適的電機(jī)驅(qū)動(dòng)芯片。
    的頭像 發(fā)表于 07-17 14:00 ?385次閱讀
    如何為不同的電機(jī)選擇合適的驅(qū)動(dòng)芯片?納芯微帶你<b class='flag-5'>深入了解</b>!

    深入了解U8g2與LVGL圖形庫(kù)

    在單片機(jī)開(kāi)發(fā)領(lǐng)域,圖形顯示功能變得越來(lái)越重要。無(wú)論是工業(yè)控制界面、智能家居設(shè)備,還是手持儀器儀表,都需要一個(gè)高效且易用的圖形庫(kù)來(lái)實(shí)現(xiàn)豐富的可視化效果。U8g2 和 LVGL 就是其中兩款備受關(guān)注的圖形庫(kù),它們各有特點(diǎn),適用于不同的應(yīng)用場(chǎng)景。今天,我們就來(lái)深入了解這兩個(gè)圖形庫(kù)。
    的頭像 發(fā)表于 02-13 11:01 ?2097次閱讀

    科普小課堂:噪聲是什么,你“噪”嗎?

    噪聲是什么?納祥科技科普小課堂Hey,各位音頻發(fā)燒友們當(dāng)我們沉醉于視聽(tīng)世界里震撼的音效時(shí)又是否深入了解過(guò)噪聲是什么今天,讓我們一起揭開(kāi)噪聲的神秘面紗探尋音頻世界的無(wú)窮魅力!在音頻世界里,噪聲的簡(jiǎn)單
    的頭像 發(fā)表于 02-05 17:29 ?1112次閱讀
    科普小<b class='flag-5'>課堂</b>:噪聲是什么,你“噪”嗎?

    深入了解 PCB 制造技術(shù):銑削

    了 PCB 銑削的復(fù)雜性、銑削工藝、其優(yōu)勢(shì)、挑戰(zhàn)和應(yīng)用。 了解 PCB 銑削 PCB 銑削涉及從覆銅板上機(jī)械去除材料,以創(chuàng)建電氣隔離并形成電路圖案。與使用化學(xué)溶液溶解不需要的銅的傳統(tǒng)蝕刻方法不同,銑削使用精確控制的銑削鉆頭來(lái)物理雕刻出所需的痕跡。該過(guò)程通
    的頭像 發(fā)表于 01-26 21:25 ?635次閱讀
    <b class='flag-5'>深入了解</b> PCB 制造技術(shù):銑削

    深入了解渦街流量計(jì) 原理及內(nèi)部構(gòu)造

    渦街流量計(jì)是一種常用的流量測(cè)量?jī)x表,LUB系列渦街流量計(jì)的內(nèi)部構(gòu)造與原理密切相關(guān),共同構(gòu)成了其高精度、寬量程比和穩(wěn)定運(yùn)行的基礎(chǔ)。本文將深入介紹渦街流量計(jì)的原理及內(nèi)部構(gòu)造,以便更好地了解渦街流量計(jì)
    的頭像 發(fā)表于 01-06 15:17 ?939次閱讀

    如何為不同的電機(jī)選擇合適的驅(qū)動(dòng)芯片?納芯微帶你深入了解!

    在現(xiàn)代生活中,電機(jī)廣泛使用在家電產(chǎn)品、汽車電子、工業(yè)控制等眾多應(yīng)用領(lǐng)域,每一個(gè)電機(jī)的運(yùn)轉(zhuǎn)都離不開(kāi)合適的驅(qū)動(dòng)芯片。納芯微提供豐富的電機(jī)驅(qū)動(dòng)產(chǎn)品選擇,本期技術(shù)分享將重點(diǎn)介紹常見(jiàn)電機(jī)種類與感性負(fù)載應(yīng)用,幫助大家更深入了解如何選擇合適的電機(jī)驅(qū)動(dòng)芯片。
    的頭像 發(fā)表于 12-23 09:58 ?1039次閱讀
    如何為不同的電機(jī)選擇合適的驅(qū)動(dòng)芯片?納芯微帶你<b class='flag-5'>深入了解</b>!

    YOGO ROBO智能機(jī)器人助力區(qū)塊行業(yè)發(fā)展

    日前,上海靜安區(qū)成功舉辦了全國(guó)首個(gè)區(qū)塊主題的場(chǎng)景集市——“數(shù)通谷”區(qū)塊+醫(yī)療場(chǎng)景集市。本次活動(dòng)匯聚了來(lái)自
    的頭像 發(fā)表于 11-22 11:33 ?729次閱讀

    深入了解光伏逆變器測(cè)試系統(tǒng)

    的交流電(AC)。隨著太陽(yáng)能發(fā)電的廣泛應(yīng)用,確保光伏逆變器的可靠性和效率變得至關(guān)重要,這也使得光伏逆變器測(cè)試系統(tǒng)的作用愈發(fā)凸顯。 一、光伏逆變器的工作原理 要深入理解光伏逆變器測(cè)試系統(tǒng)的必要性,首先需要了解逆變器的
    的頭像 發(fā)表于 10-24 14:59 ?716次閱讀
    <b class='flag-5'>深入了解</b>光伏逆變器測(cè)試系統(tǒng)

    深入了解PCI轉(zhuǎn)XMC載板轉(zhuǎn)接卡

    電子發(fā)燒友網(wǎng)站提供《深入了解PCI轉(zhuǎn)XMC載板轉(zhuǎn)接卡.docx》資料免費(fèi)下載
    發(fā)表于 09-06 14:35 ?0次下載

    智慧課堂升級(jí):國(guó)產(chǎn)OPS電腦的創(chuàng)新力量

    在科技的浪潮中,智慧課堂的構(gòu)建已成為教育領(lǐng)域的一場(chǎng)革命。它不僅僅是傳統(tǒng)教學(xué)模式的數(shù)字化轉(zhuǎn)型,更是一場(chǎng)關(guān)于教學(xué)方式、內(nèi)容傳播、以及學(xué)習(xí)體驗(yàn)的全面革新。智慧課堂的打造,依賴于數(shù)據(jù)驅(qū)動(dòng)的個(gè)性
    的頭像 發(fā)表于 09-03 10:30 ?644次閱讀
    智慧<b class='flag-5'>課堂</b>升級(jí):國(guó)產(chǎn)OPS電腦的創(chuàng)新力量

    深入了解六軸力傳感器:原理、分類與應(yīng)用

    ? 在科技飛速發(fā)展的今天,傳感器技術(shù)作為連接物理世界與數(shù)字世界的橋梁,正逐步滲透到各個(gè)行業(yè),成為推動(dòng)技術(shù)進(jìn)步和產(chǎn)業(yè)升級(jí)的重要力量。其中,六軸力傳感器以其獨(dú)特的多維力學(xué)測(cè)量能力,在機(jī)器人技術(shù)、自動(dòng)化
    的頭像 發(fā)表于 08-02 08:44 ?2675次閱讀
    <b class='flag-5'>深入了解</b>六軸力傳感器:原理、分類與應(yīng)用

    深入了解表面貼裝型晶體濾波器:DSF753S 2POLE、DSF753S 3POLE 和 DSF753S 4POLE

    深入了解表面貼裝型晶體濾波器:DSF753S 2POLE、DSF753S 3POLE 和 DSF753S 4POLE
    的頭像 發(fā)表于 07-31 11:05 ?869次閱讀
    <b class='flag-5'>深入了解</b>表面貼裝型晶體濾波器:DSF753S 2POLE、DSF753S 3POLE 和 DSF753S 4POLE

    深入了解 MEMS 振蕩器 溫度補(bǔ)償 MEMS 振蕩器 TC-MO

    深入了解 MEMS 振蕩器/溫度補(bǔ)償 MEMS 振蕩器(TC-MO)-μPower MO1534/MO1569/MO1576/MO8021
    的頭像 發(fā)表于 07-30 16:38 ?1075次閱讀
    <b class='flag-5'>深入了解</b> MEMS 振蕩器 溫度補(bǔ)償 MEMS 振蕩器 TC-MO

    深入了解表面貼裝晶體諧振器DSX1210A

    深入了解表面貼裝晶體諧振器DSX1210A
    的頭像 發(fā)表于 07-25 14:27 ?813次閱讀
    <b class='flag-5'>深入了解</b>表面貼裝晶體諧振器DSX1210A

    深入了解恒溫晶體振蕩器DC5032AS

    深入了解恒溫晶體振蕩器DC5032AS
    的頭像 發(fā)表于 07-25 10:37 ?617次閱讀
    <b class='flag-5'>深入了解</b>恒溫晶體振蕩器DC5032AS