Skip to content

Commit 5210273

Browse files
authored
Merge pull request #359 from input-output-hk/sg/preview-sanchonet-fixes
Sg/preview sanchonet fixes
2 parents 9886932 + ddfe48b commit 5210273

File tree

6 files changed

+98
-36
lines changed

6 files changed

+98
-36
lines changed

modules/parameters_state/build.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,17 @@ fn main() {
6565
download(main, "alonzo", "mainnet-alonzo-genesis.json", &vec![]);
6666
download(main, "conway", "mainnet-conway-genesis.json", &vec![]);
6767

68+
let preview = "https://book.world.dev.cardano.org/environments/preview";
69+
download(preview, "byron", "preview-byron-genesis.json", &vec![]);
70+
download(
71+
preview,
72+
"shelley",
73+
"preview-shelley-genesis.json",
74+
&shelley_fix,
75+
);
76+
download(preview, "alonzo", "preview-alonzo-genesis.json", &vec![]);
77+
download(preview, "conway", "preview-conway-genesis.json", &vec![]);
78+
6879
let sancho =
6980
"https://raw.githubusercontent.com/Hornan7/SanchoNet-Tutorials/refs/heads/main/genesis";
7081
download(sancho, "byron", "sanchonet-byron-genesis.json", &vec![]);

modules/parameters_state/src/genesis_params.rs

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ use pallas::ledger::configs::*;
1212
use serde::Deserialize;
1313
use std::collections::HashMap;
1414

15-
const PREDEFINED_GENESIS: [(&str, Era, &[u8]); 8] = [
15+
const PREDEFINED_GENESIS: [(&str, Era, &[u8]); 12] = [
1616
(
1717
"sanchonet",
1818
Era::Byron,
@@ -33,6 +33,26 @@ const PREDEFINED_GENESIS: [(&str, Era, &[u8]); 8] = [
3333
Era::Conway,
3434
include_bytes!("../downloads/sanchonet-conway-genesis.json"),
3535
),
36+
(
37+
"preview",
38+
Era::Byron,
39+
include_bytes!("../downloads/preview-byron-genesis.json"),
40+
),
41+
(
42+
"preview",
43+
Era::Shelley,
44+
include_bytes!("../downloads/preview-shelley-genesis.json"),
45+
),
46+
(
47+
"preview",
48+
Era::Alonzo,
49+
include_bytes!("../downloads/preview-alonzo-genesis.json"),
50+
),
51+
(
52+
"preview",
53+
Era::Conway,
54+
include_bytes!("../downloads/preview-conway-genesis.json"),
55+
),
3656
(
3757
"mainnet",
3858
Era::Byron,

modules/peer_network_interface/src/peer_network_interface.rs

Lines changed: 45 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -43,23 +43,27 @@ impl PeerNetworkInterface {
4343
SyncPoint::Snapshot => Some(context.subscribe(&cfg.snapshot_completion_topic).await?),
4444
_ => None,
4545
};
46-
let (events_sender, events) = mpsc::channel(1024);
4746

4847
context.clone().run(async move {
4948
let genesis_values = if let Some(mut sub) = genesis_complete {
5049
Self::wait_genesis_completion(&mut sub)
5150
.await
5251
.expect("could not fetch genesis values")
5352
} else {
54-
cfg.genesis_values.expect("genesis values not found")
53+
cfg.genesis_values.clone().expect("genesis values not found")
5554
};
5655

5756
let mut upstream_cache = None;
57+
let mut last_epoch = None;
5858
let mut cache_sync_point = Point::Origin;
5959
if cfg.sync_point == SyncPoint::Cache {
6060
match Self::init_cache(&cfg.cache_dir, &cfg.block_topic, &context).await {
6161
Ok((cache, sync_point)) => {
6262
upstream_cache = Some(cache);
63+
if let Point::Specific(slot, _) = sync_point {
64+
let (epoch, _) = genesis_values.slot_to_epoch(slot);
65+
last_epoch = Some(epoch);
66+
}
6367
cache_sync_point = sync_point;
6468
}
6569
Err(e) => {
@@ -68,39 +72,53 @@ impl PeerNetworkInterface {
6872
}
6973
}
7074

71-
let sink = BlockSink {
75+
let mut sink = BlockSink {
7276
context,
73-
topic: cfg.block_topic,
77+
topic: cfg.block_topic.clone(),
7478
genesis_values,
7579
upstream_cache,
80+
last_epoch,
7681
};
7782

78-
let mut manager = NetworkManager::new(cfg.magic_number, events, events_sender, sink);
79-
for address in cfg.node_addresses {
80-
manager.handle_new_connection(address, Duration::ZERO);
81-
}
82-
83-
match cfg.sync_point {
84-
SyncPoint::Origin => manager.sync_to_point(Point::Origin),
83+
let manager = match cfg.sync_point {
84+
SyncPoint::Origin => {
85+
let mut manager = Self::init_manager(cfg, sink);
86+
manager.sync_to_point(Point::Origin);
87+
manager
88+
}
8589
SyncPoint::Tip => {
90+
let mut manager = Self::init_manager(cfg, sink);
8691
if let Err(error) = manager.sync_to_tip().await {
8792
warn!("could not sync to tip: {error:#}");
8893
return;
8994
}
95+
manager
96+
}
97+
SyncPoint::Cache => {
98+
let mut manager = Self::init_manager(cfg, sink);
99+
manager.sync_to_point(cache_sync_point);
100+
manager
90101
}
91-
SyncPoint::Cache => manager.sync_to_point(cache_sync_point),
92102
SyncPoint::Snapshot => {
93103
let mut subscription =
94104
snapshot_complete.expect("Snapshot topic subscription missing");
95105
match Self::wait_snapshot_completion(&mut subscription).await {
96-
Ok(point) => manager.sync_to_point(point),
106+
Ok(point) => {
107+
if let Point::Specific(slot, _) = point {
108+
let (epoch, _) = sink.genesis_values.slot_to_epoch(slot);
109+
sink.last_epoch = Some(epoch);
110+
}
111+
let mut manager = Self::init_manager(cfg, sink);
112+
manager.sync_to_point(point);
113+
manager
114+
}
97115
Err(error) => {
98116
warn!("snapshot restoration never completed: {error:#}");
99117
return;
100118
}
101119
}
102120
}
103-
}
121+
};
104122

105123
if let Err(err) = manager.run().await {
106124
error!("chain sync failed: {err:#}");
@@ -110,6 +128,15 @@ impl PeerNetworkInterface {
110128
Ok(())
111129
}
112130

131+
fn init_manager(cfg: InterfaceConfig, sink: BlockSink) -> NetworkManager {
132+
let (events_sender, events) = mpsc::channel(1024);
133+
let mut manager = NetworkManager::new(cfg.magic_number, events, events_sender, sink);
134+
for address in cfg.node_addresses {
135+
manager.handle_new_connection(address, Duration::ZERO);
136+
}
137+
manager
138+
}
139+
113140
async fn init_cache(
114141
cache_dir: &Path,
115142
block_topic: &str,
@@ -163,6 +190,7 @@ struct BlockSink {
163190
topic: String,
164191
genesis_values: GenesisValues,
165192
upstream_cache: Option<UpstreamCache>,
193+
last_epoch: Option<u64>,
166194
}
167195
impl BlockSink {
168196
pub async fn announce(
@@ -190,10 +218,11 @@ impl BlockSink {
190218
self.context.publish(&self.topic, message).await
191219
}
192220

193-
fn make_block_info(&self, header: &Header, rolled_back: bool) -> BlockInfo {
221+
fn make_block_info(&mut self, header: &Header, rolled_back: bool) -> BlockInfo {
194222
let slot = header.slot;
195223
let (epoch, epoch_slot) = self.genesis_values.slot_to_epoch(slot);
196-
let new_epoch = slot == self.genesis_values.epoch_to_first_slot(epoch);
224+
let new_epoch = self.last_epoch != Some(epoch);
225+
self.last_epoch = Some(epoch);
197226
let timestamp = self.genesis_values.slot_to_timestamp(slot);
198227
BlockInfo {
199228
status: if rolled_back {

modules/utxo_state/src/volatile_index.rs

Lines changed: 17 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use tracing::error;
66

77
pub struct VolatileIndex {
88
/// First block number represented in the index VecDeque
9-
first_block: u64,
9+
first_block: Option<u64>,
1010

1111
/// List of UTXOs for each block number
1212
blocks: VecDeque<Vec<UTxOIdentifier>>,
@@ -16,7 +16,7 @@ impl VolatileIndex {
1616
/// Create a new empty index
1717
pub fn new() -> Self {
1818
Self {
19-
first_block: 0,
19+
first_block: None,
2020
blocks: VecDeque::new(),
2121
}
2222
}
@@ -29,11 +29,9 @@ impl VolatileIndex {
2929
/// Add a new block entry
3030
pub fn add_block(&mut self, number: u64) {
3131
// Capture the first volatile block we get
32-
if self.first_block == 0 {
33-
self.first_block = number;
34-
}
32+
let first_block = *self.first_block.get_or_insert(number);
3533

36-
if number == self.first_block + self.blocks.len() as u64 {
34+
if number == first_block + self.blocks.len() as u64 {
3735
// Add empty UTXO set
3836
self.blocks.push_back(Vec::new());
3937
} else {
@@ -54,7 +52,7 @@ impl VolatileIndex {
5452
let mut utxos = Vec::<UTxOIdentifier>::new();
5553

5654
// Remove blocks before boundary, calling back for all UTXOs in them
57-
while self.first_block < boundary {
55+
while let Some(first_block) = self.first_block.as_mut().filter(|b| **b < boundary) {
5856
if let Some(block) = self.blocks.pop_front() {
5957
for utxo in block {
6058
utxos.push(utxo);
@@ -63,7 +61,7 @@ impl VolatileIndex {
6361
break;
6462
}
6563

66-
self.first_block += 1;
64+
*first_block += 1;
6765
}
6866

6967
utxos
@@ -74,10 +72,10 @@ impl VolatileIndex {
7472
pub fn prune_on_or_after(&mut self, boundary: u64) -> Vec<UTxOIdentifier> {
7573
let mut utxos = Vec::<UTxOIdentifier>::new();
7674

77-
if self.first_block == 0 {
75+
let Some(first_block) = self.first_block else {
7876
return utxos;
79-
}
80-
let mut last_block = self.first_block + self.blocks.len() as u64 - 1;
77+
};
78+
let mut last_block = first_block + self.blocks.len() as u64 - 1;
8179

8280
// Remove blocks before boundary, calling back for all UTXOs in them
8381
while last_block >= boundary {
@@ -104,20 +102,20 @@ mod tests {
104102
#[test]
105103
fn new_index_is_empty() {
106104
let index = VolatileIndex::new();
107-
assert_eq!(0, index.first_block);
105+
assert_eq!(None, index.first_block);
108106
assert_eq!(0, index.blocks.len());
109107
}
110108

111109
#[test]
112110
fn add_block_sequential_captures_number_and_adds_block() {
113111
let mut index = VolatileIndex::new();
114112
index.add_block(42);
115-
assert_eq!(42, index.first_block);
113+
assert_eq!(Some(42), index.first_block);
116114
assert_eq!(1, index.blocks.len());
117115
assert!(index.blocks[0].is_empty());
118116

119117
index.add_block(43);
120-
assert_eq!(42, index.first_block);
118+
assert_eq!(Some(42), index.first_block);
121119
assert_eq!(2, index.blocks.len());
122120
assert!(index.blocks[1].is_empty());
123121
}
@@ -126,11 +124,11 @@ mod tests {
126124
fn add_block_non_sequential_ignores_it() {
127125
let mut index = VolatileIndex::new();
128126
index.add_block(42);
129-
assert_eq!(42, index.first_block);
127+
assert_eq!(Some(42), index.first_block);
130128
assert_eq!(1, index.blocks.len());
131129

132130
index.add_block(99);
133-
assert_eq!(42, index.first_block);
131+
assert_eq!(Some(42), index.first_block);
134132
assert_eq!(1, index.blocks.len());
135133
}
136134

@@ -139,7 +137,7 @@ mod tests {
139137
let mut index = VolatileIndex::new();
140138
index.add_block(1);
141139
index.add_block(2);
142-
assert_eq!(1, index.first_block);
140+
assert_eq!(Some(1), index.first_block);
143141
assert_eq!(2, index.blocks.len());
144142

145143
let utxo = UTxOIdentifier::new(42, 42, 42);
@@ -160,7 +158,7 @@ mod tests {
160158
index.add_utxo(&UTxOIdentifier::new(3, 3, 3));
161159

162160
let pruned = index.prune_before(2);
163-
assert_eq!(2, index.first_block);
161+
assert_eq!(Some(2), index.first_block);
164162
assert_eq!(1, index.blocks.len());
165163
assert_eq!(2, pruned.len());
166164
assert_eq!(1, pruned[0].output_index());
@@ -176,7 +174,7 @@ mod tests {
176174
index.add_block(2);
177175
index.add_utxo(&UTxOIdentifier::new(3, 3, 3));
178176
let pruned = index.prune_on_or_after(1);
179-
assert_eq!(1, index.first_block);
177+
assert_eq!(Some(1), index.first_block);
180178
assert_eq!(0, index.blocks.len());
181179
assert_eq!(3, pruned.len());
182180

processes/omnibus/omnibus-local.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ publish-certificates-topic = "cardano.certificates"
2828
publish-governance-topic = "cardano.governance"
2929
publish-block-txs-topic = "cardano.block.txs"
3030

31+
[module.consensus]
32+
3133
[module.utxo-state]
3234
store = "memory" # "memory", "dashmap", "fjall", "fjall-async", "sled", "sled-async", "fake"
3335
address-delta-topic = "cardano.address.delta"

processes/omnibus/omnibus-sancho.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ publish-certificates-topic = "cardano.certificates"
2525
publish-governance-topic = "cardano.governance"
2626
publish-block-txs-topic = "cardano.block.txs"
2727

28+
[module.consensus]
29+
2830
[module.utxo-state]
2931
store = "memory" # "memory", "dashmap", "fjall", "fjall-async", "sled", "sled-async", "fake"
3032
address-delta-topic = "cardano.address.delta"

0 commit comments

Comments
 (0)