91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

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

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

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

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

掃碼添加小助手

加入工程師交流群

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

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

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

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

identifier: 一個唯一的字符串作為標示

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

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

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

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

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

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

挖礦

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

In[1]:

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

Out[1]:

'a591a6d40bf420404a011733cfb7b190d62c65bf0bcda32b57b277d9ad9f146e'

上面就一個哈希值,如果修改數(shù)據(jù),比如添加一個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ū)塊。這里設定區(qū)塊的哈希值必須以0000開頭才是有效的區(qū)塊。為了得到以0000開頭的哈希值,需要不斷的修改nonce(挖礦)直到滿足條件。下面定義一個函數(shù)來尋找該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() # 如果滿足條件,打印相應值并退出循環(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來計算哈希值,實際區(qū)塊鏈中還會包含其他字段。下面定義一個區(qū)塊的數(shù)據(jù)結(jié)構(gòu)。

實現(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)生唯一標示 self.previous = previous # 父節(jié)點 if previous: self.previous_hash = previous.hash() # 父節(jié)點哈希值 else: self.previous_hash = None self.data = data # 區(qū)塊內(nèi)容 self.nonce = 0 # nonce值 def hash(self): ''' 計算區(qū)塊的哈希值,包括區(qū)塊的標示、數(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é)點哈希值 else: self.previous_hash = None def mine(self): ''' 挖礦函數(shù) ''' # 初始化nonce為0 cur_nonce = self.nonce or 0 # 循環(huán)直到生成一個有效的哈希值 while True: if self.hash_is_valid(): # 如果生成的哈希值有效 break # 退出 else: self.nonce += 1 # 若當前哈希值無效,更新nonce值,進行加1操作 def hash_is_valid(self): ''' 校驗區(qū)塊哈希值有否有效 ''' return self.hash().startswith('0000') def __repr__(self): return 'Block'.format(self.identifier)

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

In[84]:

# 創(chuàng)建一個內(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

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

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

In[88]:

class BlockChain(object): def __init__(self): self.head = None # 指向最新的一個區(qū)塊 self.blocks = {} # 包含所有區(qū)塊的一個字典 ''' 添加區(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)后,下面就開始初始化一條區(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

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

In[93]:

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

Out[93]:

False

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

這將使這個區(qū)塊哈希值改變并導致區(qū)塊無效,并且,這個修改將影響之后的區(qū)塊,因為之后的區(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ū)塊的改變導致之后的區(qū)塊也無效了。

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

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

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


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

原文標題:從零開始學區(qū)塊鏈(3)--深入淺出區(qū)塊鏈(四)--區(qū)塊鏈基礎

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

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

掃碼添加小助手

