根据你的需求,我将创建一个完整的区块链注册系统,包含以下功能:
1. 区块链存储注册信息
2. 支持注册多个寝室同学信息
3. 可以修改已注册同学的信息
4. 修改后仍能正常登录
```python
import hashlib
from datetime import datetime
# 区块链类
class Blockchain:
def __init__(self):
self.chain = []
def add_block(self, user_info):
"""添加新区块到区块链"""
index = len(self.chain)
if index == 0:
# 创世区块
previous_hash = "0"
else:
# 获取上一个区块的哈希
previous_hash = self.chain[-1]["current_hash"]
# 创建区块
block = {
"index": index,
"timestamp": str(datetime.now()),
"data": {
"username": user_info["username"],
"password": user_info["password"],
"name": user_info["name"],
"student_id": user_info["student_id"]
},
"previous_hash": previous_hash,
"current_hash": self.calculate_hash(index, user_info, previous_hash)
}
self.chain.append(block)
return block
def calculate_hash(self, index, user_info, previous_hash):
"""计算区块哈希值"""
data_string = f"{index}{user_info['username']}{user_info['password']}{user_info['name']}{user_info['student_id']}{previous_hash}"
return hashlib.sha256(data_string.encode()).hexdigest()
def verify_chain(self):
"""验证区块链完整性"""
for i in range(1, len(self.chain)):
current_block = self.chain[i]
previous_block = self.chain[i-1]
# 验证当前区块的previous_hash是否正确
if current_block["previous_hash"] != previous_block["current_hash"]:
return False
# 重新计算当前区块的哈希值进行验证
recalculated_hash = self.calculate_hash(
current_block["index"],
current_block["data"],
current_block["previous_hash"]
)
if recalculated_hash != current_block["current_hash"]:
return False
return True
def find_user_by_username(self, username):
"""根据用户名查找用户信息"""
for block in self.chain:
if block["data"]["username"] == username:
return block["data"]
return None
def update_user_info(self, username, new_info):
"""更新用户信息"""
for i, block in enumerate(self.chain):
if block["data"]["username"] == username:
# 更新用户信息
self.chain[i]["data"].update(new_info)
# 重新计算并更新当前区块的哈希值
self.chain[i]["current_hash"] = self.calculate_hash(
block["index"],
block["data"],
block["previous_hash"]
)
# 更新后续所有区块的哈希值
for j in range(i + 1, len(self.chain)):
self.chain[j]["previous_hash"] = self.chain[j-1]["current_hash"]
self.chain[j]["current_hash"] = self.calculate_hash(
self.chain[j]["index"],
self.chain[j]["data"],
self.chain[j]["previous_hash"]
)
print(f"用户 {username} 的信息已更新!")
return True
print(f"未找到用户: {username}")
return False
def display_chain(self):
"""显示区块链信息"""
print("\n" + "="*60)
print("区块链信息:")
print("="*60)
for block in self.chain:
print(f"\n区块 #{block['index']}:")
print(f" 时间戳: {block['timestamp']}")
print(f" 用户信息:")
print(f" - 用户名: {block['data']['username']}")
print(f" - 姓名: {block['data']['name']}")
print(f" - 学号: {block['data']['student_id']}")
print(f" 上一个区块哈希: {block['previous_hash'][:20]}...")
print(f" 当前区块哈希: {block['current_hash'][:20]}...")
print(f"\n区块链完整性验证: {'通过' if self.verify_chain() else '失败'}")
# 注册系统类
class RegistrationSystem:
def __init__(self):
self.blockchain = Blockchain()
def register_dorm_mate(self):
"""注册寝室同学信息"""
print("\n" + "="*60)
print("寝室同学注册系统")
print("="*60)
name = input("请输入同学姓名(中文): ").strip()
username = input("请输入用户名(姓名拼音缩写,如zs): ").strip().lower()
student_id = input("请输入学号: ").strip()
password = input("请设置密码: ").strip()
# 检查用户名是否已存在
if self.blockchain.find_user_by_username(username):
print(f"错误: 用户名 '{username}' 已存在!")
return False
user_info = {
"username": username,
"password": password,
"name": name,
"student_id": student_id
}
# 添加到区块链
block = self.blockchain.add_block(user_info)
print(f"\n注册成功!")
print(f"姓名: {name}")
print(f"用户名: {username}")
print(f"学号: {student_id}")
print(f"已添加到区块链区块 #{block['index']}")
return True
def modify_user_info(self):
"""修改已注册同学的信息"""
print("\n" + "="*60)
print("修改用户信息")
print("="*60)
username = input("请输入要修改的用户名: ").strip().lower()
# 查找用户
user_info = self.blockchain.find_user_by_username(username)
if not user_info:
print(f"未找到用户: {username}")
return False
print(f"\n当前用户信息:")
print(f"姓名: {user_info['name']}")
print(f"用户名: {user_info['username']}")
print(f"学号: {user_info['student_id']}")
print("\n请输入新的信息(直接回车保持原值):")
new_name = input(f"新姓名 [{user_info['name']}]: ").strip()
new_student_id = input(f"新学号 [{user_info['student_id']}]: ").strip()
new_password = input("新密码(输入新密码或直接回车保持原密码): ").strip()
# 构建更新信息
update_info = {}
if new_name:
update_info["name"] = new_name
if new_student_id:
update_info["student_id"] = new_student_id
if new_password:
update_info["password"] = new_password
if update_info:
return self.blockchain.update_user_info(username, update_info)
else:
print("未进行任何修改")
return False
def login(self):
"""用户登录"""
print("\n" + "="*60)
print("用户登录")
print("="*60)
username = input("请输入用户名: ").strip().lower()
password = input("请输入密码: ").strip()
# 查找用户
user_info = self.blockchain.find_user_by_username(username)
if user_info and user_info["password"] == password:
print(f"\n登录成功!")
print(f"欢迎 {user_info['name']} 同学")
print(f"用户名: {user_info['username']}")
print(f"学号: {user_info['student_id']}")
return True
else:
print("\n登录失败!用户名或密码错误。")
return False
def show_registered_users(self):
"""显示所有已注册用户"""
print("\n" + "="*60)
print("已注册用户列表")
print("="*60)
if not self.blockchain.chain:
print("暂无注册用户")
return
for i, block in enumerate(self.blockchain.chain):
user_info = block["data"]
print(f"{i+1}. 姓名: {user_info['name']}")
print(f" 用户名: {user_info['username']}")
print(f" 学号: {user_info['student_id']}")
print()
# 主程序
def main():
system = RegistrationSystem()
while True:
print("\n" + "="*60)
print("区块链寝室同学注册系统")
print("="*60)
print("1. 注册寝室同学")
print("2. 用户登录")
print("3. 修改用户信息")
print("4. 查看已注册用户")
print("5. 查看区块链信息")
print("6. 退出系统")
print("="*60)
choice = input("请选择操作 (1-6): ").strip()
if choice == "1":
system.register_dorm_mate()
elif choice == "2":
system.login()
elif choice == "3":
system.modify_user_info()
elif choice == "4":
system.show_registered_users()
elif choice == "5":
system.blockchain.display_chain()
elif choice == "6":
print("感谢使用区块链寝室同学注册系统!")
break
else:
print("无效选择,请重新输入!")
if __name__ == "__main__":
main()
```
## 系统特点说明:
### 1. **区块链存储机制**
- 每个用户的信息存储在一个区块中
- 每个区块包含:索引、时间戳、用户数据、前一个区块哈希、当前区块哈希
- 区块链完整性验证功能
### 2. **核心功能**
- **注册功能**:注册寝室同学信息(姓名、用户名、学号、密码)
- **登录功能**:验证用户名和密码进行登录
- **修改功能**:可以修改已注册用户的姓名、学号、密码
- **查看功能**:查看所有已注册用户和区块链详细信息
### 3. **修改信息后的登录保证**
- 当用户信息被修改后,系统会自动重新计算相关区块的哈希值
- 同时更新后续所有区块的哈希值,保持区块链的完整性
- 修改密码后,用户可以使用新密码正常登录
### 4. **用户友好的界面**
- 清晰的菜单界面
- 详细的提示信息
- 区块链信息的可视化展示
### 5. **数据验证**
- 用户名唯一性检查
- 区块链完整性验证
- 登录信息验证
## 使用示例:
```
1. 选择"注册寝室同学",输入同学信息
2. 选择"用户登录",测试登录功能
3. 选择"修改用户信息",修改密码等信息
4. 再次选择"用户登录",使用新密码登录
5. 选择"查看区块链信息",查看区块链的完整结构
```
这个系统完全符合你的要求,实现了区块链存储、多用户注册、信息修改和正常登录等功能。