Skip to content

Commit 1f45ec2

Browse files
author
Ludo Galabru
committed
fix: network, cascade changes
1 parent 42d34bf commit 1f45ec2

File tree

15 files changed

+137
-58
lines changed

15 files changed

+137
-58
lines changed

Cargo.lock

+8-5
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

components/chainhook-cli/Cargo.toml

+2-2
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ redis = "0.21.5"
1515
serde-redis = "0.12.0"
1616
# tikv-client = { git = "https://github.com/tikv/client-rust.git", rev = "8f54e6114227718e256027df2577bbacdf425f86" }
1717
# raft-proto = { git = "https://github.com/tikv/raft-rs", rev="f73766712a538c2f6eb135b455297ad6c03fc58d", version = "0.7.0"}
18-
chainhook-event-observer = { version = "=1.0.4", default-features = false, path = "../chainhook-event-observer" }
19-
chainhook-types = { version = "=1.0.2", path = "../chainhook-types-rs" }
18+
chainhook-event-observer = { version = "=1.0.4", default-features = false, features = ["ordinals"], path = "../chainhook-event-observer" }
19+
chainhook-types = { version = "=1.0.3", path = "../chainhook-types-rs" }
2020
clarinet-files = "1"
2121
hiro-system-kit = "0.1.0"
2222
# clarinet-files = { path = "../../../clarinet/components/clarinet-files" }

components/chainhook-cli/src/block/ingestion.rs

-24
Original file line numberDiff line numberDiff line change
@@ -9,30 +9,6 @@ use std::{sync::mpsc::channel, thread};
99

1010
use super::DigestingCommand;
1111

