From 59202e7e0cfbb391d6f07d2d9f19f2ad59c59ca6 Mon Sep 17 00:00:00 2001 From: aitbc Date: Tue, 24 Mar 2026 10:10:33 +0100 Subject: [PATCH] Commit pending blockchain changes: poa.py mempool logging, main.py service fixes, router.py RPC improvements --- .../src/aitbc_chain/consensus/poa.py | 5 ++++- apps/blockchain-node/src/aitbc_chain/main.py | 2 +- .../src/aitbc_chain/rpc/router.py | 17 +++++++++++++++++ 3 files changed, 22 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 b4b7cc50..14ad42a0 100755 --- a/apps/blockchain-node/src/aitbc_chain/consensus/poa.py +++ b/apps/blockchain-node/src/aitbc_chain/consensus/poa.py @@ -185,6 +185,7 @@ class PoAProposer: tx_hash=tx.tx_hash, sender=sender, recipient=recipient, + payload=tx_data, value=value, fee=fee, nonce=sender_account.nonce - 1, @@ -237,6 +238,7 @@ class PoAProposer: ) # Broadcast the new block + tx_list = [tx.content for tx in processed_txs] if processed_txs else [] await gossip_broker.publish( "blocks", { @@ -248,7 +250,8 @@ class PoAProposer: "timestamp": block.timestamp.isoformat(), "tx_count": block.tx_count, "state_root": block.state_root, - } + "transactions": tx_list, + }, ) async def _ensure_genesis_block(self) -> None: diff --git a/apps/blockchain-node/src/aitbc_chain/main.py b/apps/blockchain-node/src/aitbc_chain/main.py index a7fd7c2c..c415b31e 100755 --- a/apps/blockchain-node/src/aitbc_chain/main.py +++ b/apps/blockchain-node/src/aitbc_chain/main.py @@ -124,7 +124,7 @@ class BlockchainNode: chain_id = block_data.get("chain_id", settings.chain_id) logger.info(f"Importing block for chain {chain_id}: {block_data.get('height')}") sync = ChainSync(session_factory=session_scope, chain_id=chain_id) - res = sync.import_block(block_data) + res = sync.import_block(block_data, transactions=block_data.get("transactions")) logger.info(f"Import result: accepted={res.accepted}, reason={res.reason}") except Exception as exc: logger.error(f"Error processing block from gossip: {exc}") diff --git a/apps/blockchain-node/src/aitbc_chain/rpc/router.py b/apps/blockchain-node/src/aitbc_chain/rpc/router.py index 9230d8c6..b87220c5 100755 --- a/apps/blockchain-node/src/aitbc_chain/rpc/router.py +++ b/apps/blockchain-node/src/aitbc_chain/rpc/router.py @@ -105,6 +105,14 @@ async def get_block(height: int) -> Dict[str, Any]: metrics_registry.increment("rpc_get_block_not_found_total") raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="block not found") metrics_registry.increment("rpc_get_block_success_total") + + txs = session.exec(select(Transaction).where(Transaction.block_height == height)).all() + tx_list = [] + for tx in txs: + t = dict(tx.payload) if tx.payload else {} + t["tx_hash"] = tx.tx_hash + tx_list.append(t) + metrics_registry.observe("rpc_get_block_duration_seconds", time.perf_counter() - start) return { "height": block.height, @@ -114,6 +122,7 @@ async def get_block(height: int) -> Dict[str, Any]: "timestamp": block.timestamp.isoformat(), "tx_count": block.tx_count, "state_root": block.state_root, + "transactions": tx_list, } @@ -151,6 +160,13 @@ async def get_blocks_range(start: int, end: int) -> Dict[str, Any]: # Serialize blocks block_list = [] for block in blocks: + txs = session.exec(select(Transaction).where(Transaction.block_height == block.height)).all() + tx_list = [] + for tx in txs: + t = dict(tx.payload) if tx.payload else {} + t["tx_hash"] = tx.tx_hash + tx_list.append(t) + block_list.append({ "height": block.height, "hash": block.hash, @@ -159,6 +175,7 @@ async def get_blocks_range(start: int, end: int) -> Dict[str, Any]: "timestamp": block.timestamp.isoformat(), "tx_count": block.tx_count, "state_root": block.state_root, + "transactions": tx_list, }) metrics_registry.increment("rpc_get_blocks_range_success_total")