從零開始:用代碼解析區塊鏈的核心工作原理

?

區塊鏈技術被譽為信任的機器,它正在重塑金融、供應鏈、數字身份等眾多領域。但對于許多開發者來說,它仍然像一個神秘的黑盒子。今天,我們將拋開炒作的泡沫,深入技術本質,用大約100行Python代碼構建一個簡易的區塊鏈,并逐一解析其核心概念。

?

一、區塊鏈是什么?一個簡單的比喻

?

想象一個公共的記賬本( Ledger )。這個本子的每一頁( Block )都記錄著多條交易信息,并且每一頁的頁眉都包含了前一頁的摘要( Hash )。如果有人篡改了某一頁的內容,那么這一頁的摘要就會改變, subsequently 導致后續所有頁的頁眉信息都對不上,從而立刻被所有人發現。這個按時間順序首尾相連的記賬本,就是區塊鏈。

?

二、核心概念與代碼實現

?

我們將實現一個名為 SimpleBlockchain 的類,它包含以下核心功能:

?

1. 區塊結構 (Block Structure)

2. 哈希函數 (Hashing) - 保證數據不可篡改

3. 生成創世區塊 (Genesis Block)

4. 工作量證明 (Proof-of-Work) - 保證挖礦難度

5. 鏈式結構 (Chaining Blocks) - 通過哈希連接

?

讓我們開始寫代碼!

?

1. 導入依賴庫

?

我們主要需要兩個庫:hashlib 用于計算哈希,time 為區塊提供時間戳。

?

```python

import hashlib

import time

```

?

2. 定義區塊結構

?

每個區塊都包含一些關鍵信息:索引、時間戳、數據、前一個區塊的哈希、當前區塊的隨機數(Nonce)和自身的哈希。

?

```python

class Block:

? ? def __init__(self, index, timestamp, data, previous_hash):

? ? ? ? self.index = index

? ? ? ? self.timestamp = timestamp

? ? ? ? self.data = data # 在真實區塊鏈中,這通常是交易列表的Merkle根

? ? ? ? self.previous_hash = previous_hash

? ? ? ? self.nonce = 0 # 用于工作量證明的隨機數

? ? ? ? self.hash = self.calculate_hash() # 計算當前區塊的哈希值

?

? ? def calculate_hash(self):

? ? ? ? # 將區塊的所有信息組合成一個字符串,并計算其SHA-256哈希值

? ? ? ? block_string = f"{self.index}{self.timestamp}{self.data}{self.previous_hash}{self.nonce}".encode()

? ? ? ? return hashlib.sha256(block_string).hexdigest()

```

?

代碼解析:

?

· previous_hash:這是鏈式結構的核心!它指向上一個區塊,從而形成了鏈。任何對舊區塊的修改都會導致其哈希變化,進而破壞整個后續鏈。

· calculate_hash 方法:它接收區塊的所有屬性(包括 nonce),生成一個唯一的、固定長度的“數字指紋”(哈希值)。SHA-256算法保證了計算的單向性,即極易驗證但極難破解。

?

3. 創建區塊鏈類

?

區塊鏈類負責管理鏈,提供添加新區塊的方法。

?

```python

class SimpleBlockchain:

? ? def __init__(self):

? ? ? ? self.chain = [self.create_genesis_block()] # 初始化鏈,并創建創世區塊

? ? ? ? self.difficulty = 4 # 工作量證明的難度,表示哈希值必須以多少個'0'開頭

?

? ? def create_genesis_block(self):

? ? ? ? # 創世區塊是第一個區塊,沒有前一個區塊,所以previous_hash設為0

? ? ? ? return Block(0, time.time(), "Genesis Block", "0")

?

? ? def get_latest_block(self):

? ? ? ? return self.chain[-1]

```

?

代碼解析:

?

· create_genesis_block:區塊鏈的第一個區塊是特殊的,它沒有前任,必須被硬編碼到系統中。

· difficulty:這是一個動態調整的參數,用來控制“挖礦”(生成新區塊)的速度。難度值越大,找到有效哈希所需的計算時間就越長。

?

4. 實現工作量證明 (Proof-of-Work)

?

這是區塊鏈(尤其是比特幣)的靈魂所在。礦工需要通過大量計算找到一個滿足特定條件的 nonce 值。

?

