From eef496b70a3e2fa472ab42015555adc151f6b108 Mon Sep 17 00:00:00 2001 From: aitbc1 Date: Thu, 19 Mar 2026 17:17:33 +0100 Subject: [PATCH] feat(chain_sync): apply transaction state changes during block import - Import Account model for balance and nonce updates - Upsert sender and recipient accounts during transaction import - Apply balance changes (sender -= value + fee, recipient += value) - Update sender nonce based on transaction nonce or increment - Assume block validity already verified on producer node - Extract transaction data from payload for state updates --- apps/blockchain-node/src/aitbc_chain/sync.py | 40 +++++++++++++++++--- 1 file changed, 35 insertions(+), 5 deletions(-) diff --git a/apps/blockchain-node/src/aitbc_chain/sync.py b/apps/blockchain-node/src/aitbc_chain/sync.py index 24534300..d9fe31e8 100755 --- a/apps/blockchain-node/src/aitbc_chain/sync.py +++ b/apps/blockchain-node/src/aitbc_chain/sync.py @@ -14,7 +14,7 @@ from sqlmodel import Session, select from .config import settings from .logger import get_logger from .metrics import metrics_registry -from .models import Block, Transaction +from .models import Block, Transaction, Account logger = get_logger(__name__) @@ -202,15 +202,45 @@ class ChainSync: ) session.add(block) - # Import transactions if provided + # Import transactions if provided and apply state changes if transactions: for tx_data in transactions: + sender_addr = tx_data.get("sender", "") + payload = tx_data.get("payload", {}) or {} + recipient_addr = payload.get("to") or tx_data.get("recipient", "") + value = int(payload.get("value", 0) or 0) + fee = int(tx_data.get("fee", 0) or 0) + tx_hash = tx_data.get("tx_hash", "") + + # Upsert sender/recipient accounts + sender_acct = session.get(Account, (self._chain_id, sender_addr)) + if sender_acct is None: + sender_acct = Account(chain_id=self._chain_id, address=sender_addr, balance=0, nonce=0) + session.add(sender_acct) + session.flush() + + recipient_acct = session.get(Account, (self._chain_id, recipient_addr)) + if recipient_acct is None: + recipient_acct = Account(chain_id=self._chain_id, address=recipient_addr, balance=0, nonce=0) + session.add(recipient_acct) + session.flush() + + # Apply balances/nonce; assume block validity already verified on producer + total_cost = value + fee + sender_acct.balance -= total_cost + tx_nonce = tx_data.get("nonce") + if tx_nonce is not None: + sender_acct.nonce = max(sender_acct.nonce, int(tx_nonce) + 1) + else: + sender_acct.nonce += 1 + recipient_acct.balance += value + tx = Transaction( chain_id=self._chain_id, - tx_hash=tx_data.get("tx_hash", ""), + tx_hash=tx_hash, block_height=block_data["height"], - sender=tx_data.get("sender", ""), - recipient=tx_data.get("recipient", ""), + sender=sender_addr, + recipient=recipient_addr, payload=tx_data, ) session.add(tx)