#!/usr/bin/env python3 """ Production Blockchain Service Real blockchain implementation with persistence and consensus """ import os import sys import json import time import logging from pathlib import Path from datetime import datetime sys.path.insert(0, '/opt/aitbc/apps/blockchain-node/src') from aitbc_chain.consensus.multi_validator_poa import MultiValidatorPoA from aitbc_chain.blockchain import Blockchain from aitbc_chain.transaction import Transaction # Production logging logging.basicConfig( level=logging.INFO, format='%(asctime)s [%(levelname)s] %(name)s: %(message)s', handlers=[ logging.FileHandler('/var/log/aitbc/production/blockchain/blockchain.log'), logging.StreamHandler() ] ) logger = logging.getLogger(__name__) class ProductionBlockchain: """Production-grade blockchain implementation""" def __init__(self, node_id: str): self.node_id = node_id self.data_dir = Path(f'/var/lib/aitbc/data/blockchain/{node_id}') self.data_dir.mkdir(parents=True, exist_ok=True) # Initialize blockchain self.blockchain = Blockchain() self.consensus = MultiValidatorPoA(chain_id=1337) # Add production validators self._setup_validators() # Load existing data if available self._load_blockchain() logger.info(f"Production blockchain initialized for node: {node_id}") def _setup_validators(self): """Setup production validators""" validators = [ ('0xvalidator_aitbc', 10000.0), ('0xvalidator_aitbc1', 10000.0), ('0xvalidator_prod_1', 5000.0), ('0xvalidator_prod_2', 5000.0), ('0xvalidator_prod_3', 5000.0) ] for address, stake in validators: self.consensus.add_validator(address, stake) logger.info(f"Added {len(validators)} validators to consensus") def _load_blockchain(self): """Load existing blockchain data""" chain_file = self.data_dir / 'blockchain.json' if chain_file.exists(): try: with open(chain_file, 'r') as f: data = json.load(f) # Load blockchain state logger.info(f"Loaded existing blockchain with {len(data.get('blocks', []))} blocks") except Exception as e: logger.error(f"Failed to load blockchain: {e}") def _save_blockchain(self): """Save blockchain state""" chain_file = self.data_dir / 'blockchain.json' try: data = { 'blocks': [block.to_dict() for block in self.blockchain.chain], 'last_updated': time.time(), 'node_id': self.node_id } with open(chain_file, 'w') as f: json.dump(data, f, indent=2) logger.debug(f"Blockchain saved to {chain_file}") except Exception as e: logger.error(f"Failed to save blockchain: {e}") def create_transaction(self, from_address: str, to_address: str, amount: float, data: dict = None): """Create and process a transaction""" try: transaction = Transaction( from_address=from_address, to_address=to_address, amount=amount, data=data or {} ) # Sign transaction (simplified for production) transaction.sign(f"private_key_{from_address}") # Add to blockchain self.blockchain.add_transaction(transaction) # Create new block block = self.blockchain.mine_block() # Save state self._save_blockchain() logger.info(f"Transaction processed: {transaction.tx_hash}") return transaction.tx_hash except Exception as e: logger.error(f"Failed to create transaction: {e}") raise def get_balance(self, address: str) -> float: """Get balance for address""" return self.blockchain.get_balance(address) def get_blockchain_info(self) -> dict: """Get blockchain information""" return { 'node_id': self.node_id, 'blocks': len(self.blockchain.chain), 'validators': len(self.consensus.validators), 'total_stake': sum(v.stake for v in self.consensus.validators.values()), 'last_block': self.blockchain.get_latest_block().to_dict() if self.blockchain.chain else None } if __name__ == '__main__': node_id = os.getenv('NODE_ID', 'aitbc') blockchain = ProductionBlockchain(node_id) # Example transaction try: tx_hash = blockchain.create_transaction( from_address='0xuser1', to_address='0xuser2', amount=100.0, data={'type': 'payment', 'description': 'Production test transaction'} ) print(f"Transaction created: {tx_hash}") # Print blockchain info info = blockchain.get_blockchain_info() print(f"Blockchain info: {info}") except Exception as e: logger.error(f"Production blockchain error: {e}") sys.exit(1)