12-
#[derive(Debug, Deserialize)]
13-
pub struct Record {
14-
pub id: u64,
15-
pub created_at: String,
16-
pub kind: RecordKind,
17-
pub raw_log: String,
18-
}
19-
20-
#[derive(Debug, Deserialize)]
21-
pub enum RecordKind {
22-
#[serde(rename = "/new_block")]
23-
StacksBlockReceived,
24-
#[serde(rename = "/new_microblocks")]
25-
StacksMicroblockReceived,
26-
#[serde(rename = "/new_burn_block")]
27-
BitcoinBlockReceived,
28-
#[serde(rename = "/new_mempool_tx")]
29-
TransactionAdmitted,
30-
#[serde(rename = "/drop_mempool_tx")]
31-
TransactionDropped,
32-
#[serde(rename = "/attachments/new")]
33-
AttachmentReceived,
34-
}
35-
3612
pub fn start(
3713
digestion_tx: Sender<DigestingCommand>,
3814
config: &Config,
+26-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
pub mod digestion;
2-
pub mod ingestion;
1+
// pub mod digestion;
2+
// pub mod ingestion;
33
use chainhook_types::BlockIdentifier;
44

55
#[derive(Debug, Clone, Eq, PartialEq)]
@@ -9,3 +9,27 @@ pub enum DigestingCommand {
99
Kill,
1010
Terminate,
1111
}
12+
13+
#[derive(Debug, Deserialize)]
14+
pub struct Record {
15+
pub id: u64,
16+
pub created_at: String,
17+
pub kind: RecordKind,
18+
pub raw_log: String,
19+
}
20+
21+
#[derive(Debug, Deserialize)]
22+
pub enum RecordKind {
23+
#[serde(rename = "/new_block")]
24+
StacksBlockReceived,
25+
#[serde(rename = "/new_microblocks")]
26+
StacksMicroblockReceived,
27+
#[serde(rename = "/new_burn_block")]
28+
BitcoinBlockReceived,
29+
#[serde(rename = "/new_mempool_tx")]
30+
TransactionAdmitted,
31+
#[serde(rename = "/drop_mempool_tx")]
32+
TransactionDropped,
33+
#[serde(rename = "/attachments/new")]
34+
AttachmentReceived,
35+
}

components/chainhook-cli/src/node/mod.rs

+1
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ impl Node {
9191
operators: HashSet::new(),
9292
display_logs: false,
9393
cache_path: self.config.storage.cache_path.clone(),
94+
bitcoin_network: self.config.network.bitcoin_network.clone(),
9495
};
9596
info!(
9697
self.ctx.expect_logger(),

components/chainhook-cli/src/scan/bitcoin.rs

+41-4
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,14 @@ use chainhook_event_observer::chainhooks::bitcoin::{
55
handle_bitcoin_hook_action, BitcoinChainhookOccurrence, BitcoinTriggerChainhook,
66
};
77
use chainhook_event_observer::chainhooks::types::BitcoinChainhookFullSpecification;
8-
use chainhook_event_observer::indexer;
8+
use chainhook_event_observer::indexer::ordinals::indexing::updater::OrdinalIndexUpdater;
9+
use chainhook_event_observer::indexer::ordinals::initialize_ordinal_index;
10+
use chainhook_event_observer::indexer::{self, BitcoinChainContext};
11+
use chainhook_event_observer::observer::{
12+
EventObserverConfig, DEFAULT_CONTROL_PORT, DEFAULT_INGESTION_PORT,
13+
};
914
use chainhook_event_observer::utils::{file_append, send_request, Context};
10-
use std::collections::HashMap;
15+
use std::collections::{HashMap, HashSet};
1116
use std::time::Duration;
1217

1318
pub async fn scan_bitcoin_chain_with_predicate(
@@ -133,8 +138,40 @@ pub async fn scan_bitcoin_chain_with_predicate(
133138
.result::<indexer::bitcoin::Block>()
134139
.map_err(|e| format!("unable to parse response ({})", e))?;
135140

136-
let block =
137-
indexer::bitcoin::standardize_bitcoin_block(&config.network, cursor, raw_block, ctx)?;
141+
let event_observer_config = EventObserverConfig {
142+
normalization_enabled: true,
143+
grpc_server_enabled: false,
144+
hooks_enabled: true,
145+
bitcoin_rpc_proxy_enabled: true,
146+
event_handlers: vec![],
147+
chainhook_config: None,
148+
ingestion_port: DEFAULT_INGESTION_PORT,
149+
control_port: DEFAULT_CONTROL_PORT,
150+
bitcoin_node_username: config.network.bitcoin_node_rpc_username.clone(),
151+
bitcoin_node_password: config.network.bitcoin_node_rpc_password.clone(),
152+
bitcoin_node_rpc_url: config.network.bitcoin_node_rpc_url.clone(),
153+
stacks_node_rpc_url: config.network.stacks_node_rpc_url.clone(),
154+
operators: HashSet::new(),
155+
display_logs: false,
156+
cache_path: config.storage.cache_path.clone(),
157+
bitcoin_network: config.network.bitcoin_network.clone(),
158+
};
159+
160+
let ordinal_index = initialize_ordinal_index(&event_observer_config).unwrap();
161+
match OrdinalIndexUpdater::update(&ordinal_index) {
162+
Ok(_r) => {}
163+
Err(e) => {}
164+
}
165+
166+
let mut bitcoin_context = BitcoinChainContext::new(ordinal_index);
167+
168+
let block = indexer::bitcoin::standardize_bitcoin_block(
169+
&config.network,
170+
cursor,
171+
raw_block,
172+
&mut bitcoin_context,
173+
ctx,
174+
)?;
138175

139176
let mut hits = vec![];
140177
for tx in block.transactions.iter() {

components/chainhook-cli/src/scan/stacks.rs

+26-3
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,19 @@
11
use std::{
2-
collections::{HashMap, VecDeque},
2+
collections::{HashMap, HashSet, VecDeque},
33
process,
44
};
55

66
use crate::{
77
archive,
8-
block::ingestion::{Record, RecordKind},
8+
block::{Record, RecordKind},
99
config::Config,
1010
};
1111
use chainhook_event_observer::{
1212
chainhooks::stacks::{
1313
handle_stacks_hook_action, StacksChainhookOccurrence, StacksTriggerChainhook,
1414
},
15+
indexer::ordinals::{indexing::updater::OrdinalIndexUpdater, initialize_ordinal_index},
16+
observer::{EventObserverConfig, DEFAULT_CONTROL_PORT, DEFAULT_INGESTION_PORT},
1517
utils::{file_append, send_request, AbstractStacksBlock},
1618
};
1719
use chainhook_event_observer::{
@@ -82,7 +84,28 @@ pub async fn scan_stacks_chain_with_predicate(
8284
let _ = record_tx.send(None);
8385
});
8486

85-
let mut indexer = Indexer::new(config.network.clone());
87+
let event_observer_config = EventObserverConfig {
88+
normalization_enabled: true,
89+
grpc_server_enabled: false,
90+
hooks_enabled: true,
91+
bitcoin_rpc_proxy_enabled: true,
92+
event_handlers: vec![],
93+
chainhook_config: None,
94+
ingestion_port: DEFAULT_INGESTION_PORT,
95+
control_port: DEFAULT_CONTROL_PORT,
96+
bitcoin_node_username: config.network.bitcoin_node_rpc_username.clone(),
97+
bitcoin_node_password: config.network.bitcoin_node_rpc_password.clone(),
98+
bitcoin_node_rpc_url: config.network.bitcoin_node_rpc_url.clone(),
99+
stacks_node_rpc_url: config.network.stacks_node_rpc_url.clone(),
100+
operators: HashSet::new(),
101+
display_logs: false,
102+
cache_path: config.storage.cache_path.clone(),
103+
bitcoin_network: config.network.bitcoin_network.clone(),
104+
};
105+
106+
let ordinal_index = initialize_ordinal_index(&event_observer_config).unwrap();
107+
108+
let mut indexer = Indexer::new(config.network.clone(), ordinal_index);
86109

87110
let mut canonical_fork = {
88111
let mut cursor = BlockIdentifier::default();

components/chainhook-event-observer/Cargo.toml

+3
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,9 @@ crossbeam-channel = "0.5.6"
4141
redb = { version = "0.13.0", optional = true }
4242
chrono = { version = "0.4.19", optional = true }
4343
anyhow = { version = "1.0.56", features = ["backtrace"], optional = true }
44+
futures = "0.3.21"
45+
hyper = { version = "0.14.24", features = ["http1", "client"] }
46+
hex = "0.4.3"
4447

4548
[replace]
4649
"jsonrpc:0.13.0" = { git = 'https://github.com/apoelstra/rust-jsonrpc', rev = "1063671f122a8985c1b7c29030071253da515839" }

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

+14-12
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ use rocket::serde::json::Value as JsonValue;
2727
use super::ordinals::indexing::updater::OrdinalIndexUpdater;
2828
use super::ordinals::indexing::OrdinalIndex;
2929
use super::ordinals::inscription::InscriptionParser;
30+
use super::ordinals::inscription_id::InscriptionId;
3031
use super::BitcoinChainContext;
3132

3233
#[derive(Clone, PartialEq, Debug, Deserialize, Serialize)]
@@ -115,7 +116,15 @@ pub fn standardize_bitcoin_block(
115116
let mut transactions = vec![];
116117

117118
match OrdinalIndexUpdater::update(&mut bitcoin_context.ordinal_index) {
118-
Ok(_r) => {}
119+
Ok(_) => {
120+
ctx.try_log(|logger| {
121+
slog::info!(
122+
logger,
123+
"Ordinal index updated (block count: {:?})",
124+
bitcoin_context.ordinal_index.block_count()
125+
)
126+
});
127+
}
119128
Err(e) => {
120129
ctx.try_log(|logger| slog::error!(logger, "{}", e.to_string()));
121130
}
@@ -235,22 +244,15 @@ fn try_parse_ordinal_operation(
235244
Err(_) => continue,
236245
};
237246

238-
let outpoint = bitcoin::OutPoint {
247+
let inscription_id = InscriptionId {
239248
txid: tx.txid.clone(),
240-
vout: 0,
249+
index: 0,
241250
};
242-
243251
let entries = ordinal_index.get_feed_inscriptions(3).unwrap();
244252
ctx.try_log(|logger| slog::info!(logger, "Feed: {:?}", entries));
245253

246-
let inscription_ids = ordinal_index.get_inscriptions_on_output(outpoint).unwrap();
247-
if inscription_ids.is_empty() {
248-
ctx.try_log(|logger| slog::info!(logger, "No inscriptions found in index, despite inscription detected in transaction"));
249-
return None;
250-
}
251-
252254
let inscription_entry = match ordinal_index
253-
.get_inscription_entry(inscription_ids[0])
255+
.get_inscription_entry(inscription_id.clone())
254256
{
255257
Ok(Some(entry)) => entry,
256258
_ => {
@@ -270,7 +272,7 @@ fn try_parse_ordinal_operation(
270272
.to_string(),
271273
content_bytes: format!("0x{}", to_hex(&inscription_content_bytes)),
272274
content_length: inscription_content_bytes.len(),
273-
inscription_id: "".into(),
275+
inscription_id: inscription_id.to_string(),
274276
inscription_number: inscription_entry.number,
275277
inscription_author: "".into(),
276278
inscription_fee: inscription_entry.fee,

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use bitcoincore_rpc::bitcoin::Script;
22

3-
use crate::indexer::bitcoin::ordinal::InscriptionParser;
3+
use crate::indexer::ordinals::inscription::InscriptionParser;
44

55
use super::super::tests::{helpers, process_bitcoin_blocks_and_check_expectations};
66

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

+10-3
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,16 @@ mod epoch;
55
mod height;
66
pub mod indexing;
77
pub mod inscription;
8-
mod inscription_id;
8+
pub mod inscription_id;
99
mod sat;
1010
mod sat_point;
1111

1212
use std::time::Duration;
1313

1414
type Result<T = (), E = anyhow::Error> = std::result::Result<T, E>;
1515

16+
use chainhook_types::BitcoinNetwork;
17+
1618
use crate::observer::EventObserverConfig;
1719

1820
const DIFFCHANGE_INTERVAL: u64 =
@@ -24,12 +26,17 @@ const CYCLE_EPOCHS: u64 = 6;
2426
pub fn initialize_ordinal_index(
2527
config: &EventObserverConfig,
2628
) -> Result<self::indexing::OrdinalIndex, String> {
29+
let chain = match &config.bitcoin_network {
30+
BitcoinNetwork::Mainnet => chain::Chain::Mainnet,
31+
BitcoinNetwork::Testnet => chain::Chain::Testnet,
32+
BitcoinNetwork::Regtest => chain::Chain::Regtest,
33+
};
2734
let index_options = self::indexing::Options {
2835
rpc_username: config.bitcoin_node_username.clone(),
2936
rpc_password: config.bitcoin_node_password.clone(),
3037
data_dir: config.cache_path.clone().into(),
31-
chain: chain::Chain::Mainnet,
32-
first_inscription_height: None,
38+
chain: chain,
39+
first_inscription_height: Some(chain.first_inscription_height()),
3340
height_limit: None,
3441
index: None,
3542
rpc_url: config.bitcoin_node_rpc_url.clone(),

components/chainhook-event-observer/src/main.rs

+1
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,7 @@ impl EventObserverConfig {
147147
operators,
148148
display_logs: true,
149149
cache_path: config_file.cache_path.unwrap_or("cache".into()),
150+
bitcoin_network: chainhook_types::BitcoinNetwork::Mainnet, // todo(lgalabru)
150151
};
151152
config
152153
}

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

+2-1
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@ pub struct EventObserverConfig {
126126
pub operators: HashSet<String>,
127127
pub display_logs: bool,
128128
pub cache_path: String,
129+
pub bitcoin_network: BitcoinNetwork,
129130
}
130131

131132
#[derive(Deserialize, Debug)]
@@ -227,7 +228,7 @@ pub async fn start_event_observer(
227228
ctx.try_log(|logger| {
228229
slog::info!(
229230
logger,
230-
"Initializing ordinals index in file {}",
231+
"Initializing ordinals index in dir `{}`",
231232
config.cache_path
232233
)
233234
});

components/chainhook-event-observer/src/observer/tests/mod.rs

+1
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ fn generate_test_config() -> (EventObserverConfig, ChainhookStore) {
4040
operators,
4141
display_logs: false,
4242
cache_path: "cache".into(),
43+
bitcoin_network: BitcoinNetwork::Regtest,
4344
};
4445
let mut entries = HashMap::new();
4546
entries.insert(ApiKey(None), ChainhookConfig::new());

0 commit comments

Comments
 (0)