mirror of
https://github.com/th30d4y/OpenLearnX.git
synced 2026-05-26 19:26:33 +00:00
54 lines
1.9 KiB
Python
54 lines
1.9 KiB
Python
from web3 import Web3
|
|
from eth_account import Account
|
|
from datetime import datetime
|
|
import hashlib
|
|
import secrets
|
|
import os # ✅ Add this missing import
|
|
|
|
class WalletService:
|
|
def __init__(self, web3_provider_url):
|
|
self.w3 = Web3(Web3.HTTPProvider(web3_provider_url))
|
|
|
|
def verify_wallet_signature(self, wallet_address, signature, message):
|
|
"""Verify wallet signature for authentication"""
|
|
try:
|
|
# Recover the address from signature
|
|
message_hash = Web3.keccak(text=message)
|
|
recovered_address = self.w3.eth.account.recover_message_hash(message_hash, signature=signature)
|
|
|
|
return recovered_address.lower() == wallet_address.lower()
|
|
except Exception as e:
|
|
print(f"Signature verification error: {e}")
|
|
return False
|
|
|
|
def generate_auth_message(self, wallet_address, exam_code):
|
|
"""Generate message for wallet signing"""
|
|
timestamp = int(datetime.now().timestamp())
|
|
nonce = secrets.token_hex(16)
|
|
|
|
message = f"""OpenLearnX Exam Authentication
|
|
|
|
Wallet: {wallet_address}
|
|
Exam Code: {exam_code}
|
|
Timestamp: {timestamp}
|
|
Nonce: {nonce}
|
|
|
|
Sign this message to join the coding exam."""
|
|
|
|
return message, timestamp, nonce
|
|
|
|
def create_wallet_session(self, wallet_address, exam_code, signature):
|
|
"""Create authenticated wallet session"""
|
|
session_id = hashlib.sha256(f"{wallet_address}{exam_code}{datetime.now().timestamp()}".encode()).hexdigest()
|
|
|
|
return {
|
|
"session_id": session_id,
|
|
"wallet_address": wallet_address,
|
|
"exam_code": exam_code,
|
|
"authenticated_at": datetime.now(),
|
|
"signature": signature
|
|
}
|
|
|
|
# Create the service instance
|
|
wallet_service = WalletService(os.getenv('WEB3_PROVIDER_URL', 'http://127.0.0.1:8545'))
|