```python

? ? def proof_of_work(self, block):

? ? ? ? # 目標:找到一個nonce,使得區塊的哈希值的前difficulty位是0

? ? ? ? target = '0' * self.difficulty

? ? ? ? while block.hash[:self.difficulty] != target:

? ? ? ? ? ? block.nonce += 1 # 不斷嘗試新的nonce值

? ? ? ? ? ? block.hash = block.calculate_hash() # 重新計算哈希

? ? ? ? print(f"Block mined: {block.hash}")

? ? ? ? return block

```

?

代碼解析:

?

· 礦工(proof_of_work 函數)不斷地改變 nonce 的值,并重新計算區塊哈希。

· 只有當計算出的哈希值的前 difficulty 位都是 ‘0’ 時,才算成功。

· 這個過程極其耗時且耗電,但驗證卻非常容易(只需計算一次哈希并檢查前導零)。這就是“工作量證明”的含義——它證明了礦工投入了真實的計算資源。

?

5. 添加新區塊

?

現在,我們可以將挖礦成功后的區塊添加到鏈上。

?

```python

? ? def add_block(self, new_block):

? ? ? ? new_block.previous_hash = self.get_latest_block().hash # 設置新區塊的previous_hash

? ? ? ? new_block = self.proof_of_work(new_block) # 執行挖礦!

? ? ? ? self.chain.append(new_block) # 將挖礦后的有效區塊添加到鏈上

?

? ? def is_chain_valid(self):

? ? ? ? for i in range(1, len(self.chain)):

? ? ? ? ? ? current_block = self.chain[i]

? ? ? ? ? ? previous_block = self.chain[i-1]

? ? ? ? ? ? # 檢查1:當前區塊存儲的哈希值是否真的等于它計算出的哈希值?

? ? ? ? ? ? if current_block.hash != current_block.calculate_hash():

? ? ? ? ? ? ? ? print(f"Data tampered in block {current_block.index}!")

? ? ? ? ? ? ? ? return False

? ? ? ? ? ? # 檢查2:當前區塊的previous_hash是否等于上一個區塊的哈希值?

? ? ? ? ? ? if current_block.previous_hash != previous_block.hash:

? ? ? ? ? ? ? ? print(f"Chain broken between block {previous_block.index} and {current_block.index}!")

? ? ? ? ? ? ? ? return False

? ? ? ? return True

```

?

代碼解析:

?

· add_block:在添加區塊前,必須先進行耗時的挖礦過程。這保證了區塊不能隨意被添加,確保了網絡的安全性和一致性。

· is_chain_valid:驗證區塊鏈的完整性。它會遍歷整個鏈,檢查每個區塊的哈希是否正確,以及區塊間的鏈接是否未被破壞。任何微小的篡改都會導致 calculate_hash() 的結果與存儲的 hash 不匹配。

?

三、測試我們的迷你區塊鏈

?

讓我們運行一下,看看它的效果。

?

```python

# 初始化我們的區塊鏈

my_blockchain = SimpleBlockchain()

?

print("Mining block 1...")

my_blockchain.add_block(Block(1, time.time(), "Alice pays Bob 1 BTC", ""))

?

print("Mining block 2...")

my_blockchain.add_block(Block(2, time.time(), "Bob pays Charlie 0.5 BTC", ""))

?

# 打印所有區塊

for block in my_blockchain.chain:

? ? print(f"Index: {block.index}")

? ? print(f"Hash: {block.hash}")

? ? print(f"Previous Hash: {block.previous_hash}")

? ? print(f"Data: {block.data}")

? ? print(f"Nonce: {block.nonce}\n")

?

# 驗證區塊鏈是否有效

print(f"Is blockchain valid? {my_blockchain.is_chain_valid()}")

?

# 嘗試篡改數據!

print("\nAttempting to tamper with data...")

my_blockchain.chain[1].data = "Alice pays Bob 100 BTC" # 修改第一個區塊的數據

# 由于數據被修改,它的哈希值變了,但后續區塊的previous_hash指向的還是舊的、錯誤的哈希。

print(f"Is blockchain valid after tampering? {my_blockchain.is_chain_valid()}") # 輸出:False

```

?

輸出結果示例:

?

