【实践·专业课】内存管理-存储管理-文件系统

1. 基于Linux的简单区块链实现

1.1. 环境准备

确保使用的 Linux 系统(如 Ubuntu、CentOS 等)已安装 Python 3。

在终端输入python3命令,若出现 Python 解释器的版本信息等提示,则表示已安装;

若提示未找到命令,则需根据 Linux 系统的包管理工具(如 Ubuntu 下的 apt-get 或 CentOS 下的 yum)安装 Python 3。例如,在 Ubuntu 系统中,可执行sudo apt-get install python3命令进行安装。

1.2. 代码编写与运行

在 Linux 终端中,使用文本编辑器Vim建一个新的 Python 文件,命名为blockchain.py

在终端输入

vim blockchain.py

进入 Vim 编辑模式。按i键进入插入模式,开始粘贴代码。粘贴完成后,按Esc键返回普通模式,输入:wq保存并退出。

将以下代码复制粘贴到blockchain.py文件中:

import hashlib
import time
import json

class Block:
    def __init__(self, index, previous_hash, data):
        self.index = index
        self.timestamp = time.time()
        self.data = data
        self.previous_hash = previous_hash
        self.hash = self.calculate_hash()

    def calculate_hash(self):
        block_string = json.dumps(self.__dict__, sort_keys=True).encode()
        return hashlib.sha256(block_string).hexdigest()

class Blockchain:
    def __init__(self):
        self.chain = []
        self.create_block(0)  # 创世区块

    def create_block(self, data):
        previous_block = self.chain[-1] if self.chain else None
        previous_hash = previous_block.hash if previous_block else "0"
        block = Block(len(self.chain), previous_hash, data)
        self.chain.append(block)
        self.save_block_to_file(block)  # 保存到文件
        return block

    def save_block_to_file(self, block):
        with open('blockchain.txt', 'a') as f:
            f.write(f"{block.index},{block.timestamp},{block.data},{block.hash},{block.previous_hash}\n")

    def print_chain(self):
        for block in self.chain:
            print(f"Index: {block.index}, Timestamp: {block.timestamp}, Data: {block.data}, Hash: {block.hash}, Previous Hash: {block.previous_hash}")

# 实验:创建区块链并添加区块
blockchain = Blockchain()
blockchain.create_block("First block data")
blockchain.create_block("Second block data")
blockchain.print_chain()

在终端中,进入blockchain.py所在的目录,键入

python3 blockchain.py

运行程序

1.3. 结果查看与分析

运行程序后得到结果

winky@winky-virtual-machine:~/test4$ python3 blockchain.py
Index: 0, Timestamp: 1733812989.9273984, Data: 0, Hash: 30812df98c3dffcb2b2a91bbdbb9d6d41279a631b82e717b6aeff6d0e647c69c, Previous Hash: 0
Index: 1, Timestamp: 1733812989.9276085, Data: First block data, Hash: f5541f21c8766db11dc55023cd673662506ba755af4e490d56ef6e66e956c98f, Previous Hash: 30812df98c3dffcb2b2a91bbdbb9d6d41279a631b82e717b6aeff6d0e647c69c
Index: 2, Timestamp: 1733812989.9276638, Data: Second block data, Hash: 53f8b9f63230cd7edb4c1b98598bfab884a5a35cd22e74b8098c941bbb892b53, Previous Hash: f5541f21c8766db11dc55023cd673662506ba755af4e490d56ef6e66e956c98f

区块链程序成功运行并生成了包含三个区块的区块链。显示的区块链信息分别是:

索引(Index):每个区块都有一个唯一的索引,从 0 开始。这里显示了三个区块,索引分别为 0、1、2,表明区块链正确地依次添加了这些区块。

时间戳(Timestamp):记录了区块创建的时间,以 Unix 时间戳的形式呈现(自 1970 年 1 月 1 日以来的秒数)。例如,第一个区块的时间戳为 1733812989.9273984,第二个区块为 1733812989.9276085,第三个区块为 1733812989.9276638。可以看到时间戳非常接近,这符合在短时间内连续创建区块的情况。

数据(Data):显示了每个区块存储的数据。创世区块(索引为 0)的数据为 "0",第二个区块的数据为 "First block data",第三个区块的数据为 "Second block data"。这表明在创建区块时,数据被正确地传入并记录。

哈希值(Hash):每个区块都有一个唯一的哈希值,用于标识区块的内容。哈希值是通过对区块的所有属性进行计算得到的,任何一个属性的微小变化都会导致哈希值的巨大改变。例如,第一个区块的哈希值为 30812df98c3dffcb2b2a91bbdbb9d6d41279a631b82e717b6aeff6d0e647c69c,后续区块的哈希值也各不相同,并且每个区块的 Previous Hash 属性都指向前一个区块的哈希值,形成了区块链的链式结构。

