那曲檬骨新材料有限公司

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

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

3天內不再提示

【大神課堂】關于區塊鏈發展及數字構架的深入了解

lviY_AI_shequ ? 來源:未知 ? 作者:steve ? 2018-04-19 15:53 ? 次閱讀

在前面區塊鏈的架構部分介紹過區塊鏈的產生過程,如下圖

【大神課堂】關于區塊鏈發展及數字構架的深入了解

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

為方便講解區塊鏈基礎,在下面開始用Python實現一個簡化版的區塊鏈。區塊的數據結構包含下面幾個字段:

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

previous_hash: 前一個區塊的哈希值

data:區塊中的數據

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

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

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

【大神課堂】關于區塊鏈發展及數字構架的深入了解

挖礦

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

In[1]:

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

Out[1]:

'a591a6d40bf420404a011733cfb7b190d62c65bf0bcda32b57b277d9ad9f146e'

上面就一個哈希值,如果修改數據,比如添加一個nonce值就可以產生不同的哈希值

In[2]:

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

Out[2]:

'1370eeaaba7a6c7a234b1f82cc3b6d013a0088fd5e16408300f05b28b0015463'

在區塊鏈中區塊的哈希值必須滿足一定條件才能算是有效的區塊。這里設定區塊的哈希值必須以0000開頭才是有效的區塊。為了得到以0000開頭的哈希值,需要不斷的修改nonce(挖礦)直到滿足條件。下面定義一個函數來尋找該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() # 如果滿足條件,打印相應值并退出循環 if hash_code.startswith("0000"): print("nonce:{}".format(nonce)) print("hash:{}".format(hash_code)) break # 否則繼續尋找 else: nonce += 1

In[4]:

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

【大神課堂】關于區塊鏈發展及數字構架的深入了解

上面只是用data和nonce來計算哈希值,實際區塊鏈中還會包含其他字段。下面定義一個區塊的數據結構。

實現區塊結構

In[83]:

# block.pyimport hashlibimport uuidclass Block(object): def __init__(self, data=None, previous=None): self.identifier = uuid.uuid4().hex # 產生唯一標示 self.previous = previous # 父節點 if previous: self.previous_hash = previous.hash() # 父節點哈希值 else: self.previous_hash = None self.data = data # 區塊內容 self.nonce = 0 # nonce值 def hash(self): ''' 計算區塊的哈希值,包括區塊的標示、數據、前一區塊的哈希值和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() # 父節點哈希值 else: self.previous_hash = None def mine(self): ''' 挖礦函數 ''' # 初始化nonce為0 cur_nonce = self.nonce or 0 # 循環直到生成一個有效的哈希值 while True: if self.hash_is_valid(): # 如果生成的哈希值有效 break # 退出 else: self.nonce += 1 # 若當前哈希值無效,更新nonce值,進行加1操作 def hash_is_valid(self): ''' 校驗區塊哈希值有否有效 ''' return self.hash().startswith('0000') def __repr__(self): return 'Block'.format(self.identifier)

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

In[84]:

# 創建一個內容為hello world的內容塊block = Block('Hello, World')

In[85]:

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

Out[85]:

False

In[86]:

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

In[87]:

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

Out[87]:

True

至此,第一個有效的區塊生成完成,下面開始實現區塊鏈。

實現區塊鏈結構

In[88]:

class BlockChain(object): def __init__(self): self.head = None # 指向最新的一個區塊 self.blocks = {} # 包含所有區塊的一個字典 ''' 添加區塊函數 ''' 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 )

定義好區塊鏈結構后,下面就開始初始化一條區塊鏈。

In[89]:

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

Out[89]:

Blockchain<0 Blocks, Head: None>

In[90]:

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

Out[90]:

Blockchain<1 Blocks, Head: 1294d073adf5476db720d7b2e752d62b>

In[91]:

# 添加更多的區塊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

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

In[93]:

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

Out[93]:

False

【大神課堂】關于區塊鏈發展及數字構架的深入了解

這將使這個區塊哈希值改變并導致區塊無效,并且,這個修改將影響之后的區塊,因為之后的區塊中的previous_hash依賴于前面的區塊。改變如下:

In[95]:

for k,v in chain.blocks.items(): # 更新區塊 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

可以看到由于前面區塊的改變導致之后的區塊也無效了。

【大神課堂】關于區塊鏈發展及數字構架的深入了解

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

【大神課堂】關于區塊鏈發展及數字構架的深入了解


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 區塊鏈技術
    +關注

    關注

    5

    文章

    674

    瀏覽量

    14182

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

