Skip to content

Commit 7c88689

Browse files
authored
Improve SqlBlockBuilder (#142)
Signed-off-by: koushiro <koushiro.cqx@gmail.com>
1 parent ae58255 commit 7c88689

File tree

3 files changed

+30
-61
lines changed

3 files changed

+30
-61
lines changed

substrate-archive/src/actors.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ use self::workers::GetState;
4242
pub use self::workers::{BlocksIndexer, DatabaseActor, StorageAggregator};
4343
use crate::{
4444
database::{queries, Channel, Listener},
45-
sql_block_builder::BlockBuilder as SqlBlockBuilder,
45+
sql_block_builder::SqlBlockBuilder,
4646
tasks::Environment,
4747
traits::Archive,
4848
};

substrate-archive/src/actors/workers.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,8 @@ mod database;
1919
mod metadata;
2020
mod storage_aggregator;
2121

22+
pub use self::blocks::*;
2223
/// Database message to get state internal database state
2324
pub use self::database::*;
2425
pub use self::metadata::*;
25-
pub use blocks::*;
26-
pub use database::*;
27-
pub use storage_aggregator::*;
26+
pub use self::storage_aggregator::*;

substrate-archive/src/sql_block_builder.rs

Lines changed: 27 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -23,85 +23,55 @@ use std::marker::PhantomData;
2323
use codec::{Decode, Encode, Error as DecodeError};
2424
use sp_runtime::{
2525
generic::SignedBlock,
26-
traits::{Block as BlockT, DigestFor, Header as HeaderT},
26+
traits::{Block as BlockT, Header as HeaderT},
2727
};
2828

2929
use substrate_archive_common::{models::BlockModel, types};
3030

31-
struct GenericParts<B: BlockT>(
32-
<B::Header as HeaderT>::Hash,
33-
<B::Header as HeaderT>::Hash,
34-
<B::Header as HeaderT>::Hash,
35-
);
36-
37-
pub struct BlockBuilder<B: BlockT> {
31+
pub struct SqlBlockBuilder<B: BlockT> {
3832
_marker: PhantomData<B>,
3933
}
4034

41-
impl<'a, B: BlockT> BlockBuilder<B> {
35+
impl<'a, B: BlockT> SqlBlockBuilder<B> {
4236
/// With a vector of BlockModel
4337
pub fn with_vec(blocks: Vec<BlockModel>) -> Result<Vec<types::Block<B>>, DecodeError> {
4438
blocks
4539
.into_iter()
4640
.map(|b| {
47-
let (b, s) = Self::with_single(b)?;
48-
let b = SignedBlock { block: b, justification: None };
49-
Ok(types::Block::new(b, s))
41+
let (block, spec) = Self::with_single(b)?;
42+
let block = SignedBlock { block, justification: None };
43+
Ok(types::Block::new(block, spec))
5044
})
5145
.collect()
5246
}
5347

48+
/// With a single BlockModel
5449
pub fn with_single(block: BlockModel) -> Result<(B, u32), DecodeError> {
55-
let digest: DigestFor<B> = Decode::decode(&mut block.digest.as_slice())?;
56-
let GenericParts(parent_hash, state_root, extrinsics_root) = Self::generic_parts_from(
57-
block.parent_hash.as_slice(),
58-
block.state_root.as_slice(),
59-
block.extrinsics_root.as_slice(),
60-
)?;
61-
let num: <B::Header as HeaderT>::Number = Decode::decode(&mut (block.block_num as u32).encode().as_slice())?;
62-
63-
let header = <B::Header as HeaderT>::new(num, extrinsics_root, state_root, parent_hash, digest);
64-
let ext: Vec<B::Extrinsic> = Decode::decode(&mut block.ext.as_slice())?;
65-
let spec = block.spec;
66-
Ok((B::new(header, ext), spec as u32))
50+
let BlockDecoder { header, ext, spec } = BlockDecoder::<B>::decode(block)?;
51+
let block = B::new(header, ext);
52+
Ok((block, spec))
6753
}
54+
}
6855

69-
fn generic_parts_from(
70-
mut parent_hash: &[u8],
71-
mut state_root: &[u8],
72-
mut extrinsics_root: &[u8],
73-
) -> Result<GenericParts<B>, DecodeError> {
74-
Ok(GenericParts(
75-
Decode::decode(&mut parent_hash)?,
76-
Decode::decode(&mut state_root)?,
77-
Decode::decode(&mut extrinsics_root)?,
78-
))
79-
}
56+
struct BlockDecoder<B: BlockT> {
57+
header: B::Header,
58+
ext: Vec<B::Extrinsic>,
59+
spec: u32,
8060
}
81-
/* TODO: This test need to be rewritten. We shouldn't depend on test_util
82-
* or rocksdb for tests.
83-
#[cfg(test)]
84-
mod tests {
85-
use super::*;
86-
use crate::backend::test_util;
87-
use crate::queries;
88-
use polkadot_service::Block;
89-
use sp_runtime::generic::BlockId;
90-
use sqlx::PgPool;
9161

92-
pub const DB_STR: &str = "/home/insipx/.local/share/polkadot/chains/ksmcc3/db";
62+
impl<B: BlockT> BlockDecoder<B> {
63+
fn decode(block: BlockModel) -> Result<Self, DecodeError> {
64+
let block_num = Decode::decode(&mut (block.block_num as u32).encode().as_slice())?;
65+
let extrinsics_root = Decode::decode(&mut block.extrinsics_root.as_slice())?;
66+
let state_root = Decode::decode(&mut block.state_root.as_slice())?;
67+
let parent_hash = Decode::decode(&mut block.parent_hash.as_slice())?;
68+
let digest = Decode::decode(&mut block.digest.as_slice())?;
69+
let header = <B::Header as HeaderT>::new(block_num, extrinsics_root, state_root, parent_hash, digest);
70+
71+
let ext = Decode::decode(&mut block.ext.as_slice())?;
9372

94-
#[test]
95-
#[ignore]
96-
fn block_should_be_identical() {
97-
let url = std::env::var("DATABASE_URL").unwrap();
98-
let pool = futures::executor::block_on(PgPool::builder().max_size(1).build(&url)).unwrap();
99-
let backend = test_util::backend(DB_STR);
100-
let block = backend.block(&BlockId::Number(500)).unwrap();
73+
let spec = block.spec as u32;
10174

102-
let sql_block = futures::executor::block_on(queries::get_full_block(&pool, 500)).unwrap();
103-
let full_sql_block = BlockBuilder::<Block>::new().with_single(sql_block).unwrap();
104-
assert_eq!(block.block, full_sql_block);
75+
Ok(Self { header, ext, spec })
10576
}
10677
}
107-
*/

0 commit comments

Comments
 (0)