From 511f3aea2711f3fcb3bad8d84ffc4cc3d648fc32 Mon Sep 17 00:00:00 2001 From: Aaron Blankstein Date: Fri, 25 Sep 2020 14:27:14 -0500 Subject: [PATCH] feat: log all transactions as they are processed for debugging --- Cargo.toml | 1 + src/chainstate/stacks/db/blocks.rs | 2 ++ src/chainstate/stacks/db/mod.rs | 32 ++++++++++++++++++++++++++++++ testnet/stacks-node/Cargo.toml | 1 + 4 files changed, 36 insertions(+) diff --git a/Cargo.toml b/Cargo.toml index f9c11938b..85a6596b6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -91,6 +91,7 @@ criterion = "0.3" developer-mode = [] default = ["developer-mode"] monitoring_prom = ["prometheus"] +tx_log = [] [target.'cfg(all(target_arch = "x86_64", not(target_env = "msvc")))'.dependencies] sha2-asm = "0.5.3" diff --git a/src/chainstate/stacks/db/blocks.rs b/src/chainstate/stacks/db/blocks.rs index ce81b6aa9..a3baaf146 100644 --- a/src/chainstate/stacks/db/blocks.rs +++ b/src/chainstate/stacks/db/blocks.rs @@ -2904,6 +2904,8 @@ impl StacksChainState { &block_execution_cost) .expect("FATAL: failed to advance chain tip"); + chainstate_tx.log_transactions_processed(&new_tip.index_block_hash(), &txs_receipts); + let epoch_receipt = StacksEpochReceipt { header: new_tip, tx_receipts: txs_receipts, diff --git a/src/chainstate/stacks/db/mod.rs b/src/chainstate/stacks/db/mod.rs index 2c7fd191b..77186ae91 100644 --- a/src/chainstate/stacks/db/mod.rs +++ b/src/chainstate/stacks/db/mod.rs @@ -372,6 +372,25 @@ impl<'a> ChainstateTx<'a> { self.headers_tx.commit()?; self.blocks_tx.commit() } + + #[cfg(feature="tx_log")] + pub fn log_transactions_processed(&self, block_id: &StacksBlockId, events: &[StacksTransactionReceipt]) { + let insert = "INSERT INTO transactions (txid, index_block_hash, tx_hex, result) VALUES (?, ?, ?, ?)"; + for tx_event in events.iter() { + let txid = tx_event.transaction.txid(); + let tx_hex = to_hex(&tx_event.transaction.serialize_to_vec()); + let result = tx_event.result.to_string(); + let params: &[&dyn ToSql] = &[&txid, block_id, &tx_hex, &result]; + if let Err(e) = self.headers_tx.tx().execute(insert, params) { + warn!("Failed to log TX: {}", e); + } + } + } + + #[cfg(not(feature="tx_log"))] + pub fn log_transactions_processed(&self, _block_id: &StacksBlockId, _events: &[StacksTransactionReceipt]) { + } + } /// Opaque structure for streaming block and microblock data from disk @@ -426,6 +445,19 @@ const STACKS_CHAIN_STATE_SQL : &'static [&'static str]= &[ PRIMARY KEY(consensus_hash,block_hash) ); "#, + #[cfg(feature = "tx_log")] + r#" + CREATE TABLE transactions( + id INTEGER PRIMARY KEY, + txid TEXT NOT NULL, + index_block_hash TEXT NOT NULL, + tx_hex TEXT NOT NULL, + result TEXT NOT NULL, + UNIQUE (txid,index_block_hash) + ); + CREATE INDEX txid_tx_index ON transactions(txid); + CREATE INDEX index_block_hash_tx_index ON transactions(index_block_hash); + "#, r#" CREATE INDEX block_headers_hash_index ON block_headers(block_hash,block_height); CREATE INDEX block_index_hash_index ON block_headers(index_block_hash,consensus_hash,block_hash); diff --git a/testnet/stacks-node/Cargo.toml b/testnet/stacks-node/Cargo.toml index 8a5d801fd..422290d8d 100644 --- a/testnet/stacks-node/Cargo.toml +++ b/testnet/stacks-node/Cargo.toml @@ -31,4 +31,5 @@ path = "src/main.rs" [features] monitoring_prom = ["stacks/monitoring_prom"] +tx-log = ["stacks/tx_log"] default = []