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

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 jsonclass Block:def __init__(self, index, previous_hash, data):self.index = indexself.timestamp = time.time()self.data = dataself.previous_hash = previous_hashself.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 Noneprevious_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 blockdef 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 = indexself.timestamp = time.time()self.data = dataself.previous_hash = previous_hashself.hash = self.calculate_hash()self.contract = contractdef 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 Noneprevious_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 blockdef 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 = creatorself.beneficiary = beneficiaryself.amount = amountself.status = statusdef 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 historyif __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']

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL 学习 之 批量插入数据性能问题

文章目录 现象优化 现象 在使用 kettle 同步大数据的数据到我们的 MySQL 数据库中时发现,数据量大时插入效率很慢,大约在 2000/s 优化 在 MySQL 驱动连接中添加 rewriteBatchedStatementstrue 参数,减少 网络 IO DB IO 耗时 默认关闭指定…

2个GitHub上最近比较火的Java开源项目

1. SpringBlade 微服务架构 标题 SpringBlade 微服务架构 摘要 SpringBlade 是一个由商业级项目升级优化而来的微服务架构,采用Spring Boot 3.2、Spring Cloud 2023等核心技术构建,遵循阿里巴巴编码规范,提供基于React和Vue的两个前端框架&am…

MongoDB 建模调优change stream实战

MongoDB开发规范 (1)命名原则。数据库、集合命名需要简单易懂,数据库名使用小写字符,集合名称使用统一命名风格,可以统一大小写或使用驼峰式命名。数据库名和集合名称均不能超过64个字符。 (2&#xff09…

Ubuntu 环境美化

一、终端选择 zsh 参考文章使用 oh-my-zsh 美化终端 Oh My Zsh 是基于 zsh 命令行的一个扩展工具集,提供了丰富的扩展功能。 先安装zsh再安装Oh My Zsh 1.zsh安装 sudo apt-get install zsh 2.设置默认终端为 zsh chsh -s /bin/zsh 3.安装 oh-my-zsh 官网&…

MySQL 在线 DDL 变更的一个异常问题

文章目录 前言1. 模拟现场2. 原因推测3. 如何解决4. 误导报错后记 前言 业务执行一条 DDL engineinnodb 失败了很多次,报错 ERROR 1062 (23000): Duplicate entry xxx for key ‘xxx’,在官方文档中也提到过,Online DDL 期间可能会出现 ERRO…

分布式事务的前世今生-纯理论

一个可用的复杂的系统总是从可用的简单系统进化而来。反过来这句话也正确: 从零开始设计的复杂的系统从来都用不了,也没办法让它变的可用。 --John Gal 《系统学》 1975 1. 事务的概念 百科: 事务(Transaction),一般是…

微前端框架micro-app中的数据通信机制

在微前端框架micro-app中,getData方法和addDataListener方法都是用于数据通信的重要工具,但它们在使用方式和功能上存在一些显著的差别。 getData方法 功能:getData方法用于直接获取micro-app框架注入的全局对象window.microApp中存储的数据…

操作系统的文件系统

文件系统的基本组成 ⽂件系统是操作系统中负责管理持久数据的⼦系统,说简单点,就是负责把⽤户的⽂件存到磁盘硬件中, 因为即使计算机断电了,磁盘⾥的数据并不会丢失,所以可以持久化的保存⽂件。 ⽂件系统的基本数据单位…

vue使用百度富文本编辑器

1、安装 npm add vue-ueditor-wrap 或者 pnpm add vue-ueditor-wrap 进行安装 2、下载UEditor 官网:ueditor:rich text 富文本编辑器 - GitCode 整理好的:vue-ueditor: 百度编辑器JSP版 因为官方的我没用来,所以我自己找的另外的包…

浅谈自然语言处理技术(NLP)在银行领域的应用

自然语言处理技术(NLP)通过解析和理解海量非结构化数据,为银行领域提供了前所未有的洞察力和决策支持。这项技术的应用不仅优化了风险管理,还革新了客户服务和市场分析等多个方面。 银行系统中存在大量的非结构化信息,这些信息不仅数据量庞大,而且种类繁多,处理起来相对…

nvm安装指定版本显示不存在及nvm ls-remote 列表只出现 iojs 而没有 node.js 解决办法

在使用 nvm install 18.20.3 安装 node 时会发现一直显示不存在此版本 Version 18.20.3 not found - try nvm ls-remote to browse available versions.使用 nvm ls-remote 查看可安装列表时发现,列表中只有 iojs 解决方法: 可以使用以下命令查看可安装…

算法基础 -- 背包问题类型与算法整理

背包问题类型与算法整理 1. 背包问题类型与描述 背包问题类型问题描述0-1 背包问题每种物品只能选择一次,求如何选择物品使得总价值最大。完全背包问题每种物品可以选择多次,求如何选择物品使得总价值最大。多重背包问题每种物品选择次数有限&#xff…

Linux磁盘存储概念(六)

本文为Ubuntu Linux操作系统- 第六弹 今天开始新的知识点,讲磁盘存储问题 上期回顾:Linux文件、目录权限问题 今天由帝皇侠陪伴大家学习!!! 文章目录 磁盘数据组织低级格式化磁盘分区高级格式化 磁盘设备命名磁盘分区分…

鼠标右键单击Git Bash here不可用

最近在学习git时突然发现右键的git bash没反应,但是去点击应用图标就能正常运行,通常是因为你在安装git之后改变了它的目录名称或者位置,我就是因为安装后改变了一个文件夹的文件名导致不可用 在安装git时系统会默认给鼠标右键选项的git Bas…

DApp开发如何平衡性能与去中心化?

DApp的核心价值在于信任、透明和去中心化,但这些特点往往伴随着性能的瓶颈和高成本。在DApp开发中,如何在保证去中心化的前提下提升性能,成为开发者面临的重要挑战。如何实现性能与去中心化的平衡是一个重要课题。 一、为什么去中心化影响性…

计算机网络之NAT、代理服务、内网穿透、内网打洞

个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 计算机网络之NAT、代理服务、内网穿透、内网打洞 收录于专栏【计算机网络】 本专栏旨在分享学习计算机网络的一点学习笔记,欢迎大家在评论区交流讨论…

在 Vite 和 Webpack 中处理 SVG 图标:vite-plugin-svg-icons 与 svg-sprite-loader 原理比较

在 Vite 和 Webpack 中处理 SVG 图标:vite-plugin-svg-icons 与 svg-sprite-loader 原理比较 SVG 图标是前端开发中常用的资源,它不仅能提供更清晰的显示效果,还能通过 CSS 控制颜色和大小。随着现代构建工具如 Vite 和 Webpack 的普及&…

大数据新视界 -- 大数据大厂之 Hive 数据导入:多源数据集成的策略与实战(上)(3/ 30)

💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

VUE 搭建一个脚手架

一、安装 Node.js 、 npm、Vue Cli node -v npm -v npm install -g vue/cli vue --version // 查看是否安装成功 二、 创建项目 起名 vue create my-vue-project 三、项目目录 cd my-vue-project npm install // 如果没有自动安装,手动安装下依赖 四、启动项目 n…

Python中的 `string.Template`:用法和使用场景

Python中的 `string.Template`:用法和使用场景 什么是 `string.Template`?`Template` 的基本用法代码解析使用 `safe_substitute`实用场景1. 动态生成消息2. 生成文件内容如何处理复杂场景?总结在Python中,字符串处理是非常常见的任务,其中string.Template提供了一种简单、…