```

Mining block 1...

Block mined: 0000a1b2c3d4...(哈希值以4個0開頭)

Mining block 2...

Block mined: 0000e5f6g7h8...(哈希值以4個0開頭)

?

Index: 0 (Genesis Block)

Hash: 89ab...

Previous Hash: 0

...

?

Index: 1

Hash: 0000a1b2c3d4... # 以0000開頭

Previous Hash: 89ab... # 指向創世區塊的哈希

Data: Alice pays Bob 1 BTC

Nonce: 68452 # 一個很大的數字,說明礦工嘗試了68452次才找到有效的nonce

?

...

?

Is blockchain valid? True

Attempting to tamper with data...

Data tampered in block 1! # 驗證函數發現了數據被篡改

Is blockchain valid after tampering? False

```

?

四、總結與展望

?

通過這不到100行的代碼,我們實現了一個具備核心功能的區塊鏈:

?

· 不可篡改性:通過哈希函數保證,修改數據會立即使哈希失效。

· 鏈式結構:通過 previous_hash 將區塊按時間順序鏈接起來。

· 工作量證明:通過挖礦機制保證網絡的安全性和去中心化共識。

?

當然,這只是一個極其簡化的模型。一個生產級的區塊鏈(如比特幣、以太坊)要復雜得多,它還包括:

?

· 點對點網絡:節點如何發現和通信。

· 交易模型:UTXO(比特幣)或賬戶余額(以太坊)。

· ** Merkle 樹**:高效地驗證大量交易的存在性。

· 共識算法:PoW(工作量證明)之外的PoS(權益證明)等。

· 智能合約:在區塊鏈上運行的自動化代碼。

?

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/95374.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/95374.shtml
英文地址,請注明出處:http://en.pswp.cn/web/95374.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

網絡通信IP細節

目錄 1.通信的NAT技術 2.代理服務器 3.內網穿透和內網打洞 1.通信的NAT技術 NAT技術產生的背景是我們為了解決IPV4不夠用的問題,NAT在通信的時候可以對IP將私網IP轉化為公網IP,全局IP要求唯一,但是私人IP不是唯一的。 將報文發給路由器進行…

國內真實的交換機、路由器和分組情況

一、未考慮擁擠情況理想狀態的網絡通信 前面我對骨干網: 宜春城區SDH網圖分析-CSDN博客 數據鏈路層MAC傳輸: 無線通信網卡底層原理(Inter Wi-Fi AX201)_ax201ngw是cnvio轉pci-e-CSDN博客 物理層、數據鏈路層、網絡層及傳輸層…

atomic常用類方法