前一个区块的哈希值(Previous Hash):这是区块链中链接各个区块的关键。可以看到,除了创世区块(其前一个哈希值为 0,表示没有前一个区块),其他区块的 Previous Hash 都正确地指向了前一个区块的哈希值。例如,第二个区块的 Previous Hash 为 30812df98c3dffcb2b2a91bbdbb9d6d41279a631b82e717b6aeff6d0e647c69c,与第一个区块的哈希值一致;第三个区块的 Previous Hash 为 f5541f21c8766db11dc55023cd673662506ba755af4e490d56ef6e66e956c98f,与第二个区块的哈希值一致。


程序运行后,会在当前目录下生成一个名为blockchain.txt的文件,保存以上生成结果。使用文本编辑器打开该文件,查看其中的内容,确认区块数据是否已按照预期格式保存。每个区块的数据应包含索引、时间戳、数据、哈希值和前一个区块的哈希值,且区块之间通过哈希值形成链状结构。

文件内容如下:

2. 扩展区块链功能与智能合约执行

2.1. 编写智能合约代码

在 Linux 终端中,使用文本编辑器Vim建一个新的 Python 文件,命名为contract.py

在终端输入

vim contract.py

进入 Vim 编辑模式。按i键进入插入模式,开始粘贴代码。粘贴完成后,按Esc键返回普通模式,输入:wq保存并退出。

将以下代码复制粘贴到contract.py文件中:

import hashlib
import time
import json

# 定义区块类
class Block:
    def __init__(self, index, previous_hash, data, contract=None):
        self.index = index
        self.timestamp = time.time()
        self.data = data
        self.previous_hash = previous_hash
        self.hash = self.calculate_hash()
        self.contract = contract

    def calculate_hash(self):
        block_string = json.dumps(self.__dict__, sort_keys=True).encode()
        return hashlib.sha256(block_string).hexdigest()

# 定义区块链类
class Blockchain:
    def __init__(self):
        self.chain = []
        self.contracts = []
        self.create_block(0, "Genesis Block")

    def create_block(self, data, contract=None):
        previous_block = self.chain[-1] if self.chain else None
        previous_hash = previous_block.hash if previous_block else "0"
        block = Block(len(self.chain), previous_hash, data, contract)
        self.chain.append(block)
        self.save_block_to_file(block)
        if contract:
            self.contracts.append(contract)
        return block

    def save_block_to_file(self, block):
        with open('blockchain.txt', 'a') as f:
            f.write(f"{block.index},{block.timestamp},{block.data},{block.hash},{block.previous_hash}\n")

    def print_chain(self):
        for block in self.chain:
            print(f"Index: {block.index}, Timestamp: {block.timestamp}, Data: {block.data}, Hash: {block.hash}, Previous Hash: {block.previous_hash}")

# 定义合约类
class Contract:
    def __init__(self, creator, beneficiary, amount, status="Pending"):
        self.creator = creator
        self.beneficiary = beneficiary
        self.amount = amount
        self.status = status

    def create(self):
        print(f"Contract created by {self.creator} for {self.beneficiary} with amount {self.amount}.")
        with open('contracts.txt', 'a') as f:
            f.write(f"Creator: {self.creator}, Beneficiary: {self.beneficiary}, Amount: {self.amount}, Status: {self.status}\n")

    def execute(self):
        self.status = "Executed"
        print(f"Contract executed. Transferring {self.amount} from {self.creator} to {self.beneficiary}.")
        with open('contracts.txt', 'r') as f:
            lines = f.readlines()
        with open('contracts.txt', 'w') as f:
            for line in lines:
                if str(self.creator) in line and str(self.beneficiary) in line and str(self.amount) in line:
                    f.write(line.replace(self.status, "Executed"))
                else:
                    f.write(line)
        blockchain.create_block(f"Contract {self.creator}-{self.beneficiary} executed", self)

    def query_status(self):
        print(f"Contract status: {self.status}")

# 全局区块链实例
blockchain = Blockchain()

# 查询合约状态函数
def query_contract_status(contract_id):
    with open('contracts.txt', 'r') as f:
        lines = f.readlines()
    for line in lines:
        if contract_id in line:
            return line.split(',')[-1].strip()
    return "Contract not found"

# 查询合约历史记录函数
def query_contract_history(contract_id):
    history = []
    with open('blockchain.txt', 'r') as f:
        lines = f.readlines()
    for line in lines:
        if contract_id in line:
            history.append(line)
    return history

