Skip to content

Commit fd6c7c1

Browse files
authored
Feat: header metadata (#154)
* feat: decompressing + downloading file * feat: add file download * feat: update block data provider interface * feat: add migration info * fix: migration * feat: refactor code * feat: remove migration data * fix: disappearing progress bar * fix: doc * feat: use FuturesUnordered for a better view of progress * feat: implement ScrollMigrator on NamedChain * feat: insert data in sqlite by batch * fix: lint
1 parent 7c764ff commit fd6c7c1

File tree

17 files changed

+618
-1399
lines changed

17 files changed

+618
-1399
lines changed

Cargo.lock

Lines changed: 191 additions & 292 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/database/db/src/db.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,12 +134,13 @@ mod test {
134134
}
135135

136136
#[tokio::test]
137+
#[ignore]
137138
async fn test_database_block_data_seed() {
138139
// Setup the test database.
139140
let db = setup_test_db().await;
140141

141142
// db should contain the seeded data after migration.
142-
let data = db.get_l2_block_data_hint(0.into()).await.unwrap();
143+
let data = db.get_l2_block_data_hint(0).await.unwrap();
143144
assert!(data.is_some());
144145
}
145146

crates/database/db/src/models/block_data.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ use sea_orm::entity::prelude::*;
88
pub struct Model {
99
#[sea_orm(primary_key)]
1010
number: i64,
11-
hash: Vec<u8>,
1211
extra_data: Vec<u8>,
12+
state_root: Vec<u8>,
1313
difficulty: Vec<u8>,
1414
}
1515

crates/database/db/src/operations.rs

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
use super::{models, DatabaseError};
22
use crate::DatabaseConnectionProvider;
3-
use alloy_eips::{BlockId, BlockNumberOrTag};
43
use alloy_primitives::B256;
54
use futures::{Stream, StreamExt};
65
use rollup_node_primitives::{
@@ -180,20 +179,13 @@ pub trait DatabaseOperations: DatabaseConnectionProvider {
180179
.map(|res| Ok(res.map(Into::into)?)))
181180
}
182181

183-
/// Get the extra data for the provided [`BlockId`].
182+
/// Get the extra data for the provided block number.
184183
async fn get_l2_block_data_hint(
185184
&self,
186-
block_id: BlockId,
185+
block_number: u64,
187186
) -> Result<Option<BlockDataHint>, DatabaseError> {
188-
let filter = match block_id {
189-
BlockId::Hash(hash) => models::block_data::Column::Hash.eq(hash.block_hash.to_vec()),
190-
BlockId::Number(BlockNumberOrTag::Number(number)) => {
191-
models::block_data::Column::Number.eq(number as i64)
192-
}
193-
x => return Err(DatabaseError::BlockNotFound(x)),
194-
};
195187
Ok(models::block_data::Entity::find()
196-
.filter(filter)
188+
.filter(models::block_data::Column::Number.eq(block_number as i64))
197189
.one(self.get_connection())
198190
.await
199191
.map(|x| x.map(Into::into))?)

crates/database/db/src/test_utils.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,6 @@ use scroll_migration::{Migrator, MigratorTrait};
88
pub async fn setup_test_db() -> Database {
99
let database_url = "sqlite::memory:";
1010
let connection = sea_orm::Database::connect(database_url).await.unwrap();
11-
Migrator::up(&connection, None).await.unwrap();
11+
Migrator::<()>::up(&connection, None).await.unwrap();
1212
connection.into()
1313
}

crates/database/migration/Cargo.toml

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,15 @@ publish = false
66

77
[dependencies]
88
alloy-primitives = { workspace = true, features = ["serde"] }
9-
async-std = { version = "1", features = ["attributes", "tokio1"] }
10-
csv = "1.3.1"
9+
eyre.workspace = true
10+
futures.workspace = true
11+
indicatif = "0.17.11"
12+
reqwest.workspace = true
13+
reqwest-retry = "0.7.0"
14+
reqwest-middleware = "0.4.2"
15+
reth-chainspec.workspace = true
1116
sea-orm = { workspace = true, features = ["sqlx-sqlite", "runtime-tokio-native-tls", "macros"] }
12-
serde = { workspace = true, features = ["derive"] }
17+
sha2 = "0.10.9"
1318
tracing.workspace = true
1419

1520
[dependencies.sea-orm-migration]

crates/database/migration/migration-data/block_data.csv

Lines changed: 0 additions & 1002 deletions
This file was deleted.

crates/database/migration/src/lib.rs

Lines changed: 39 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,54 @@ pub use sea_orm_migration::prelude::*;
22

33
mod m20220101_000001_create_batch_commit_table;
44
mod m20250304_125946_add_l1_msg_table;
5-
mod m20250408_132123_add_block_data_table;
6-
mod m20250408_150338_seed_block_data_table;
5+
mod m20250408_132123_add_header_metadata;
6+
mod m20250408_150338_load_header_metadata;
77
mod m20250411_072004_add_l2_block;
8+
mod migration_info;
9+
pub use migration_info::{MigrationInfo, ScrollMainnetMigrationInfo, ScrollSepoliaMigrationInfo};
810

9-
pub struct Migrator;
11+
pub struct Migrator<MI>(pub std::marker::PhantomData<MI>);
1012

1113
#[async_trait::async_trait]
12-
impl MigratorTrait for Migrator {
14+
impl<MI: MigrationInfo + Send + Sync + 'static> MigratorTrait for Migrator<MI> {
1315
fn migrations() -> Vec<Box<dyn MigrationTrait>> {
1416
vec![
1517
Box::new(m20220101_000001_create_batch_commit_table::Migration),
1618
Box::new(m20250304_125946_add_l1_msg_table::Migration),
17-
Box::new(m20250408_132123_add_block_data_table::Migration),
18-
Box::new(m20250408_150338_seed_block_data_table::Migration),
19+
Box::new(m20250408_132123_add_header_metadata::Migration),
20+
Box::new(m20250408_150338_load_header_metadata::Migration::<MI>(Default::default())),
1921
Box::new(m20250411_072004_add_l2_block::Migration),
2022
]
2123
}
2224
}
25+
26+
pub mod traits {
27+
use crate::{ScrollMainnetMigrationInfo, ScrollSepoliaMigrationInfo};
28+
use reth_chainspec::NamedChain;
29+
use sea_orm::{prelude::async_trait::async_trait, DatabaseConnection, DbErr};
30+
use sea_orm_migration::MigratorTrait;
31+
32+
/// An instance of the trait can perform the migration for Scroll.
33+
#[async_trait]
34+
pub trait ScrollMigrator {
35+
/// Migrates the tables.
36+
async fn migrate(&self, conn: &DatabaseConnection) -> Result<(), DbErr>;
37+
}
38+
39+
#[async_trait]
40+
impl ScrollMigrator for NamedChain {
41+
async fn migrate(&self, conn: &DatabaseConnection) -> Result<(), DbErr> {
42+
match self {
43+
NamedChain::Scroll => {
44+
Ok(super::Migrator::<ScrollMainnetMigrationInfo>::up(conn, None))
45+
}
46+
NamedChain::ScrollSepolia => {
47+
Ok(super::Migrator::<ScrollSepoliaMigrationInfo>::up(conn, None))
48+
}
49+
NamedChain::Dev => Ok(super::Migrator::<()>::up(conn, None)),
50+
_ => Err(DbErr::Custom("expected Scroll Mainnet, Sepolia or Dev".into())),
51+
}?
52+
.await
53+
}
54+
}
55+
}

crates/database/migration/src/m20250408_132123_add_block_data_table.rs renamed to crates/database/migration/src/m20250408_132123_add_header_metadata.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ impl MigrationTrait for Migration {
1313
.table(BlockData::Table)
1414
.if_not_exists()
1515
.col(big_unsigned(BlockData::Number).primary_key())
16-
.col(binary_len(BlockData::Hash, 32).unique_key())
1716
.col(binary(BlockData::ExtraData))
17+
.col(binary_len(BlockData::StateRoot, 32))
1818
.col(binary_len(BlockData::Difficulty, 32))
1919
.to_owned(),
2020
)
@@ -30,7 +30,7 @@ impl MigrationTrait for Migration {
3030
enum BlockData {
3131
Table,
3232
Number,
33-
Hash,
3433
ExtraData,
34+
StateRoot,
3535
Difficulty,
3636
}

0 commit comments

Comments
 (0)