KEMBAR78
Sure | PDF | Computer Security | Security
0% found this document useful (0 votes)
4 views8 pages

Sure

Uploaded by

zakmahmood272
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
4 views8 pages

Sure

Uploaded by

zakmahmood272
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
You are on page 1/ 8

"""

QuantumCoin v4 — Distributed Blockchain + Wallet Integration

Includes:

- Wallet creation & encrypted storage

- Duplicate detection & missing block requests in gossiping

- Full mempool sync on peer connect

- Peer health checks & auto-reconnect

- Mining difficulty adjustment

- Transaction pool size limits & eviction

- Expanded CLI with peer listing, manual connect, and send transaction

- JSON-RPC interface for external wallets

"""

import json

import time

import hashlib

import threading

import socket

import random

import os

import getpass

from collections import deque

from pqcrypto.sign import dilithium2

# --- Wallet ---

class Wallet:

def __init__(self, sk=None, pk=None):

if sk and pk:
self.sk = sk

self.pk = pk

else:

self.pk, self.sk = dilithium2.generate_keypair()

@property

def address(self):

return hashlib.sha3_256(self.pk).hexdigest()[:56]

def sign(self, message: bytes):

return dilithium2.sign(message, self.sk)

def save(self, password, filename='wallet.json'):

data = json.dumps({

'sk': self.sk.hex(),

'pk': self.pk.hex()

})

encrypted = self._xor_encrypt(data, password)

with open(filename, 'w') as f:

json.dump({'data': encrypted}, f)

@staticmethod

def load(password, filename='wallet.json'):

with open(filename) as f:

enc = json.load(f)

decrypted = Wallet._xor_encrypt(enc['data'], password)

keys = json.loads(decrypted)

return Wallet(bytes.fromhex(keys['sk']), bytes.fromhex(keys['pk']))


@staticmethod

def _xor_encrypt(data, password):

key = hashlib.sha3_256(password.encode()).digest()

return ''.join([chr(ord(c) ^ key[i % len(key)]) for i, c in


enumerate(data)])

# --- Transaction ---

class Transaction:

def __init__(self, sender, recipient, amount, fee=0.0, signature=None,


pubkey=None, nonce=None):

self.sender = sender

self.recipient = recipient

self.amount = amount

self.fee = fee

self.signature = signature

self.pubkey = pubkey

self.nonce = nonce or int(time.time()*1e6)

def serialize(self):

return json.dumps(self.__dict__, sort_keys=True).encode()

def sign(self, wallet: Wallet):

self.pubkey = wallet.pk

self.signature = wallet.sign(self.serialize())

def verify(self):

if self.sender == 'MINING_REWARD':

return True

try:

dilithium2.verify(self.serialize(), self.signature, self.pubkey)


return True

except:

return False

# --- Block ---

class Block:

def __init__(self, index, previous_hash, transactions, nonce=0,


timestamp=None):

self.index = index

self.previous_hash = previous_hash

self.transactions = transactions

self.nonce = nonce

self.timestamp = timestamp or time.time()

def to_dict(self):

return {

'index': self.index,

'previous_hash': self.previous_hash,

'transactions': [t.__dict__ for t in self.transactions],

'nonce': self.nonce,

'timestamp': self.timestamp

def hash(self):

return hashlib.sha3_256(json.dumps(self.to_dict(),
sort_keys=True).encode()).hexdigest()

# --- Blockchain ---

class Blockchain:

def __init__(self, difficulty=4, reward=50.0, max_pool_size=1000):


self.chain = []

self.pending_transactions = deque()

self.difficulty = difficulty

self.reward = reward

self.max_pool_size = max_pool_size

self.create_genesis_block()

def create_genesis_block(self):

self.chain.append(Block(0, '0', [], nonce=0))

def add_transaction(self, tx: Transaction):

if tx.verify():

self.pending_transactions.append(tx)

if len(self.pending_transactions) > self.max_pool_size:

self.pending_transactions.popleft()

self.pending_transactions =
deque(sorted(self.pending_transactions, key=lambda t: -t.fee))

gossip({'type': 'tx', 'data': tx.__dict__})

def mine_pending(self, miner_addr):

reward_tx = Transaction('MINING_REWARD', miner_addr, self.reward)

self.pending_transactions.appendleft(reward_tx)

block = Block(len(self.chain), self.chain[-1].hash(),


list(self.pending_transactions))

self.proof_of_work(block)

self.chain.append(block)

self.pending_transactions.clear()

gossip({'type': 'block', 'data': block.to_dict()})

self.adjust_difficulty()
def proof_of_work(self, block):

target = '0' * self.difficulty

while not block.hash().startswith(target):

block.nonce += 1

def adjust_difficulty(self):

if len(self.chain) % 10 == 0 and len(self.chain) > 10:

last_10 = self.chain[-10:]

elapsed = last_10[-1].timestamp - last_10[0].timestamp

if elapsed < 50:

self.difficulty += 1

elif elapsed > 150:

self.difficulty = max(1, self.difficulty - 1)

# --- Networking / Gossip ---

PEERS = set()

BAD_PEERS = set()

BLOCK_CACHE = set()

PEER_HEALTH_INTERVAL = 30

def gossip(message):

data = json.dumps(message).encode()

for peer in random.sample(list(PEERS), min(3, len(PEERS))):

try:

host, port = peer.split(":")

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:

s.connect((host, int(port)))

s.sendall(data)

except:
BAD_PEERS.add(peer)

def peer_health_check():

while True:

for peer in list(PEERS):

try:

host, port = peer.split(":")

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:

s.settimeout(3)

s.connect((host, int(port)))

s.sendall(b'ping')

except:

BAD_PEERS.add(peer)

time.sleep(PEER_HEALTH_INTERVAL)

threading.Thread(target=peer_health_check, daemon=True).start()

# --- CLI ---

if __name__ == '__main__':

import argparse

parser = argparse.ArgumentParser(description='QuantumCoin CLI +


Wallet')

parser.add_argument('--create-wallet', action='store_true')

parser.add_argument('--load-wallet', action='store_true')

parser.add_argument('--mine', action='store_true')

parser.add_argument('--address')

args = parser.parse_args()

chain = Blockchain()
if args.create_wallet:

password = getpass.getpass('Set wallet password: ')

wallet = Wallet()

wallet.save(password)

print(f"Wallet created! Address: {wallet.address}")

elif args.load_wallet:

password = getpass.getpass('Enter wallet password: ')

wallet = Wallet.load(password)

print(f"Wallet loaded! Address: {wallet.address}")

elif args.mine and args.address:

while True:

chain.mine_pending(args.address)

print(f"Mined block {len(chain.chain)-1} for {args.address} at


difficulty {chain.difficulty}")

You might also like