if __name__ == "__main__":
    # 创建合约实例
    contract1 = Contract("Alice", "Bob", 100)
    # 创建合约
    contract1.create()
    # 执行合约(转账)
    contract1.execute()
    # 查询合约状态
    contract1.query_status()
    # 查询合约状态(通过函数)
    print(query_contract_status("Alice"))
    # 查询合约历史记录
    print(query_contract_history("Alice"))

在终端中,进入contract.py所在的目录,键入

python3 contract.py

运行程序

2.2. 结果查看与分析

运行程序后得到结果

winky@winky-virtual-machine:~/test4$ python3 contract.py
Contract created by Alice for Bob with amount 100.
Contract executed. Transferring 100 from Alice to Bob.
Contract status: Executed
Status: Pending
['1,1733819158.3580446,Contract Alice-Bob executed,9649bc55b6ba44cd6db20872fe3362cc4846f763ceb7929be0f8b113fb196f85,5aa3bb9c8ea1d9a487f63f148f2d923bf2285d8001946a5eee542c534279f912\n']

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/934656.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

科技潮头浪接天,一桥飞架两界连。EthernetIP转Profinet互译连

本案例介绍的是西门子1200PLC通过稳联技术PROFINET转EtherNetIP网关(WL-ABC2006)连接HCS-6100系统配置案例。 打开稳联技术Ethernetip转profient网关(WL-ABC2006)配置软件,因为网关作为EtherNetIP从站,所以选择PN2EIP。设置网关Pr…

【网络篇】TCP知识

TCP首部格式? 为什么需要 TCP 协议? TCP 工作在哪一层? IP 层是不可靠的,它不保证网络包的交付、不保证网络包的按序交付也不保证网络包中的数据的完整性。如果需要保障网络数据包的可靠性,那么就需要由上层&#xff0…

PDFMathTranslate,PDF多语言翻译,批量处理,学术论文,双语对照(WIN/MAC)

分享一个非常实用的PDF文档翻译项目——PDFMathTranslate。作为一个经常逛GitHub的开发者,我总喜欢翻看各种项目附带的论文,虽然大多时候是瞎研究,但却乐在其中。该项目能够完美保留公式、图表、目录和注释,对于需要阅读外文文献的…

Ape-DTS:开源 DTS 工具,助力自建 MySQL、PostgreSQL 迁移上云

Ape-DTS 是一款高效、轻量级且功能强大的开源工具,专注于解决数据迁移、同步、校验、订阅与加工的需求。无论是将自建的 MySQL/PostgreSQL 数据库迁移到云端,还是在不同数据库间进行数据迁移,Ape-DTS 都能为您提供便捷且可靠的解决方案。它特…

【经典论文阅读】Latent Diffusion Models(LDM)

