从零开始:用代码解析区块链的核心工作原理

 

区块链技术被誉为信任的机器,它正在重塑金融、供应链、数字身份等众多领域。但对于许多开发者来说,它仍然像一个神秘的黑盒子。今天,我们将抛开炒作的泡沫,深入技术本质,用大约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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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…