mirror of
https://github.com/alexgo-io/bitcoin-indexer.git
synced 2026-01-12 22:43:06 +08:00
fix: transfer tracking
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
);
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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));
|
||||
|
||||
Reference in New Issue
Block a user