加入工程師交流群

    評論

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

    深入了解TPS2114A與TPS2115A:雙電源切換的理想選擇

    深入了解TPS2114A與TPS2115A:雙電源切換的理想選擇 在電子設備的設計過程中,電源管理一直是至關(guān)重要的一環(huán),尤其是在需要多個電源輸入的情況下,如何實現(xiàn)電源的無縫切換和有效保護,是工程師們
    的頭像 發(fā)表于 02-28 17:20 ?1043次閱讀

    深入了解LM25066I/A:全方位的系統(tǒng)電源管理與保護方案

    深入了解LM25066I/A:全方位的系統(tǒng)電源管理與保護方案 在當前復雜的電子系統(tǒng)中,高效且可靠的電源管理與保護至關(guān)重要。Texas Instruments的LM25066I和LM25066IA作為
    的頭像 發(fā)表于 02-28 11:20 ?153次閱讀

    深入了解LM70:高性能數(shù)字溫度傳感器的應用與特性

    深入了解LM70:高性能數(shù)字溫度傳感器的應用與特性 在電子設備的設計中,溫度監(jiān)測是一個至關(guān)重要的環(huán)節(jié)。今天,我們就來詳細探討一款來自德州儀器(TI)的溫度傳感器——LM70。 文件下載
    的頭像 發(fā)表于 02-26 11:45 ?231次閱讀

    深入了解MAX14748 USB Type-C充電器:特性、應用與設計要點

    深入了解MAX14748 USB Type-C充電器:特性、應用與設計要點 引言 在當今的電子設備領(lǐng)域,USB Type-C接口憑借其高速數(shù)據(jù)傳輸和強大的電力傳輸能力,正逐漸成為主流。而與之相匹配
    的頭像 發(fā)表于 02-24 11:30 ?288次閱讀

    深入了解Renesas E1/E20 Emulator:從規(guī)范到應用

    深入了解Renesas E1/E20 Emulator:從規(guī)范到應用 引言 在微控制器(MCU)的開發(fā)過程中,調(diào)試工具起著至關(guān)重要的作用。Renesas的E1/E20 Emulator就是一款強大
    的頭像 發(fā)表于 02-10 15:25 ?165次閱讀

    深入了解PCM510x-Q1系列立體聲DAC:技術(shù)特性與應用指南

    深入了解PCM510x-Q1系列立體聲DAC:技術(shù)特性與應用指南 在當今的音頻處理領(lǐng)域,數(shù)字到模擬轉(zhuǎn)換器(DAC)的性能對于音質(zhì)的優(yōu)劣起著關(guān)鍵作用。PCM510x-Q1系列作為一款專為汽車
    的頭像 發(fā)表于 02-09 15:05 ?164次閱讀

    深入了解Microchip PIC16C5X系列:8位單片機的卓越之選

    深入了解Microchip PIC16C5X系列:8位單片機的卓越之選 在當今電子設備飛速發(fā)展的時代,各類單片機產(chǎn)品層出不窮,為廣大電子工程師提供了豐富多樣的選擇。今天,我們就來深入
    的頭像 發(fā)表于 02-09 11:25 ?267次閱讀

    深入了解 LM4881 雙聲道 200mW 耳機放大器:特性、參數(shù)與應用設計

    深入了解 LM4881 雙聲道 200mW 耳機放大器:特性、參數(shù)與應用設計 在電子設備日新月異的今天,音頻放大器作為眾多設備中不可或缺的一部分,其性能和特點對整個系統(tǒng)的音效體驗起著至關(guān)重要的作用
    的頭像 發(fā)表于 02-04 16:50 ?620次閱讀

    深入了解SN74LVC1G66單雙邊模擬開關(guān)

    深入了解SN74LVC1G66單雙邊模擬開關(guān) 在電子設計領(lǐng)域,模擬開關(guān)是一種常見且關(guān)鍵的元件,它在信號路由、切換等方面發(fā)揮著重要作用。今天我們就來詳細探討一下德州儀器(TI)的SN74LVC1G66
    的頭像 發(fā)表于 01-16 10:35 ?427次閱讀

    深入了解LM5111:高性能雙路柵極驅(qū)動器的技術(shù)剖析

    深入了解LM5111:高性能雙路柵極驅(qū)動器的技術(shù)剖析 在電子工程師的日常工作中,選擇合適的柵極驅(qū)動器至關(guān)重要。它直接影響著電路的性能和穩(wěn)定性。今天,我們就來深入探討一款性能卓越的雙路柵極驅(qū)動器
    的頭像 發(fā)表于 01-11 18:00 ?1110次閱讀

    深入了解 S32K312EVB-Q172 開發(fā)板:硬件特性與使用指南

    深入了解 S32K312EVB-Q172 開發(fā)板:硬件特性與使用指南 在嵌入式開發(fā)領(lǐng)域,一款優(yōu)秀的開發(fā)板能夠極大地提升開發(fā)效率和項目的成功率。NXP 的 S32K312EVB-Q172 開發(fā)板就是
    的頭像 發(fā)表于 12-25 09:30 ?275次閱讀

    深入剖析DS80PCI102:PCIe路擴展的得力助手

    和信號衰減的問題,如何有效擴展PCIe路的傳輸距離成為了工程師們面臨的挑戰(zhàn)。今天,我們就來深入了解一款能夠解決這一問題的利器——DS80PCI102。 文件下載: ds80pci102.pdf 一、產(chǎn)品
    的頭像 發(fā)表于 12-23 15:00 ?348次閱讀

    深入了解SRF7038A系列共模扼流圈

    深入了解SRF7038A系列共模扼流圈 在電子設計的領(lǐng)域中,共模扼流圈是解決電磁干擾(EMI)問題的關(guān)鍵元件之一。今天,我們就來詳細探討一下BOURNS的SRF7038A系列共模扼流圈,看看它有
    的頭像 發(fā)表于 12-22 14:10 ?388次閱讀

    深入了解X-ray自動設備的核心優(yōu)勢與應用領(lǐng)域

    。面對復雜多變的工業(yè)環(huán)境和嚴格的品質(zhì)標準,企業(yè)如何借助自動化X射線檢測設備優(yōu)化生產(chǎn)流程、提升檢測準確度?本文將圍繞X-ray自動設備的核心優(yōu)勢與應用領(lǐng)域展開詳盡解讀,幫助您深入了解該技術(shù)帶來的變革與價值。無論您是工廠質(zhì)量管
    的頭像 發(fā)表于 11-04 14:34 ?267次閱讀

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

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