fix: remove double parsing of inscriptions (#421)

This commit is contained in:
Rafael Cárdenas
2025-02-13 09:01:45 -06:00
committed by GitHub
parent 216cd52c0e
commit 19c8a79cd2
2 changed files with 9 additions and 126 deletions

View File

@@ -1,8 +1,8 @@
pub mod processors;
use chainhook_sdk::observer::BitcoinConfig;
use chainhook_types::BitcoinBlockData;
use chainhook_sdk::utils::Context;
use chainhook_types::BitcoinBlockData;
use crossbeam_channel::bounded;
use std::collections::{HashMap, VecDeque};
use std::thread::{sleep, JoinHandle};
@@ -14,11 +14,10 @@ use crate::db::cursor::BlockBytesCursor;
use crate::{try_debug, try_info};
use chainhook_sdk::indexer::bitcoin::{
build_http_client, parse_downloaded_block, try_download_block_bytes_with_retry,
build_http_client, parse_downloaded_block, standardize_bitcoin_block,
try_download_block_bytes_with_retry,
};
use super::protocol::inscription_parsing::parse_inscriptions_and_standardize_block;
pub enum PostProcessorCommand {
ProcessBlocks(Vec<(u64, Vec<u8>)>, Vec<BitcoinBlockData>),
Terminate,
@@ -126,13 +125,13 @@ pub async fn bitcoind_download_blocks(
.expect("unable to compress block");
let block_height = raw_block_data.height as u64;
let block_data = if block_height >= start_sequencing_blocks_at_height {
let block_data = parse_inscriptions_and_standardize_block(
let block = standardize_bitcoin_block(
raw_block_data,
&moved_bitcoin_network,
&moved_ctx,
)
.expect("unable to deserialize block");
Some(block_data)
Some(block)
} else {
None
};

View File

@@ -1,7 +1,5 @@
use bitcoin::hash_types::Txid;
use bitcoin::Witness;
use chainhook_sdk::indexer::bitcoin::BitcoinTransactionFullBreakdown;
use chainhook_sdk::indexer::bitcoin::{standardize_bitcoin_block, BitcoinBlockFullBreakdown};
use chainhook_sdk::utils::Context;
use chainhook_types::{
BitcoinBlockData, BitcoinNetwork, BitcoinTransactionData, BlockIdentifier,
@@ -9,7 +7,7 @@ use chainhook_types::{
OrdinalInscriptionRevealData, OrdinalInscriptionTransferData, OrdinalOperation,
};
use serde_json::json;
use std::collections::{BTreeMap, HashMap};
use std::collections::HashMap;
use std::str::FromStr;
use crate::config::Config;
@@ -153,53 +151,6 @@ pub fn parse_inscriptions_from_standardized_tx(
operations
}
pub fn parse_inscriptions_in_raw_tx(
tx: &BitcoinTransactionFullBreakdown,
_ctx: &Context,
) -> Vec<OrdinalOperation> {
let mut operations = vec![];
for (input_index, input) in tx.vin.iter().enumerate() {
if let Some(ref witness_data) = input.txinwitness {
let witness_bytes: Vec<Vec<u8>> = witness_data
.iter()
.map(|w| hex::decode(w).unwrap())
.collect();
if let Some(inscriptions) =
parse_inscriptions_from_witness(input_index, witness_bytes, &tx.txid)
{
for (reveal, _inscription) in inscriptions.into_iter() {
operations.push(OrdinalOperation::InscriptionRevealed(reveal));
}
}
}
}
operations
}
pub fn parse_inscriptions_and_standardize_block(
raw_block: BitcoinBlockFullBreakdown,
network: &BitcoinNetwork,
ctx: &Context,
) -> Result<BitcoinBlockData, (String, bool)> {
let mut ordinal_operations = BTreeMap::new();
for tx in raw_block.tx.iter() {
ordinal_operations.insert(tx.txid.to_string(), parse_inscriptions_in_raw_tx(&tx, ctx));
}
let mut block = standardize_bitcoin_block(raw_block, network, ctx)?;
for tx in block.transactions.iter_mut() {
if let Some(ordinal_operations) =
ordinal_operations.remove(tx.transaction_identifier.get_hash_bytes_str())
{
tx.metadata.ordinal_operations = ordinal_operations;
}
}
Ok(block)
}
pub fn parse_inscriptions_in_standardized_block(
block: &mut BitcoinBlockData,
brc20_operation_map: &mut HashMap<String, ParsedBrc20Operation>,
@@ -250,17 +201,9 @@ pub fn get_inscriptions_transferred_in_block(
mod test {
use std::collections::HashMap;
use bitcoin::Amount;
use chainhook_sdk::{
indexer::bitcoin::{
BitcoinBlockFullBreakdown, BitcoinTransactionFullBreakdown,
BitcoinTransactionInputFullBreakdown, BitcoinTransactionInputPrevoutFullBreakdown,
GetRawTransactionResultVinScriptSig,
},
utils::Context,
};
use chainhook_sdk::utils::Context;
use chainhook_types::{
BitcoinBlockData, BitcoinNetwork, BitcoinTransactionData, OrdinalInscriptionTransferData,
BitcoinBlockData, BitcoinTransactionData, OrdinalInscriptionTransferData,
OrdinalInscriptionTransferDestination, OrdinalOperation,
};
use test_case::test_case;
@@ -272,7 +215,7 @@ mod test {
use super::{
get_inscriptions_revealed_in_block, get_inscriptions_transferred_in_block,
parse_inscriptions_and_standardize_block, parse_inscriptions_in_standardized_block,
parse_inscriptions_in_standardized_block,
};
pub fn new_test_transfer_tx_with_operation() -> BitcoinTransactionData {
@@ -297,43 +240,6 @@ mod test {
.build()
}
pub fn new_test_raw_block(
transactions: Vec<BitcoinTransactionFullBreakdown>,
) -> BitcoinBlockFullBreakdown {
BitcoinBlockFullBreakdown {
hash: "000000000000000000018ddf8a6484db391fb85c9f9ddc384f03a92729423aaf".to_string(),
height: 838964,
tx: transactions,
time: 1712982301,
nonce: 100,
previousblockhash: Some(
"000000000000000000021f8b96d34c0f223281d7d825dd3588c2858c96e689d4".to_string(),
),
confirmations: 200,
}
}
pub fn new_test_reveal_raw_tx() -> BitcoinTransactionFullBreakdown {
BitcoinTransactionFullBreakdown {
txid: "b61b0172d95e266c18aea0c624db987e971a5d6d4ebc2aaed85da4642d635735".to_string(),
vin: vec![BitcoinTransactionInputFullBreakdown {
sequence: 4294967293,
txid: Some("a321c61c83563a377f82ef59301f2527079f6bda7c2d04f9f5954c873f42e8ac".to_string()),
vout: Some(0),
script_sig: Some(GetRawTransactionResultVinScriptSig { hex: "".to_string()}),
txinwitness: Some(vec![
"6c00eb3c4d35fedd257051333b4ca81d1a25a37a9af4891f1fec2869edd56b14180eafbda8851d63138a724c9b15384bc5f0536de658bd294d426a36212e6f08".to_string(),
"209e2849b90a2353691fccedd467215c88eec89a5d0dcf468e6cf37abed344d746ac0063036f7264010118746578742f706c61696e3b636861727365743d7574662d38004c5e7b200a20202270223a20226272632d3230222c0a2020226f70223a20226465706c6f79222c0a2020227469636b223a20226f726469222c0a2020226d6178223a20223231303030303030222c0a2020226c696d223a202231303030220a7d68".to_string(),
"c19e2849b90a2353691fccedd467215c88eec89a5d0dcf468e6cf37abed344d746".to_string(),
]),
prevout: Some(
BitcoinTransactionInputPrevoutFullBreakdown { height: 779878, value: Amount::from_sat(14830) }
),
}],
vout: vec![],
}
}
#[test_case(&TestBlockBuilder::new().build() => 0; "with empty block")]
#[test_case(&TestBlockBuilder::new().transactions(vec![TestTransactionBuilder::new_with_operation().build()]).build() => 1; "with reveal transaction")]
#[test_case(&TestBlockBuilder::new().transactions(vec![new_test_transfer_tx_with_operation()]).build() => 0; "with transfer transaction")]
@@ -380,26 +286,4 @@ mod test {
assert_eq!(reveal.content_bytes, "0x7b200a20202270223a20226272632d3230222c0a2020226f70223a20226465706c6f79222c0a2020227469636b223a20226f726469222c0a2020226d6178223a20223231303030303030222c0a2020226c696d223a202231303030220a7d".to_string());
assert_eq!(reveal.content_length, 94);
}
#[test]
fn parses_inscriptions_in_raw_block() {
let raw_block = new_test_raw_block(vec![new_test_reveal_raw_tx()]);
let block = parse_inscriptions_and_standardize_block(
raw_block,
&BitcoinNetwork::Mainnet,
&Context::empty(),
)
.unwrap();
let OrdinalOperation::InscriptionRevealed(reveal) =
&block.transactions[0].metadata.ordinal_operations[0]
else {
panic!();
};
assert_eq!(
reveal.inscription_id,
"b61b0172d95e266c18aea0c624db987e971a5d6d4ebc2aaed85da4642d635735i0".to_string()
);
assert_eq!(reveal.content_bytes, "0x7b200a20202270223a20226272632d3230222c0a2020226f70223a20226465706c6f79222c0a2020227469636b223a20226f726469222c0a2020226d6178223a20223231303030303030222c0a2020226c696d223a202231303030220a7d".to_string());
assert_eq!(reveal.content_length, 94);
}
}