consensus: add error handling for state root computation and database initialization
Some checks failed
Integration Tests / test-service-integration (push) Has been cancelled
Python Tests / test-python (push) Has been cancelled
Security Scanning / security-scan (push) Has been cancelled

- Wrap _compute_state_root in try/except to handle failures during genesis block creation
- Return None and log warning when state root computation fails (e.g., when accounts don't exist yet)
- Add error handling in init_db to ignore "already exists" errors when creating tables
- Improve robustness of database initialization for concurrent or repeated startup scenarios
This commit is contained in:
aitbc
2026-04-13 19:35:09 +02:00
parent b74dfd76e3
commit 4a7936d201
2 changed files with 27 additions and 16 deletions

View File

@@ -24,21 +24,27 @@ def _sanitize_metric_suffix(value: str) -> str:
def _compute_state_root(session: Session, chain_id: str) -> str:
"""Compute state root from current account state."""
state_manager = StateManager()
# Get all accounts for this chain
accounts = session.exec(
select(Account).where(Account.chain_id == chain_id)
).all()
# Convert to dictionary
account_dict = {acc.address: acc for acc in accounts}
# Compute state root
root = state_manager.compute_state_root(account_dict)
# Return as hex string
return '0x' + root.hex()
try:
state_manager = StateManager()
# Get all accounts for this chain
accounts = session.exec(
select(Account).where(Account.chain_id == chain_id)
).all()
# Convert to dictionary
account_dict = {acc.address: acc for acc in accounts}
# Compute state root
root = state_manager.compute_state_root(account_dict)
# Return as hex string
return '0x' + root.hex()
except Exception as e:
# If state root computation fails, return None for now
# This can happen during genesis block creation when accounts don't exist yet
logger.warning(f"Failed to compute state root: {e}")
return None

View File

@@ -80,7 +80,12 @@ _engine_internal = _engine
def init_db() -> None:
"""Initialize database with file-based encryption"""
settings.db_path.parent.mkdir(parents=True, exist_ok=True)
SQLModel.metadata.create_all(_engine)
try:
SQLModel.metadata.create_all(_engine)
except Exception as e:
# If tables already exist, that's okay
if "already exists" not in str(e):
raise
# Set restrictive file permissions on database file
if settings.db_path.exists():
os.chmod(settings.db_path, stat.S_IRUSR | stat.S_IWUSR) # Read/write for owner only