fix: transfer tracking

This commit is contained in:
Ludo Galabru
2024-02-09 14:20:55 -05:00
parent 3256427632
commit 80986734c8
5 changed files with 104 additions and 109 deletions

View File

@@ -16,7 +16,7 @@ use crate::{
},
},
db::{
insert_new_inscriptions_from_block_in_locations, open_readwrite_ordhook_db_conn,
insert_entries_from_block_in_inscriptions, open_readwrite_ordhook_db_conn,
remove_entries_from_locations_at_block_height,
},
};
@@ -83,11 +83,7 @@ pub fn start_transfers_recomputing_processor(
&ctx,
);
insert_new_inscriptions_from_block_in_locations(
block,
&inscriptions_db_tx,
&ctx,
);
insert_entries_from_block_in_inscriptions(block, &inscriptions_db_tx, &ctx);
augment_block_with_ordinals_transfer_data(
block,

View File

@@ -23,7 +23,7 @@ use crate::{
db::{
find_blessed_inscription_with_ordinal_number, find_nth_classic_neg_number_at_block_height,
find_nth_classic_pos_number_at_block_height, find_nth_jubilee_number_at_block_height,
format_inscription_id, update_inscriptions_with_block, update_sequence_metadata_with_block,
format_inscription_id, update_ordinals_db_with_block, update_sequence_metadata_with_block,
TransactionBytesCursor, TraversalResult,
},
ord::height::Height,
@@ -35,10 +35,10 @@ use crate::db::find_all_inscriptions_in_block;
use super::{
inscription_parsing::get_inscriptions_revealed_in_block,
satoshi_numbering::compute_satoshi_number,
satoshi_tracking::{
augment_transaction_with_ordinals_transfers_data, compute_satpoint_post_transfer,
},
satoshi_numbering::compute_satoshi_number,
};
/// Parallelize the computation of ordinals numbers for inscriptions present in a block.
@@ -574,7 +574,7 @@ pub fn augment_block_with_ordinals_inscriptions_data_and_write_to_db_tx(
);
// Store inscriptions
update_inscriptions_with_block(block, inscriptions_db_tx, ctx);
update_ordinals_db_with_block(block, inscriptions_db_tx, ctx);
update_sequence_metadata_with_block(block, inscriptions_db_tx, ctx);
any_events
}

View File

@@ -13,7 +13,7 @@ use crate::{
core::{compute_next_satpoint_data, SatPosition},
db::{
find_inscribed_ordinals_at_wached_outpoint, format_outpoint_to_watch,
insert_transfer_in_locations_tx,
insert_ordinal_transfer_in_locations_tx, parse_satpoint_to_watch, OrdinalLocation,
},
ord::height::Height,
};
@@ -53,10 +53,19 @@ pub fn augment_block_with_ordinals_transfer_data(
if update_db_tx {
// Store transfers between each iteration
for transfer_data in transfers.into_iter() {
insert_transfer_in_locations_tx(
&transfer_data,
&block.block_identifier,
&inscriptions_db_tx,
let (tx, output_index, offset) =
parse_satpoint_to_watch(&transfer_data.satpoint_post_transfer);
let outpoint_to_watch = format_outpoint_to_watch(&tx, output_index);
let data = OrdinalLocation {
offset,
block_height: block.block_identifier.index,
tx_index: transfer_data.tx_index,
};
insert_ordinal_transfer_in_locations_tx(
transfer_data.ordinal_number,
&outpoint_to_watch,
data,
inscriptions_db_tx,
&ctx,
);
}

View File

@@ -1,5 +1,5 @@
use std::{
collections::{BTreeMap, BTreeSet},
collections::{BTreeMap, BTreeSet, HashMap},
io::{Read, Write},
path::PathBuf,
thread::sleep,
@@ -521,25 +521,14 @@ pub fn insert_entry_in_inscriptions(
}
}
pub fn insert_inscription_in_locations(
inscription_data: &OrdinalInscriptionRevealData,
block_identifier: &BlockIdentifier,
inscriptions_db_conn_rw: &Connection,
ctx: &Context,
) {
let (tx, output_index, offset) =
parse_satpoint_to_watch(&inscription_data.satpoint_post_inscription);
let outpoint_to_watch = format_outpoint_to_watch(&tx, output_index);
while let Err(e) = inscriptions_db_conn_rw.execute(
"INSERT INTO locations (ordinal_number, outpoint_to_watch, offset, block_height, tx_index) VALUES (?1, ?2, ?3, ?4, ?5)",
rusqlite::params![&inscription_data.ordinal_number, &outpoint_to_watch, offset, &block_identifier.index, &inscription_data.tx_index],
) {
ctx.try_log(|logger| warn!(logger, "unable to insert inscription in location in hord.sqlite: {} ({:?})", e.to_string(), inscription_data));
std::thread::sleep(std::time::Duration::from_secs(1));
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct OrdinalLocation {
pub offset: u64,
pub block_height: u64,
pub tx_index: usize,
}
pub fn update_inscriptions_with_block(
pub fn insert_entries_from_block_in_inscriptions(
block: &BitcoinBlockData,
inscriptions_db_conn_rw: &Connection,
ctx: &Context,
@@ -551,24 +540,75 @@ pub fn update_inscriptions_with_block(
inscriptions_db_conn_rw,
&ctx,
);
insert_inscription_in_locations(
&inscription_data,
&block.block_identifier,
&inscriptions_db_conn_rw,
ctx,
);
}
}
pub fn update_locations_with_block(
pub fn update_ordinals_db_with_block(
block: &BitcoinBlockData,
inscriptions_db_conn_rw: &Connection,
ctx: &Context,
) {
for transfer_data in get_inscriptions_transferred_in_block(&block).iter() {
insert_transfer_in_locations(
&transfer_data,
let mut locations_to_insert = HashMap::new();
for inscription_data in get_inscriptions_revealed_in_block(&block).iter() {
insert_entry_in_inscriptions(
inscription_data,
&block.block_identifier,
inscriptions_db_conn_rw,
&ctx,
);
let (tx, output_index, offset) =
parse_satpoint_to_watch(&inscription_data.satpoint_post_inscription);
let outpoint_to_watch = format_outpoint_to_watch(&tx, output_index);
let insertion_res = locations_to_insert.insert(
(inscription_data.ordinal_number, outpoint_to_watch),
OrdinalLocation {
offset,
block_height: block.block_identifier.index,
tx_index: inscription_data.tx_index,
},
);
if let Some(prev_location) = insertion_res {
ctx.try_log(|logger| {
warn!(
logger,
"Ignoring location insertion from inscriptions: {}, {:?}",
inscription_data.ordinal_number,
prev_location
)
});
}
}
for transfer_data in get_inscriptions_transferred_in_block(&block).iter() {
let (tx, output_index, offset) =
parse_satpoint_to_watch(&transfer_data.satpoint_post_transfer);
let outpoint_to_watch = format_outpoint_to_watch(&tx, output_index);
let insertion_res = locations_to_insert.insert(
(transfer_data.ordinal_number, outpoint_to_watch),
OrdinalLocation {
offset,
block_height: block.block_identifier.index,
tx_index: transfer_data.tx_index,
},
);
if let Some(prev_location) = insertion_res {
ctx.try_log(|logger| {
warn!(
logger,
"Ignoring location insertion from transfers: {}, {:?}",
transfer_data.ordinal_number,
prev_location
)
});
}
}
for ((ordinal_number, outpoint_to_watch), location_data) in locations_to_insert {
insert_ordinal_transfer_in_locations_tx(
ordinal_number,
&outpoint_to_watch,
location_data,
&inscriptions_db_conn_rw,
ctx,
);
@@ -614,52 +654,25 @@ pub fn update_sequence_metadata_with_block(
}
}
pub fn insert_new_inscriptions_from_block_in_locations(
block: &BitcoinBlockData,
pub fn insert_ordinal_transfer_in_locations_tx(
ordinal_number: u64,
outpoint_to_watch: &str,
data: OrdinalLocation,
inscriptions_db_conn_rw: &Connection,
ctx: &Context,
) {
for inscription_data in get_inscriptions_revealed_in_block(&block).iter() {
insert_inscription_in_locations(
inscription_data,
&block.block_identifier,
inscriptions_db_conn_rw,
&ctx,
);
}
}
pub fn insert_transfer_in_locations_tx(
transfer_data: &OrdinalInscriptionTransferData,
block_identifier: &BlockIdentifier,
inscriptions_db_conn_rw: &Transaction,
ctx: &Context,
) {
let (tx, output_index, offset) = parse_satpoint_to_watch(&transfer_data.satpoint_post_transfer);
let outpoint_to_watch = format_outpoint_to_watch(&tx, output_index);
let mut retry = 0;
while let Err(e) = inscriptions_db_conn_rw.execute(
"INSERT INTO locations (ordinal_number, outpoint_to_watch, offset, block_height, tx_index) VALUES (?1, ?2, ?3, ?4, ?5)",
rusqlite::params![&transfer_data.ordinal_number, &outpoint_to_watch, offset, &block_identifier.index, &transfer_data.tx_index],
rusqlite::params![&ordinal_number, &outpoint_to_watch, data.offset, data.block_height, &data.tx_index],
) {
retry += 1;
ctx.try_log(|logger| warn!(logger, "unable to query hord.sqlite: {}", e.to_string()));
std::thread::sleep(std::time::Duration::from_secs(1));
}
}
pub fn insert_transfer_in_locations(
transfer_data: &OrdinalInscriptionTransferData,
block_identifier: &BlockIdentifier,
inscriptions_db_conn_rw: &Connection,
ctx: &Context,
) {
let (tx, output_index, offset) = parse_satpoint_to_watch(&transfer_data.satpoint_post_transfer);
let outpoint_to_watch = format_outpoint_to_watch(&tx, output_index);
while let Err(e) = inscriptions_db_conn_rw.execute(
"INSERT INTO locations (ordinal_number, outpoint_to_watch, offset, block_height, tx_index) VALUES (?1, ?2, ?3, ?4, ?5)",
rusqlite::params![&transfer_data.ordinal_number, &outpoint_to_watch, offset, &block_identifier.index, &transfer_data.tx_index],
) {
ctx.try_log(|logger| warn!(logger, "unable to insert location in hord.sqlite: {} ({:?})", e.to_string(), transfer_data));
std::thread::sleep(std::time::Duration::from_secs(1));
if retry > 2 {
ctx.try_log(|logger| error!(logger, "unable to insert inscription in location in hord.sqlite: {}", e.to_string()));
return
}
}
}
@@ -1259,26 +1272,6 @@ pub fn remove_entries_from_locations_at_block_height(
}
}
pub fn insert_entry_in_locations(
inscription_id: &str,
block_height: u64,
transfer_data: &TransferData,
inscriptions_db_rw_conn: &Transaction,
ctx: &Context,
) {
let outpoint_to_watch = format_outpoint_to_watch(
&transfer_data.transaction_identifier_location,
transfer_data.output_index,
);
while let Err(e) = inscriptions_db_rw_conn.execute(
"INSERT INTO locations (inscription_id, outpoint_to_watch, offset, block_height, tx_index) VALUES (?1, ?2, ?3, ?4, ?5)",
rusqlite::params![&inscription_id, &outpoint_to_watch, &transfer_data.inscription_offset_intra_output, &block_height, &transfer_data.tx_index],
) {
ctx.try_log(|logger| warn!(logger, "unable to query hord.sqlite: {}", e.to_string()));
std::thread::sleep(std::time::Duration::from_secs(1));
}
}
pub fn delete_data_in_ordhook_db(
start_block: u64,
end_block: u64,

View File

@@ -16,14 +16,13 @@ use crate::core::protocol::inscription_sequencing::SequenceCursor;
use crate::core::{new_traversals_lazy_cache, should_sync_ordhook_db, should_sync_rocks_db};
use crate::db::{
delete_data_in_ordhook_db, insert_entry_in_blocks, open_ordhook_db_conn_rocks_db_loop,
open_readwrite_ordhook_db_conn, open_readwrite_ordhook_dbs, update_inscriptions_with_block,
update_locations_with_block, BlockBytesCursor, TransactionBytesCursor,
open_readwrite_ordhook_db_conn, open_readwrite_ordhook_dbs, update_ordinals_db_with_block,
BlockBytesCursor, TransactionBytesCursor,
};
use crate::db::{
find_last_block_inserted, find_missing_blocks, run_compaction,
update_sequence_metadata_with_block,
};
use crate::ord::chain;
use crate::scan::bitcoin::process_block_with_predicates;
use crate::service::http_api::start_predicate_api_server;
use crate::service::observers::{
@@ -34,7 +33,8 @@ use crate::service::observers::{
use crate::service::runloops::start_bitcoin_scan_runloop;
use chainhook_sdk::chainhooks::bitcoin::BitcoinChainhookOccurrencePayload;
use chainhook_sdk::chainhooks::types::{
BitcoinChainhookSpecification, ChainhookConfig, ChainhookFullSpecification, ChainhookSpecification
BitcoinChainhookSpecification, ChainhookConfig, ChainhookFullSpecification,
ChainhookSpecification,
};
use chainhook_sdk::observer::{
start_event_observer, BitcoinBlockDataCached, DataHandlerEvent, EventObserverConfig,
@@ -698,9 +698,7 @@ fn chainhook_sidecar_mutate_ordhook_db(command: HandleBlock, config: &Config, ct
);
let _ = blocks_db_rw.flush();
update_inscriptions_with_block(&block, &inscriptions_db_conn_rw, &ctx);
update_locations_with_block(&block, &inscriptions_db_conn_rw, &ctx);
update_ordinals_db_with_block(&block, &inscriptions_db_conn_rw, ctx);
update_sequence_metadata_with_block(&block, &inscriptions_db_conn_rw, &ctx);
}
@@ -811,8 +809,7 @@ pub fn chainhook_sidecar_mutate_blocks(
let _ = blocks_db_rw.flush();
if cache.processed_by_sidecar {
update_inscriptions_with_block(&cache.block, &inscriptions_db_tx, &ctx);
update_locations_with_block(&cache.block, &inscriptions_db_tx, &ctx);
update_ordinals_db_with_block(&cache.block, &inscriptions_db_tx, &ctx);
update_sequence_metadata_with_block(&cache.block, &inscriptions_db_tx, &ctx);
} else {
updated_blocks_ids.push(format!("{}", cache.block.block_identifier.index));