From 8d69dd6685b1d64c9de1c8c62c934e312575c7fd Mon Sep 17 00:00:00 2001 From: aitbc Date: Sat, 25 Apr 2026 19:24:02 +0200 Subject: [PATCH] fix: commit balance changes immediately after state transition and remove sender fallback for 'to' field Changed transaction failure logging from warning to error level in PoA proposer. Added immediate session.commit() after successful state transition to persist balance changes. Removed fallback to sender address for 'to' field in submit_transaction as it should be required. --- apps/blockchain-node/src/aitbc_chain/consensus/poa.py | 6 +++++- apps/blockchain-node/src/aitbc_chain/rpc/router.py | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/apps/blockchain-node/src/aitbc_chain/consensus/poa.py b/apps/blockchain-node/src/aitbc_chain/consensus/poa.py index dc8d3bda..6d9c4366 100755 --- a/apps/blockchain-node/src/aitbc_chain/consensus/poa.py +++ b/apps/blockchain-node/src/aitbc_chain/consensus/poa.py @@ -283,9 +283,13 @@ class PoAProposer: ) if not success: - self._logger.warning(f"[PROPOSE] Failed to apply transaction {tx.tx_hash}: {error_msg}") + self._logger.error(f"[PROPOSE] Failed to apply transaction {tx.tx_hash}: {error_msg}") continue + # Commit the balance changes immediately after successful state transition + session.commit() + self._logger.info(f"[PROPOSE] Committed balance changes for tx {tx.tx_hash}") + # Check if transaction already exists in database existing_tx = session.exec( select(Transaction).where( diff --git a/apps/blockchain-node/src/aitbc_chain/rpc/router.py b/apps/blockchain-node/src/aitbc_chain/rpc/router.py index 12a521ce..2d710400 100755 --- a/apps/blockchain-node/src/aitbc_chain/rpc/router.py +++ b/apps/blockchain-node/src/aitbc_chain/rpc/router.py @@ -299,7 +299,7 @@ async def submit_transaction(tx_data: TransactionRequest) -> Dict[str, Any]: # _normalize_transaction_data expects "from", not "sender" tx_data_dict = { "from": tx_data.sender, - "to": tx_data.payload.get("to", tx_data.sender), # Get to from payload or default to sender + "to": tx_data.payload.get("to"), # Get to from payload (required field) "amount": tx_data.payload.get("amount", 0), # Get amount from payload "fee": tx_data.fee, "nonce": tx_data.nonce,