Skip to content

Commit f8fcfca

Browse files
author
Ludo Galabru
committed
fix: patch absence of witness data
1 parent 24c3bc3 commit f8fcfca

File tree

5 files changed

+332
-108
lines changed

5 files changed

+332
-108
lines changed

components/chainhook-event-observer/src/indexer/bitcoin/mod.rs

+124-27
Original file line numberDiff line numberDiff line change
@@ -9,26 +9,29 @@ use crate::chainhooks::types::{
99
use crate::indexer::IndexerConfig;
1010
use crate::observer::BitcoinConfig;
1111
use crate::utils::Context;
12-
use bitcoincore_rpc::bitcoin::{self, Script};
12+
use bitcoincore_rpc::bitcoin::{
13+
self, Address, BlockHeader, OutPoint as OutPointS, PackedLockTime, Script, Transaction, Txid,
14+
Witness,
15+
};
1316
use bitcoincore_rpc_json::{GetRawTransactionResult, GetRawTransactionResultVout};
1417
pub use blocks_pool::BitcoinBlockPool;
1518
use chainhook_types::bitcoin::{OutPoint, TxIn, TxOut};
1619
use chainhook_types::{
1720
BitcoinBlockData, BitcoinBlockMetadata, BitcoinTransactionData, BitcoinTransactionMetadata,
1821
BlockCommitmentData, BlockIdentifier, KeyRegistrationData, LockSTXData,
19-
OrdinalInscriptionRevealData, OrdinalInscriptionRevealInscriptionData,
20-
OrdinalInscriptionRevealOrdinalData, OrdinalOperation, PobBlockCommitmentData,
21-
PoxBlockCommitmentData, PoxReward, StacksBaseChainOperation, TransactionIdentifier,
22-
TransferSTXData,
22+
OrdinalInscriptionRevealData, OrdinalOperation, PobBlockCommitmentData, PoxBlockCommitmentData,
23+
PoxReward, StacksBaseChainOperation, TransactionIdentifier, TransferSTXData,
2324
};
2425
use clarity_repl::clarity::util::hash::to_hex;
2526
use hiro_system_kit::slog;
2627
use rocket::serde::json::Value as JsonValue;
2728

28-
use super::ordinals::indexing::updater::OrdinalIndexUpdater;
29+
use super::ordinals::indexing::entry::InscriptionEntry;
30+
use super::ordinals::indexing::updater::{BlockData, OrdinalIndexUpdater};
2931
use super::ordinals::indexing::OrdinalIndex;
3032
use super::ordinals::inscription::InscriptionParser;
3133
use super::ordinals::inscription_id::InscriptionId;
34+
use super::ordinals::sat::Sat;
3235
use super::BitcoinChainContext;
3336

3437
#[derive(Clone, PartialEq, Debug, Deserialize, Serialize)]
@@ -115,25 +118,111 @@ pub fn standardize_bitcoin_block(
115118
ctx: &Context,
116119
) -> Result<BitcoinBlockData, String> {
117120
let mut transactions = vec![];
118-
ctx.try_log(|logger| slog::info!(logger, "Updating ordinal index",));
121+
ctx.try_log(|logger| slog::info!(logger, "Updating ordinal index"));
119122

120123
let ordinal_index = bitcoin_context.ordinal_index.take();
121124
let ctx_ = ctx.clone();
125+
126+
let block_data = if let Some(ref ordinal_index) = ordinal_index {
127+
if let Ok(count) = ordinal_index.block_count() {
128+
ctx.try_log(|logger| slog::info!(logger, "Blocks: {} / {}", count, block.height));
129+
if count as usize == block.height + 10 {
130+
ctx.try_log(|logger| slog::info!(logger, "Will use cached block"));
131+
132+
// let bits = hex::decode(block.bits).unwrap();
133+
// let block_data = BlockData {
134+
// header: BlockHeader {
135+
// version: block.version,
136+
// prev_blockhash: block.previousblockhash,
137+
// merkle_root: block.merkleroot,
138+
// time: block.time as u32,
139+
// bits: u32::from_be_bytes([bits[0], bits[1], bits[2], bits[3]]),
140+
// nonce: block.nonce,
141+
// },
142+
// txdata: block
143+
// .tx
144+
// .iter()
145+
// .map(|tx| {
146+
// (
147+
// Transaction {
148+
// version: tx.version as i32,
149+
// lock_time: PackedLockTime(tx.locktime),
150+
// input: tx
151+
// .vin
152+
// .iter()
153+
// .map(|i| bitcoin::TxIn {
154+
// previous_output: match (i.txid, i.vout) {
155+
// (Some(txid), Some(vout)) => {
156+
// OutPointS { txid, vout }
157+
// }
158+
// _ => OutPointS::null(),
159+
// },
160+
// script_sig: match i.script_sig {
161+
// Some(ref script_sig) => {
162+
// script_sig.script().unwrap()
163+
// }
164+
// None => Script::default(),
165+
// },
166+
// sequence: bitcoincore_rpc::bitcoin::Sequence(
167+
// i.sequence,
168+
// ),
169+
// witness: Witness::from_vec(
170+
// i.txinwitness.clone().unwrap_or(vec![]),
171+
// ),
172+
// })
173+
// .collect(),
174+
// output: tx
175+
// .vout
176+
// .iter()
177+
// .map(|o| bitcoin::TxOut {
178+
// value: o.value.to_sat(),
179+
// script_pubkey: o.script_pub_key.script().unwrap(),
180+
// })
181+
// .collect(),
182+
// },
183+
// tx.txid,
184+
// )
185+
// })
186+
// .collect::<Vec<(Transaction, Txid)>>(),
187+
// };
188+
// ctx.try_log(|logger| slog::info!(logger, "BlockData: {:?}", block_data));
189+
// Some(block_data)
190+
None
191+
} else {
192+
None
193+
}
194+
} else {
195+
None
196+
}
197+
} else {
198+
None
199+
};
200+
122201
let handle: JoinHandle<Result<_, String>> =
123202
hiro_system_kit::thread_named("Ordinal index update")
124203
.spawn(move || {
125204
if let Some(ref ordinal_index) = ordinal_index {
126205
match hiro_system_kit::nestable_block_on(OrdinalIndexUpdater::update(
127206
&ordinal_index,
207+
block_data,
208+
&ctx_,
128209
)) {
129210
Ok(_) => {
130211
ctx_.try_log(|logger| {
131-
slog::info!(logger, "Ordinal index successfully updated",)
212+
slog::info!(
213+
logger,
214+
"Ordinal index successfully updated {:?}",
215+
ordinal_index.block_count()
216+
)
132217
});
133218
}
134219
Err(e) => {
135220
ctx_.try_log(|logger| {
136-
slog::error!(logger, "Error updating ordinal index",)
221+
slog::error!(
222+
logger,
223+
"Error updating ordinal index: {}",
224+
e.to_string()
225+
)
137226
});
138227
}
139228
};
@@ -276,31 +365,39 @@ fn try_parse_ordinal_operation(
276365
Ok(Some(entry)) => entry,
277366
_ => {
278367
ctx.try_log(|logger| slog::info!(logger, "No inscriptions entry found in index, despite inscription detected in transaction"));
279-
return None;
368+
InscriptionEntry {
369+
fee: 0,
370+
height: 0,
371+
number: 0,
372+
sat: Some(Sat(0)),
373+
timestamp: 0,
374+
}
280375
}
281376
};
282377

378+
let authors = tx.vout[0]
379+
.script_pub_key
380+
.addresses
381+
.clone()
382+
.unwrap_or(vec![]);
383+
let sat = &inscription_entry.sat.unwrap();
283384
let no_content_bytes = vec![];
284385
let inscription_content_bytes = inscription.body().unwrap_or(&no_content_bytes);
386+
285387
return Some(OrdinalOperation::InscriptionRevealed(
286388
OrdinalInscriptionRevealData {
287-
inscription: OrdinalInscriptionRevealInscriptionData {
288-
content_type: inscription
289-
.content_type()
290-
.unwrap_or("unknown")
291-
.to_string(),
292-
content_bytes: format!("0x{}", to_hex(&inscription_content_bytes)),
293-
content_length: inscription_content_bytes.len(),
294-
inscription_id: inscription_id.to_string(),
295-
inscription_number: inscription_entry.number,
296-
inscription_author: "".into(),
297-
inscription_fee: inscription_entry.fee,
298-
},
299-
ordinal: Some(OrdinalInscriptionRevealOrdinalData {
300-
ordinal_number: inscription_entry.sat.unwrap().n(),
301-
ordinal_block_height: 0,
302-
ordinal_offset: 0,
303-
}),
389+
content_type: inscription.content_type().unwrap_or("unknown").to_string(),
390+
content_bytes: format!("0x{}", to_hex(&inscription_content_bytes)),
391+
content_length: inscription_content_bytes.len(),
392+
inscription_id: inscription_id.to_string(),
393+
inscription_number: inscription_entry.number,
394+
inscription_authors: authors
395+
.into_iter()
396+
.map(|a| a.to_string())
397+
.collect::<Vec<String>>(),
398+
inscription_fee: inscription_entry.fee,
399+
ordinal_number: sat.n(),
400+
ordinal_block_height: sat.height().n(),
304401
},
305402
));
306403
}

components/chainhook-event-observer/src/indexer/ordinals/indexing/mod.rs

+4-6
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,20 @@
11
use std::{collections::BTreeMap, path::PathBuf};
22

3-
use anyhow::Context;
3+
use anyhow::Context as Ctx;
44
use bitcoincore_rpc::bitcoin::{Amount, Block, BlockHash, OutPoint, Transaction, Txid};
55
use bitcoincore_rpc::RpcApi;
66
use chrono::{DateTime, TimeZone, Utc};
77

8+
use crate::utils::Context;
9+
810
use super::blocktime::Blocktime;
911
use super::chain::Chain;
1012
use super::height::Height;
1113
use super::sat_point::SatPoint;
1214
use super::{inscription_id::InscriptionId, sat::Sat};
1315
use std::cmp;
1416

15-
mod entry;
17+
pub mod entry;
1618
mod fetcher;
1719

1820
use {
@@ -370,10 +372,6 @@ impl OrdinalIndex {
370372
Ok(info)
371373
}
372374

373-
pub async fn update(&self) -> Result {
374-
OrdinalIndexUpdater::update(self).await
375-
}
376-
377375
pub fn is_reorged(&self) -> bool {
378376
self.reorged.load(atomic::Ordering::Relaxed)
379377
}

0 commit comments

Comments
 (0)