文章出處:【微信號:AI_shequ,微信公眾號:人工智能愛好者社區】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

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

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

    深入了解 PCB 制造技術:銑削

    了 PCB 銑削的復雜性、銑削工藝、其優勢、挑戰和應用。 了解 PCB 銑削 PCB 銑削涉及從覆銅板上機械去除材料,以創建電氣隔離并形成電路圖案。與使用化學溶液溶解不需要的銅的傳統蝕刻方法不同,銑削使用精確控制的銑削鉆頭來物理雕刻出所需的痕跡。該過程通
    的頭像 發表于 01-26 21:25 ?109次閱讀
    <b class='flag-5'>深入了解</b> PCB 制造技術:銑削

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

    在現代生活中,電機廣泛使用在家電產品、汽車電子、工業控制等眾多應用領域,每一個電機的運轉都離不開合適的驅動芯片。納芯微提供豐富的電機驅動產品選擇,本期技術分享將重點介紹常見電機種類與感性負載應用,幫助大家更深入了解如何選擇合適的電機驅動芯片。
    的頭像 發表于 12-23 09:58 ?434次閱讀
    如何為不同的電機選擇合適的驅動芯片?納芯微帶你<b class='flag-5'>深入了解</b>!

    YOGO ROBO智能機器人助力區塊行業發展

    日前,上海靜安區成功舉辦了全國首個區塊主題的場景集市——“數通谷”區塊+醫療場景集市。本次活動匯聚了來自
    的頭像 發表于 11-22 11:33 ?361次閱讀

    深入了解PCI轉XMC載板轉接卡

    電子發燒友網站提供《深入了解PCI轉XMC載板轉接卡.docx》資料免費下載
    發表于 09-06 14:35 ?0次下載

    智慧課堂升級:國產OPS電腦的創新力量

    在科技的浪潮中,智慧課堂的構建已成為教育領域的一場革命。它不僅僅是傳統教學模式的數字化轉型,更是一場關于教學方式、內容傳播、以及學習體驗的全面革新。智慧課堂的打造,依賴于數據驅動的個性
    的頭像 發表于 09-03 10:30 ?402次閱讀
    智慧<b class='flag-5'>課堂</b>升級:國產OPS電腦的創新力量

    深入了解六軸力傳感器:原理、分類與應用

    ? 在科技飛速發展的今天,傳感器技術作為連接物理世界與數字世界的橋梁,正逐步滲透到各個行業,成為推動技術進步和產業升級的重要力量。其中,六軸力傳感器以其獨特的多維力學測量能力,在機器人技術、自動化
    的頭像 發表于 08-02 08:44 ?1040次閱讀
    <b class='flag-5'>深入了解</b>六軸力傳感器:原理、分類與應用

    深入了解 MEMS 振蕩器 溫度補償 MEMS 振蕩器 TC-MO

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

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

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

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

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

    深入了解半導體供應:特點、風險與未來趨勢

    半導體是現代電子工業的核心,其供應涵蓋了從原材料提煉到最終產品應用的整個過程。了解半導體供應對于理解當今高科技產業的運作至關重要。本文將詳細介紹半導體供應的相關知識,包括其定義、
    的頭像 發表于 07-11 09:42 ?1366次閱讀
    <b class='flag-5'>深入了解</b>半導體供應<b class='flag-5'>鏈</b>:特點、風險與未來趨勢

    小熊派官網正式上線 可深入了解小熊派的各款開發套件

    我們為每一款開發板打造一個開源社區,讓每一位開發者都能在這里找到歸屬感和靈感。通過官網對硬件、軟件、案例和教程的開源,大家可以深入了解小熊派的各款開發套件。
    的頭像 發表于 06-13 08:42 ?1009次閱讀
    小熊派官網正式上線 可<b class='flag-5'>深入了解</b>小熊派的各款開發套件

    深入了解IEEE協會:設備MAC地址申請指南

    數字化浪潮中,設備之間的通信變得日益頻繁和重要。而在這個通信網絡中,每一臺設備都需要一個獨特的身份標識來幫助大家有效識別設備信息,那就是MAC地址。本篇內容,英利檢測將帶大家深入了解IEEE協會
    的頭像 發表于 05-09 17:20 ?628次閱讀
    <b class='flag-5'>深入了解</b>IEEE協會:設備MAC地址申請指南

    深入了解影響ZR執行器性能的關鍵因素

    深入了解影響ZR執行器性能的關鍵因素-速程精密 在工業自動化領域,ZR執行器作為關鍵的終端設備,其性能的穩定性對于整個自動化系統的運行至關重要。了解影響ZR執行器性能的因素有助于更好地維護和優化其
    的頭像 發表于 03-20 15:04 ?578次閱讀
    <b class='flag-5'>深入了解</b>影響ZR執行器性能的關鍵因素

    區塊互操作標準化應用及經驗,華為云 BCS 獲評團體標準示范項目

    區塊技術發展的關鍵 區塊作為一種分布式賬本技術,具多方共識、分布式存儲、難以篡改等 特點,在金融科技、政務民生、司法存證、供應
    的頭像 發表于 02-23 22:00 ?716次閱讀
    <b class='flag-5'>區塊</b><b class='flag-5'>鏈</b>互操作標準化應用及經驗,華為云 BCS 獲評團體標準示范項目
    百家乐论坛代理合作| 娱乐城百家乐官网打不开| 克什克腾旗| 噢门百家乐官网玩的技巧| 玩百家乐官网免费| 百家乐视频网络游戏| 百盛百家乐的玩法技巧和规则| 波音网百家乐合作| 自贡百家乐娱乐场开户注册| 百家乐发牌规| 金龙国际娱乐城| 百家乐官网赌博娱乐城大全| 百家乐的打法技巧| 世嘉百家乐的玩法技巧和规则| 百家乐存1000送| 大发888真钱游戏玩法| 鹤山市| 百家乐官网旺门打法| 百家乐游戏技巧| 巴登娱乐城开户| 百家乐官网實戰後二穩賺| 百家乐门户网站| 百家乐龙虎斗等| bet365论坛| 百家乐官网7scs娱乐场| 百家乐赌场赌场平台| 尊龙国际开户| 赌百家乐官网可以赢钱| 迪威百家乐现场| 大发888注册送58元| 百家乐官网庄闲作千| 百家乐园搏彩论坛| 大富豪棋牌游戏下载| 百家乐官网币| 百家乐可以出千吗| 凤翔县| 天格数16土人格24火地格数19水| 百家乐下注所有组合| 大发888娱乐下载网址| 永利高百家乐官网信誉| 信誉百家乐博彩网|