Latent Diffusion Models High-Resolution Image Synthesis with Latent Diffusion Models 摘要 动机:在有限的计算资源下进行扩散模型训练,同时保持质量和灵活性 引入跨注意力层,以卷积方式实现对一般条件输入(如文本或边界框…

使用torch模拟 BMM int8量化计算。

使用torch模型BMM int8计算。 模拟:BMM->softmax->BMM 计算流程 import torch import numpy as np torch.manual_seed(777) def int8_quantize_per_token(x: torch.Tensor, axis: int -1, attnsFalse):if x.dtype ! torch.float32:x x.type(torch.float32)…

Leetcode 每日一题 219.存在重复元素 II

目录 问题描述 输入输出格式 示例 算法分析 过题图片 代码实现 复杂度分析 题目链接 总结 问题描述 给定一个整数数组nums和一个整数k&#xff0c;我们需要判断数组中是否存在两个不同的索引i和j&#xff0c;使得nums[i] nums[j]且|i - j| < k。如果存在这样的i和…

ragflow连不上ollama的解决方案

由于前期wsl默认装在C盘&#xff0c;后期部署好RagFlow后C盘爆红&#xff0c;在连接ollama的时候一直在转圈圈&#xff0c;问其他人没有遇到这种情况&#xff0c;猜测是因为内存不足无法加载模型导致&#xff0c;今天重新在E盘安装wsl 使用wsl装Ubuntu Win11 wsl-安装教程 如…

PR的选择与移动

选择工具 可以选择序列上的剪辑&#xff0c;如果需要多选可以按住shift键选中多个剪辑 CtrlA&#xff1a;可以进行全选 编组 选中多个剪辑后“右键-编组“可以将所选的剪辑连接在一起。这时单击任意剪辑都可以选中全部 向前选择轨道工具与向后选择轨道工具 向前选择轨道工具…

使用C#基于ADO.NET编写MySQL的程序

MySQL 是一个领先的开源数据库管理系统。它是一个多用户、多线程的数据库管理系统。MySQL 在网络上特别流行。MySQL 数据库可在大多数重要的操作系统平台上使用。它可在 BSD Unix、Linux、Windows 或 Mac OS 上运行。MySQL 有两个版本&#xff1a;MySQL 服务器系统和 MySQL 嵌入…

Python3中赋值运算符说明二

一. 简介 前面文章简单学习了 Python3中一些赋值运算符&#xff0c;文章如下&#xff1a; Python3中赋值运算符上篇-CSDN博客 本文继续学习 Python3中另外一些赋值运算符。 二. Python3 中赋值运算符 1. Python3 中赋值运算符 前一篇文章简单学习了 Python3 中的一些赋值…

如何在 Ubuntu 22.04 上安装和使用 Apache Kafka

简介 Apache Kafka是一个高性能、低延迟的分布式流处理平台&#xff0c;广泛用于构建实时数据管道和流式应用。本文将指导你如何在Ubuntu 22.04系统上快速部署Apache Kafka&#xff0c;让你体验到Kafka在处理大规模实时数据流方面的强大能力。通过本教程&#xff0c;你将学会如…

群控系统服务端开发模式-应用开发-自动退出发送邮件

一、修改Redis配置文件 将redis.conf里面的notify-keyspace-events参数对应的值改为Ex&#xff0c;具体代码如下&#xff1a; notify-keyspace-events Ex 二、创建控制台命令 在根目录下config文件夹下找到console.php文件修改&#xff0c;具体代码如下&#xff1a; <?p…

前端篇 -- jQuery详细教程

jQuery教程 jQuery官网1.1 jQuery的基本介绍1.2 jQuery 基本开发步骤1.3 jQuery对象和DOM对象 1.3.1 jQuery对象的基本介绍1.3.2 DOM对象转 jQuery对象1.3.3 jQuery对象转DOM对象 1.4 jQuery选择器 1.4.1 jQuery 基本选择器介绍1.4.2 基本选择器1.4.3 层次选择器1.4.4 基础过滤…

【数模学习笔记】模糊综合评价

声明&#xff1a;以下笔记中的图片均来自“数学建模学习交流”清风老师的课程ppt&#xff0c;仅用作学习交流使用 模糊综合评价 文章目录 模糊综合评价模糊数学经典集合和模糊集合的基本概念经典集合和特征函数模糊集合和隶属函数模糊集合的分类 隶属函数的确定方法方法一 模糊…

STM32F103单片机使用STM32CubeMX新建IAR工程步骤

打开STM32CubeMX软件&#xff0c;选择File 选择新建工程 在打开的窗口输入单片机型号 在右下角选择单片机型号&#xff0c;然后点右上角 start project&#xff0c;开始新建工程。 接下来设置调试接口&#xff0c;在左边System Core中选择 SYS&#xff0c;然后在右右边debu…

相机(Camera)硬件组成详解

简介&#xff1a;个人学习分享&#xff0c;如有错误&#xff0c;欢迎批评指正。 写在前面&#xff1a;可以去B站观看一些相机原理的视频来配合学习&#xff0c;这里推荐&#xff1a;推荐1&#xff0c;推荐2&#xff0c;推荐3 相机&#xff08;Camera&#xff09;是一种复杂的光…

String【Redis对象篇】

&#x1f3c6; 作者简介&#xff1a;席万里 ⚡ 个人网站&#xff1a; 文章目录 String1.String是什么&#xff1f;2.String怎么用&#xff1f;3.常用操作4.底层实现&#xff1f;5.总结&#xff08;重点&#xff09; String 1.String是什么&#xff1f; String就是字符串&…

乘上 SpringBoot 东风,广场舞团掀起律动热潮

2 系统开发环境 2.1 Java技术 Java是由Sun公司推出的一门跨平台的面向对象的程序设计语言。因为Java 技术具有卓越的通用性、高效性、健壮的安全性和平台移植性的特点&#xff0c;而且Java是开源的&#xff0c;拥有全世界最大的开发者专业社群&#xff0c;所以Java的发展迅速。…

组件开发的环境准备

目录​​​​​​​ node.js的安装 npm镜像源的修改 pnpm包管理器的安装&#xff08;全局安装&#xff09; 基于pnpm创建脚手架项目 node.js的安装 Node.js 是一个开源的、跨平台的 JavaScript 运行环境&#xff0c;能够在服务器端执行 JavaScript 代码。 a.下载与安装 …