Skip to content

Commit 11c0da2

Browse files
committed
feat: can import headers from cbor files
Signed-off-by: Pascal Grange <pascal@grange.nom.fr>
1 parent f63b073 commit 11c0da2

1 file changed

Lines changed: 33 additions & 21 deletions

File tree

crates/amaru/src/bin/amaru/cmd/bootstrap.rs

Lines changed: 33 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -13,26 +13,31 @@
1313
// limitations under the License.
1414

1515
use super::{
16-
import_headers::import_headers,
1716
import_ledger_state::import_all_from_directory,
1817
import_nonces::{InitialNonces, import_nonces},
1918
};
2019
use crate::cmd::DEFAULT_NETWORK;
2120
use amaru::snapshots_dir;
22-
use amaru_kernel::{Point, default_chain_dir, default_ledger_dir, network::NetworkName};
21+
use amaru_consensus::IsHeader;
22+
use amaru_consensus::consensus::store::ChainStore;
23+
use amaru_kernel::{
24+
Header, default_chain_dir, default_ledger_dir, from_cbor, network::NetworkName,
25+
};
26+
use amaru_stores::rocksdb::consensus::RocksDBStore;
2327
use async_compression::tokio::bufread::GzipDecoder;
2428
use clap::{Parser, arg};
2529
use futures_util::TryStreamExt;
30+
use gasket::framework::WorkerError;
2631
use serde::Deserialize;
2732
use std::{
2833
error::Error,
29-
io,
34+
io::{self},
3035
path::{Path, PathBuf},
3136
};
3237
use thiserror::Error;
3338
use tokio::{
3439
fs::{self, File},
35-
io::BufReader,
40+
io::{AsyncReadExt, BufReader},
3641
};
3742
use tokio_util::io::StreamReader;
3843
use tracing::info;
@@ -116,34 +121,41 @@ pub async fn run(args: Args) -> Result<(), Box<dyn Error>> {
116121

117122
import_nonces_for_network(network, &network_dir, &chain_dir).await?;
118123

119-
import_headers_for_network(network, &args.peer_address, &network_dir, &chain_dir).await?;
124+
import_headers_for_network(network, &network_dir, &chain_dir).await?;
120125

121126
Ok(())
122127
}
123128

129+
#[allow(clippy::unwrap_used)]
124130
async fn import_headers_for_network(
125131
network: NetworkName,
126-
peer_address: &str,
127132
config_dir: &Path,
128133
chain_dir: &PathBuf,
129134
) -> Result<(), Box<dyn Error>> {
130-
let headers_file: PathBuf = config_dir.join("headers.json");
131-
let content = tokio::fs::read_to_string(headers_file).await?;
132-
let points: Vec<String> = serde_json::from_str(&content)?;
133-
let mut initial_headers = Vec::new();
134-
for point in points {
135-
match Point::try_from(point.as_str()) {
136-
Ok(point) => initial_headers.push(point),
137-
Err(e) => tracing::warn!("Ignoring malformed header point '{}': {}", point, e),
135+
let era_history = network.into();
136+
let mut db = RocksDBStore::new(chain_dir, era_history)?;
137+
138+
for entry in std::fs::read_dir(config_dir.join("headers"))? {
139+
let entry = entry?;
140+
let path = entry.path();
141+
if path.is_file()
142+
&& let Some(filename) = path.file_name().and_then(|f| f.to_str())
143+
&& filename.starts_with("chain.")
144+
&& filename.ends_with(".cbor")
145+
{
146+
let mut file = File::open(&path).await
147+
.inspect_err(|reason| tracing::error!(file = %path.display(), reason = %reason, "Failed to open header file"))
148+
.map_err(|_| WorkerError::Panic)?;
149+
let mut cbor_data = Vec::new();
150+
file.read_to_end(&mut cbor_data).await
151+
.inspect_err(|reason| tracing::error!(file = %path.display(), reason = %reason, "Failed to read header file"))
152+
.map_err(|_| WorkerError::Panic)?;
153+
let header_from_file: Header = from_cbor(&cbor_data).unwrap();
154+
let hash = header_from_file.hash();
155+
db.store_header(&hash, &header_from_file)
156+
.map_err(|_| WorkerError::Panic)?;
138157
}
139158
}
140-
for hdr in initial_headers {
141-
// FIXME: why do we only import 2 headers for each header listed in the
142-
// config file? The 2 headers make sense, but why starting from more than
143-
// one header?
144-
const NUM_HEADERS_TO_IMPORT: usize = 2;
145-
import_headers(peer_address, network, chain_dir, hdr, NUM_HEADERS_TO_IMPORT).await?;
146-
}
147159

148160
Ok(())
149161
}

0 commit comments

Comments
 (0)