Java中的java.util.concurrent.atomic包提供了多種原子操作工具類,以下是核心類及其方法:?1. AtomicBoolean??方法?:get():獲取當前值set(boolean newValue):強制設置值compareAndSet(boolean expect, boolean upd…

算法題打卡力扣第3題:無重復字符的最長子串(mid)

文章目錄題目描述解法一:暴力解解法二:滑動窗口題目描述 解法一:暴力解 遍歷每一個可能的子串,然后逐一判斷每個子串中是否有重復字符。 具體步驟: 使用兩層嵌套循環來生成所有子串的起止位置: 外層循環 i…

HTML5 簡介和基礎骨架

一、HTML5 簡介HTML5 是 HTML(超文本標記語言)的第五個主要版本,于 2014 年 10 月由 W3C(萬維網聯盟)正式發布。它不僅是對 HTML4.01 和 XHTML 的升級,更是一套完整的 Web 技術標準,包含了新的標…

.NET技術深度解析:現代企業級開發指南

每日激勵: “不要一直責怪過去的自己,他曾經站在霧里也很迷茫” 🌟 Hello,我是蔣星熠Jaxonic! 🌈 在浩瀚無垠的技術宇宙中,我是一名執著的星際旅人,用代碼繪制探索的軌跡。 &#x1…

蘋果手機文本轉音頻,自行制作背誦素材

當你在學習一段專業內容或者背誦重要知識點時,是不是有時會覺得眼睛看久了疲憊,而且記憶效果也不太理想呢?利用手頭的蘋果手機或iPad,你可以輕松將文本內容生成音頻文件,然后隨時隨地反復聽,這對于備考人士…

電子電子技術知識------MOSFET管

電子電子技術知識------MOSFET管前言一、結構與符號二、工作原理1.小功率MOSFET(橫向導電)2.電力MOS管三、基本特性總結前言 MOSFET是電力場效應晶體管的英文簡寫,又稱功率mos管,mos管 一、結構與符號 二、工作原理 1.小功率M…

仿真波導中超短脈沖傳輸中的各種非線性效應所產生的超連續譜

在波導中,超短脈沖傳輸時會受到各種非線性效應的影響,從而產生超連續譜。這些非線性效應包括自相位調制(SPM)、交叉相位調制(XPM)、四波混頻(FWM)等。基于MATLAB的仿真程序&#xff…

docker-compose的使用

目錄 1-查看容器 2-查看docker鏡像 3-運行兩個容器 4-進入idea 編寫docker-compose文件中的內容 5-編寫配置文件 6-運行 7-docker-compose中的一些命令 啟動服務 關閉服務 查看正在運行的容器 查看日志 重構新的服務 指令docker-compose 文件名 停止已運行的服務 啟動 重啟 1-查…

搭建分布式Hadoop集群[2025] 實戰筆記

文章目錄 一、實戰目標 二、集群規劃 1. 集群拓撲結構 2. 角色分配 說明: 三、環境準備 1. 修改 SSH 端口(安全加固) 操作步驟(所有節點執行): 2. FinalShell 連接配置 3. 防火墻配置 啟動并配置 firewalld: 關閉并禁用防火墻(生產環境建議精細配置,測試環境可關閉):…

【自記錄】Ubuntu20.04下Python自編譯

因為需要新的Python版本,但是我們不希望修改系統原生的Python版本避免某些系統應用無法啟動,因此自建一個干凈的路徑引入Python。 1.編譯 以下在aarch64下測試,x64下可能有差異 必須把相關的devel包安裝完畢,否則python可能缺功能…

Linux - 進程切換

🎁個人主頁:工藤新一 🔍系列專欄:C面向對象(類和對象篇) 🌟心中的天空之城,終會照亮我前方的路 🎉歡迎大家點贊👍評論📝收藏?文章 文章目錄進…

機器算法(五)模型選擇與調優

一 交叉驗證1 保留交叉驗證HoldOutholdOut Cross-validation(Train-Test Split)在這種交叉驗證技術中,整個技術集被隨機劃分為訓練集和驗證集。根據經驗法則,整個數據集的近70%被用作訓練集,其余30%被用作驗證集,也就是最常使用的…

Ubuntu 服務器實戰:Docker 部署 Nextcloud+ZeroTier,打造可遠程訪問的個人云

本次部署基于 Ubuntu 系統(桌面版 / Server 版通用,核心操作一致),硬件配置參考如下,低配置主機可順暢運行: ubuntu服務器配置如下 硬件類型具體型號/參數CPUIntel Core i3-6100T內存條8GB(DD…

移動硬盤刪除東西后,沒有釋放空間

請按照以下步驟,從最簡單、最常見的原因開始排查和解決:主要原因和解決方案1. 檢查操作系統回收站 (最常見原因!)這是最容易被忽略的一點。當您直接在外接移動硬盤上刪除文件時,文件并不會直接消失,而是被移到了該移動…

spring boot驢友結伴游網站的設計與實現(代碼+數據庫+LW)

摘要 本文介紹了基于Spring Boot框架開發的驢友結伴游網站的設計與實現。該網站旨在為旅行愛好者提供一個便捷的平臺,使他們能夠輕松地尋找伙伴、預定酒店、參與活動以及分享旅行經歷。系統主要分為兩大模塊:用戶模塊和管理員模塊。用戶可以通過注冊賬號…

人機之間的強交互與弱交互

人機交互不是簡單的人機,其本質是人機環境系統的交互。在這個系統中,人和機器不是孤立的存在,而是在特定環境下相互影響、相互作用的一部分。人機之間的強交互與弱交互可以從以下幾個方面來理解:1、人機強交互通常是指人與機器之間…

OpenCV 基礎知識總結

學習網站 https://zhuanlan.zhihu.com/p/483604320 命名空間 using namespace cv; Mat 作用 創建圖像(矩陣) 格式 Mat image; //創建一個空圖像image,大小為0 Mat image(100,100,CV_8U); //指定矩陣大小(矩陣行數/列數&#xff09…

C#基礎(⑦user32.dll)

我們來詳細學習如何使用 user32.dll,它是 Windows 系統中負責用戶界面交互的核心 DLL,包含窗口管理、消息處理、鍵盤鼠標輸入等功能。下面從基礎到進階,一步一步教你調用其中的常用函數。在 C# 中調用 user32.dll 需要使用 DllImport 特性&am…