feat(storage): make insert_block() operate with references (#20504)

Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
This commit is contained in:
fig
2025-12-22 15:13:43 +00:00
committed by GitHub
parent ed7a5696b7
commit 96c77fd8b2
19 changed files with 98 additions and 81 deletions

View File

@@ -79,7 +79,7 @@ where
+ StaticFileProviderFactory<Primitives: NodePrimitives<BlockHeader: Compact>>,
{
provider_rw.insert_block(
SealedBlock::<<Provider::Primitives as NodePrimitives>::Block>::from_sealed_parts(
&SealedBlock::<<Provider::Primitives as NodePrimitives>::Block>::from_sealed_parts(
header.clone(),
Default::default(),
)

View File

@@ -309,7 +309,7 @@ where
writer.append_header(&header, &hash)?;
// Write bodies to database.
provider.append_block_bodies(vec![(header.number(), Some(body))])?;
provider.append_block_bodies(vec![(header.number(), Some(&body))])?;
hash_collector.insert(hash, number)?;
}

View File

@@ -1303,7 +1303,7 @@ mod tests {
.try_recover()
.unwrap();
let provider_rw = provider_factory.database_provider_rw().unwrap();
provider_rw.insert_block(block.clone()).unwrap();
provider_rw.insert_block(&block).unwrap();
provider_rw.commit().unwrap();
let provider = BlockchainProvider::new(provider_factory).unwrap();

View File

@@ -481,12 +481,12 @@ mod tests {
&mut rng,
genesis_block.number + 1,
BlockParams { parent: Some(genesis_hash), tx_count: Some(0), ..Default::default() },
);
let provider_rw = provider_factory.provider_rw()?;
provider_rw.insert_block(node_head_block.clone().try_recover()?)?;
provider_rw.commit()?;
)
.try_recover()?;
let node_head = node_head_block.num_hash();
let provider_rw = provider_factory.provider_rw()?;
provider_rw.insert_block(&node_head_block)?;
provider_rw.commit()?;
let exex_head =
ExExHead { block: BlockNumHash { number: genesis_block.number, hash: genesis_hash } };
@@ -613,7 +613,7 @@ mod tests {
.try_recover()?;
let node_head = node_head_block.num_hash();
let provider_rw = provider.database_provider_rw()?;
provider_rw.insert_block(node_head_block)?;
provider_rw.insert_block(&node_head_block)?;
provider_rw.commit()?;
let node_head_notification = ExExNotification::ChainCommitted {
new: Arc::new(

View File

@@ -37,6 +37,14 @@ where
Self::Empty(_) => None,
}
}
/// Return the reference to the response body
pub const fn body(&self) -> Option<&B::Body> {
match self {
Self::Full(block) => Some(block.body()),
Self::Empty(_) => None,
}
}
}
impl<B: Block> InMemorySize for BlockResponse<B> {

View File

@@ -235,7 +235,7 @@ mod tests {
for block in &blocks {
provider_rw
.insert_block(
block.clone().try_recover().expect("failed to seal block with senders"),
&block.clone().try_recover().expect("failed to seal block with senders"),
)
.expect("failed to insert block");
}
@@ -273,7 +273,7 @@ mod tests {
for block in &blocks {
provider_rw
.insert_block(
block.clone().try_recover().expect("failed to seal block with senders"),
&block.clone().try_recover().expect("failed to seal block with senders"),
)
.expect("failed to insert block");
}
@@ -319,7 +319,7 @@ mod tests {
for block in &blocks {
provider_rw
.insert_block(
block.clone().try_recover().expect("failed to seal block with senders"),
&block.clone().try_recover().expect("failed to seal block with senders"),
)
.expect("failed to insert block");
}
@@ -355,7 +355,7 @@ mod tests {
for block in &blocks {
provider_rw
.insert_block(
block.clone().try_recover().expect("failed to seal block with senders"),
&block.clone().try_recover().expect("failed to seal block with senders"),
)
.expect("failed to insert block");
}

View File

@@ -202,10 +202,7 @@ where
// Write bodies to database.
provider.append_block_bodies(
buffer
.into_iter()
.map(|response| (response.block_number(), response.into_body()))
.collect(),
buffer.iter().map(|response| (response.block_number(), response.body())).collect(),
)?;
// The stage is "done" if:

View File

@@ -748,8 +748,8 @@ mod tests {
let genesis = SealedBlock::<Block>::decode(&mut genesis_rlp).unwrap();
let mut block_rlp = hex!("f90262f901f9a075c371ba45999d87f4542326910a11af515897aebce5265d3f6acd1f1161f82fa01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347942adc25665018aa1fe0e6bc666dac8fc2697ff9baa098f2dcd87c8ae4083e7017a05456c14eea4b1db2032126e27b3b1563d57d7cc0a08151d548273f6683169524b66ca9fe338b9ce42bc3540046c828fd939ae23bcba03f4e5c2ec5b2170b711d97ee755c160457bb58d8daa338e835ec02ae6860bbabb901000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083020000018502540be40082a8798203e800a00000000000000000000000000000000000000000000000000000000000000000880000000000000000f863f861800a8405f5e10094100000000000000000000000000000000000000080801ba07e09e26678ed4fac08a249ebe8ed680bf9051a5e14ad223e4b2b9d26e0208f37a05f6e3f188e3e6eab7d7d3b6568f5eac7d687b08d307d3154ccd8c87b4630509bc0").as_slice();
let block = SealedBlock::<Block>::decode(&mut block_rlp).unwrap();
provider.insert_block(genesis.try_recover().unwrap()).unwrap();
provider.insert_block(block.clone().try_recover().unwrap()).unwrap();
provider.insert_block(&genesis.try_recover().unwrap()).unwrap();
provider.insert_block(&block.clone().try_recover().unwrap()).unwrap();
provider
.static_file_provider()
.latest_writer(StaticFileSegment::Headers)
@@ -789,8 +789,8 @@ mod tests {
let genesis = SealedBlock::<Block>::decode(&mut genesis_rlp).unwrap();
let mut block_rlp = hex!("f90262f901f9a075c371ba45999d87f4542326910a11af515897aebce5265d3f6acd1f1161f82fa01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347942adc25665018aa1fe0e6bc666dac8fc2697ff9baa098f2dcd87c8ae4083e7017a05456c14eea4b1db2032126e27b3b1563d57d7cc0a08151d548273f6683169524b66ca9fe338b9ce42bc3540046c828fd939ae23bcba03f4e5c2ec5b2170b711d97ee755c160457bb58d8daa338e835ec02ae6860bbabb901000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083020000018502540be40082a8798203e800a00000000000000000000000000000000000000000000000000000000000000000880000000000000000f863f861800a8405f5e10094100000000000000000000000000000000000000080801ba07e09e26678ed4fac08a249ebe8ed680bf9051a5e14ad223e4b2b9d26e0208f37a05f6e3f188e3e6eab7d7d3b6568f5eac7d687b08d307d3154ccd8c87b4630509bc0").as_slice();
let block = SealedBlock::<Block>::decode(&mut block_rlp).unwrap();
provider.insert_block(genesis.try_recover().unwrap()).unwrap();
provider.insert_block(block.clone().try_recover().unwrap()).unwrap();
provider.insert_block(&genesis.try_recover().unwrap()).unwrap();
provider.insert_block(&block.clone().try_recover().unwrap()).unwrap();
provider
.static_file_provider()
.latest_writer(StaticFileSegment::Headers)
@@ -830,8 +830,8 @@ mod tests {
let genesis = SealedBlock::<Block>::decode(&mut genesis_rlp).unwrap();
let mut block_rlp = hex!("f90262f901f9a075c371ba45999d87f4542326910a11af515897aebce5265d3f6acd1f1161f82fa01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347942adc25665018aa1fe0e6bc666dac8fc2697ff9baa098f2dcd87c8ae4083e7017a05456c14eea4b1db2032126e27b3b1563d57d7cc0a08151d548273f6683169524b66ca9fe338b9ce42bc3540046c828fd939ae23bcba03f4e5c2ec5b2170b711d97ee755c160457bb58d8daa338e835ec02ae6860bbabb901000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083020000018502540be40082a8798203e800a00000000000000000000000000000000000000000000000000000000000000000880000000000000000f863f861800a8405f5e10094100000000000000000000000000000000000000080801ba07e09e26678ed4fac08a249ebe8ed680bf9051a5e14ad223e4b2b9d26e0208f37a05f6e3f188e3e6eab7d7d3b6568f5eac7d687b08d307d3154ccd8c87b4630509bc0").as_slice();
let block = SealedBlock::<Block>::decode(&mut block_rlp).unwrap();
provider.insert_block(genesis.try_recover().unwrap()).unwrap();
provider.insert_block(block.clone().try_recover().unwrap()).unwrap();
provider.insert_block(&genesis.try_recover().unwrap()).unwrap();
provider.insert_block(&block.clone().try_recover().unwrap()).unwrap();
provider
.static_file_provider()
.latest_writer(StaticFileSegment::Headers)
@@ -863,8 +863,8 @@ mod tests {
let genesis = SealedBlock::<Block>::decode(&mut genesis_rlp).unwrap();
let mut block_rlp = hex!("f90262f901f9a075c371ba45999d87f4542326910a11af515897aebce5265d3f6acd1f1161f82fa01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347942adc25665018aa1fe0e6bc666dac8fc2697ff9baa098f2dcd87c8ae4083e7017a05456c14eea4b1db2032126e27b3b1563d57d7cc0a08151d548273f6683169524b66ca9fe338b9ce42bc3540046c828fd939ae23bcba03f4e5c2ec5b2170b711d97ee755c160457bb58d8daa338e835ec02ae6860bbabb901000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083020000018502540be40082a8798203e800a00000000000000000000000000000000000000000000000000000000000000000880000000000000000f863f861800a8405f5e10094100000000000000000000000000000000000000080801ba07e09e26678ed4fac08a249ebe8ed680bf9051a5e14ad223e4b2b9d26e0208f37a05f6e3f188e3e6eab7d7d3b6568f5eac7d687b08d307d3154ccd8c87b4630509bc0").as_slice();
let block = SealedBlock::<Block>::decode(&mut block_rlp).unwrap();
provider.insert_block(genesis.try_recover().unwrap()).unwrap();
provider.insert_block(block.clone().try_recover().unwrap()).unwrap();
provider.insert_block(&genesis.try_recover().unwrap()).unwrap();
provider.insert_block(&block.clone().try_recover().unwrap()).unwrap();
provider
.static_file_provider()
.latest_writer(StaticFileSegment::Headers)
@@ -1005,8 +1005,8 @@ mod tests {
let genesis = SealedBlock::<Block>::decode(&mut genesis_rlp).unwrap();
let mut block_rlp = hex!("f90262f901f9a075c371ba45999d87f4542326910a11af515897aebce5265d3f6acd1f1161f82fa01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347942adc25665018aa1fe0e6bc666dac8fc2697ff9baa098f2dcd87c8ae4083e7017a05456c14eea4b1db2032126e27b3b1563d57d7cc0a08151d548273f6683169524b66ca9fe338b9ce42bc3540046c828fd939ae23bcba03f4e5c2ec5b2170b711d97ee755c160457bb58d8daa338e835ec02ae6860bbabb901000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083020000018502540be40082a8798203e800a00000000000000000000000000000000000000000000000000000000000000000880000000000000000f863f861800a8405f5e10094100000000000000000000000000000000000000080801ba07e09e26678ed4fac08a249ebe8ed680bf9051a5e14ad223e4b2b9d26e0208f37a05f6e3f188e3e6eab7d7d3b6568f5eac7d687b08d307d3154ccd8c87b4630509bc0").as_slice();
let block = SealedBlock::<Block>::decode(&mut block_rlp).unwrap();
provider.insert_block(genesis.try_recover().unwrap()).unwrap();
provider.insert_block(block.clone().try_recover().unwrap()).unwrap();
provider.insert_block(&genesis.try_recover().unwrap()).unwrap();
provider.insert_block(&block.clone().try_recover().unwrap()).unwrap();
provider
.static_file_provider()
.latest_writer(StaticFileSegment::Headers)
@@ -1115,8 +1115,8 @@ mod tests {
let genesis = SealedBlock::<Block>::decode(&mut genesis_rlp).unwrap();
let mut block_rlp = hex!("f9025ff901f7a0c86e8cc0310ae7c531c758678ddbfd16fc51c8cef8cec650b032de9869e8b94fa01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347942adc25665018aa1fe0e6bc666dac8fc2697ff9baa050554882fbbda2c2fd93fdc466db9946ea262a67f7a76cc169e714f105ab583da00967f09ef1dfed20c0eacfaa94d5cd4002eda3242ac47eae68972d07b106d192a0e3c8b47fbfc94667ef4cceb17e5cc21e3b1eebd442cebb27f07562b33836290db90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000001830f42408238108203e800a00000000000000000000000000000000000000000000000000000000000000000880000000000000000f862f860800a83061a8094095e7baea6a6c7c4c2dfeb977efac326af552d8780801ba072ed817487b84ba367d15d2f039b5fc5f087d0a8882fbdf73e8cb49357e1ce30a0403d800545b8fc544f92ce8124e2255f8c3c6af93f28243a120585d4c4c6a2a3c0").as_slice();
let block = SealedBlock::<Block>::decode(&mut block_rlp).unwrap();
provider.insert_block(genesis.try_recover().unwrap()).unwrap();
provider.insert_block(block.clone().try_recover().unwrap()).unwrap();
provider.insert_block(&genesis.try_recover().unwrap()).unwrap();
provider.insert_block(&block.clone().try_recover().unwrap()).unwrap();
provider
.static_file_provider()
.latest_writer(StaticFileSegment::Headers)
@@ -1265,13 +1265,15 @@ mod tests {
let provider_rw = factory.database_provider_rw().unwrap();
let mut rng = generators::rng();
let genesis = generators::random_block(&mut rng, 0, Default::default());
provider_rw.insert_block(genesis.try_recover().unwrap()).expect("failed to insert genesis");
provider_rw
.insert_block(&genesis.try_recover().unwrap())
.expect("failed to insert genesis");
let block = generators::random_block(
&mut rng,
1,
generators::BlockParams { tx_count: Some(2), ..Default::default() },
);
provider_rw.insert_block(block.try_recover().unwrap()).expect("failed to insert block");
provider_rw.insert_block(&block.try_recover().unwrap()).expect("failed to insert block");
let static_file_provider = provider_rw.static_file_provider();
static_file_provider.latest_writer(StaticFileSegment::Headers).unwrap().commit().unwrap();

View File

@@ -86,7 +86,7 @@ impl AccountHashingStage {
);
for block in blocks {
provider.insert_block(block.try_recover().unwrap()).unwrap();
provider.insert_block(&block.try_recover().unwrap()).unwrap();
}
provider
.static_file_provider()

View File

@@ -96,11 +96,11 @@ mod tests {
let genesis = SealedBlock::<Block>::decode(&mut genesis_rlp).unwrap();
let mut block_rlp = hex!("f90262f901f9a075c371ba45999d87f4542326910a11af515897aebce5265d3f6acd1f1161f82fa01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347942adc25665018aa1fe0e6bc666dac8fc2697ff9baa098f2dcd87c8ae4083e7017a05456c14eea4b1db2032126e27b3b1563d57d7cc0a08151d548273f6683169524b66ca9fe338b9ce42bc3540046c828fd939ae23bcba03f4e5c2ec5b2170b711d97ee755c160457bb58d8daa338e835ec02ae6860bbabb901000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083020000018502540be40082a8798203e800a00000000000000000000000000000000000000000000000000000000000000000880000000000000000f863f861800a8405f5e10094100000000000000000000000000000000000000080801ba07e09e26678ed4fac08a249ebe8ed680bf9051a5e14ad223e4b2b9d26e0208f37a05f6e3f188e3e6eab7d7d3b6568f5eac7d687b08d307d3154ccd8c87b4630509bc0").as_slice();
let block = SealedBlock::<Block>::decode(&mut block_rlp).unwrap();
provider_rw.insert_block(genesis.try_recover().unwrap()).unwrap();
provider_rw.insert_block(block.clone().try_recover().unwrap()).unwrap();
let mut head = block.hash();
provider_rw.insert_block(&genesis.try_recover().unwrap()).unwrap();
provider_rw.insert_block(&block.try_recover().unwrap()).unwrap();
// Fill with bogus blocks to respect PruneMode distance.
let mut head = block.hash();
let mut rng = generators::rng();
for block_number in 2..=tip {
let nblock = random_block(
@@ -109,7 +109,7 @@ mod tests {
generators::BlockParams { parent: Some(head), ..Default::default() },
);
head = nblock.hash();
provider_rw.insert_block(nblock.try_recover().unwrap()).unwrap();
provider_rw.insert_block(&nblock.try_recover().unwrap()).unwrap();
}
provider_rw
.static_file_provider()

View File

@@ -875,7 +875,7 @@ mod tests {
// Insert blocks into the database
for block in &database_blocks {
provider_rw.insert_block(
block.clone().try_recover().expect("failed to seal block with senders"),
&block.clone().try_recover().expect("failed to seal block with senders"),
)?;
}
@@ -1005,9 +1005,10 @@ mod tests {
let provider_rw = factory.provider_rw()?;
for block in database_blocks {
provider_rw.insert_block(
block.clone().try_recover().expect("failed to seal block with senders"),
&block.clone().try_recover().expect("failed to seal block with senders"),
)?;
}
provider_rw.commit()?;
// Create a new provider
@@ -1103,7 +1104,7 @@ mod tests {
let provider_rw = factory.provider_rw()?;
for block in database_blocks {
provider_rw.insert_block(
block.clone().try_recover().expect("failed to seal block with senders"),
&block.clone().try_recover().expect("failed to seal block with senders"),
)?;
}
provider_rw.commit()?;
@@ -1320,7 +1321,7 @@ mod tests {
// Insert and commit the block.
let provider_rw = factory.provider_rw()?;
provider_rw.insert_block(block_1)?;
provider_rw.insert_block(&block_1)?;
provider_rw.commit()?;
let provider = BlockchainProvider::new(factory)?;

View File

@@ -1566,7 +1566,7 @@ mod tests {
let provider_rw = factory.provider_rw()?;
for block in database_blocks {
provider_rw.insert_block(
block.clone().try_recover().expect("failed to seal block with senders"),
&block.clone().try_recover().expect("failed to seal block with senders"),
)?;
}
provider_rw.commit()?;
@@ -1677,7 +1677,7 @@ mod tests {
let provider_rw = factory.provider_rw()?;
for block in database_blocks {
provider_rw.insert_block(
block.clone().try_recover().expect("failed to seal block with senders"),
&block.clone().try_recover().expect("failed to seal block with senders"),
)?;
}
provider_rw.commit()?;

View File

@@ -103,7 +103,7 @@ mod tests {
// insert the block
let provider_rw = provider_factory.provider_rw().unwrap();
provider_rw.insert_block(genesis_block).unwrap();
provider_rw.insert_block(&genesis_block).unwrap();
provider_rw.commit().unwrap();
// create a consistent view provider and check that a ro provider can be made
@@ -121,7 +121,7 @@ mod tests {
// insert the block
let provider_rw = provider_factory.provider_rw().unwrap();
provider_rw.insert_block(recovered_block).unwrap();
provider_rw.insert_block(&recovered_block).unwrap();
provider_rw.commit().unwrap();
// ensure successful creation of a read-only provider, based on this new db state.
@@ -136,7 +136,7 @@ mod tests {
// insert the block
let provider_rw = provider_factory.provider_rw().unwrap();
provider_rw.insert_block(recovered_block).unwrap();
provider_rw.insert_block(&recovered_block).unwrap();
provider_rw.commit().unwrap();
// check that creation of a read-only provider still works
@@ -156,7 +156,7 @@ mod tests {
// insert the block
let provider_rw = provider_factory.provider_rw().unwrap();
provider_rw.insert_block(genesis_block).unwrap();
provider_rw.insert_block(&genesis_block).unwrap();
provider_rw.commit().unwrap();
// create a consistent view provider and check that a ro provider can be made
@@ -174,7 +174,7 @@ mod tests {
// insert the block
let provider_rw = provider_factory.provider_rw().unwrap();
provider_rw.insert_block(recovered_block).unwrap();
provider_rw.insert_block(&recovered_block).unwrap();
provider_rw.commit().unwrap();
// create a second consistent view provider and check that a ro provider can be made
@@ -208,7 +208,7 @@ mod tests {
// reinsert the block at the same height, but with a different hash
let provider_rw = provider_factory.provider_rw().unwrap();
provider_rw.insert_block(recovered_block).unwrap();
provider_rw.insert_block(&recovered_block).unwrap();
provider_rw.commit().unwrap();
// ensure unsuccessful creation of a read-only provider, based on this new db state.

View File

@@ -726,7 +726,7 @@ mod tests {
{
let factory = create_test_provider_factory();
let provider = factory.provider_rw().unwrap();
assert_matches!(provider.insert_block(block.clone().try_recover().unwrap()), Ok(_));
assert_matches!(provider.insert_block(&block.clone().try_recover().unwrap()), Ok(_));
assert_matches!(
provider.transaction_sender(0), Ok(Some(sender))
if sender == block.body().transactions[0].recover_signer().unwrap()
@@ -745,7 +745,7 @@ mod tests {
};
let factory = create_test_provider_factory();
let provider = factory.with_prune_modes(prune_modes).provider_rw().unwrap();
assert_matches!(provider.insert_block(block.clone().try_recover().unwrap()), Ok(_));
assert_matches!(provider.insert_block(&block.clone().try_recover().unwrap()), Ok(_));
assert_matches!(provider.transaction_sender(0), Ok(None));
assert_matches!(
provider.transaction_id(*block.body().transactions[0].tx_hash()),
@@ -765,7 +765,7 @@ mod tests {
let factory = create_test_provider_factory();
let provider = factory.provider_rw().unwrap();
assert_matches!(provider.insert_block(block.clone().try_recover().unwrap()), Ok(_));
assert_matches!(provider.insert_block(&block.clone().try_recover().unwrap()), Ok(_));
let senders = provider.take::<tables::TransactionSenders>(range.clone());
assert_eq!(

View File

@@ -356,7 +356,7 @@ impl<TX: DbTx + DbTxMut + 'static, N: NodeTypesForProvider> DatabaseProvider<TX,
let trie_data = block.trie_data();
let ExecutedBlock { recovered_block, execution_output, .. } = block;
let block_number = recovered_block.number();
self.insert_block(Arc::unwrap_or_clone(recovered_block))?;
self.insert_block(&recovered_block)?;
// Write state and changesets to the database.
// Must be written after blocks because of the receipt lookup.
@@ -2875,7 +2875,7 @@ impl<TX: DbTxMut + DbTx + 'static, N: NodeTypesForProvider + 'static> BlockWrite
/// [`TransactionHashNumbers`](tables::TransactionHashNumbers).
fn insert_block(
&self,
block: RecoveredBlock<Self::Block>,
block: &RecoveredBlock<Self::Block>,
) -> ProviderResult<StoredBlockBodyIndices> {
let block_number = block.number();
let tx_count = block.body().transaction_count() as u64;
@@ -2915,7 +2915,7 @@ impl<TX: DbTxMut + DbTx + 'static, N: NodeTypesForProvider + 'static> BlockWrite
durations_recorder.record_relative(metrics::Action::InsertTransactionHashNumbers);
}
self.append_block_bodies(vec![(block_number, Some(block.into_body()))])?;
self.append_block_bodies(vec![(block_number, Some(block.body()))])?;
debug!(
target: "providers::db",
@@ -2929,7 +2929,7 @@ impl<TX: DbTxMut + DbTx + 'static, N: NodeTypesForProvider + 'static> BlockWrite
fn append_block_bodies(
&self,
bodies: Vec<(BlockNumber, Option<BodyTy<N>>)>,
bodies: Vec<(BlockNumber, Option<&BodyTy<N>>)>,
) -> ProviderResult<()> {
let Some(from_block) = bodies.first().map(|(block, _)| *block) else { return Ok(()) };
@@ -3081,7 +3081,7 @@ impl<TX: DbTxMut + DbTx + 'static, N: NodeTypesForProvider + 'static> BlockWrite
// Insert the blocks
for block in blocks {
self.insert_block(block)?;
self.insert_block(&block)?;
durations_recorder.record_relative(metrics::Action::InsertBlock);
}
@@ -3302,14 +3302,14 @@ mod tests {
let data = BlockchainTestData::default();
let provider_rw = factory.provider_rw().unwrap();
provider_rw.insert_block(data.genesis.clone().try_recover().unwrap()).unwrap();
provider_rw.insert_block(&data.genesis.clone().try_recover().unwrap()).unwrap();
provider_rw
.write_state(
&ExecutionOutcome { first_block: 0, receipts: vec![vec![]], ..Default::default() },
crate::OriginalValuesKnown::No,
)
.unwrap();
provider_rw.insert_block(data.blocks[0].0.clone()).unwrap();
provider_rw.insert_block(&data.blocks[0].0).unwrap();
provider_rw.write_state(&data.blocks[0].1, crate::OriginalValuesKnown::No).unwrap();
provider_rw.commit().unwrap();
@@ -3328,7 +3328,7 @@ mod tests {
let data = BlockchainTestData::default();
let provider_rw = factory.provider_rw().unwrap();
provider_rw.insert_block(data.genesis.clone().try_recover().unwrap()).unwrap();
provider_rw.insert_block(&data.genesis.clone().try_recover().unwrap()).unwrap();
provider_rw
.write_state(
&ExecutionOutcome { first_block: 0, receipts: vec![vec![]], ..Default::default() },
@@ -3336,7 +3336,7 @@ mod tests {
)
.unwrap();
for i in 0..3 {
provider_rw.insert_block(data.blocks[i].0.clone()).unwrap();
provider_rw.insert_block(&data.blocks[i].0).unwrap();
provider_rw.write_state(&data.blocks[i].1, crate::OriginalValuesKnown::No).unwrap();
}
provider_rw.commit().unwrap();
@@ -3358,7 +3358,7 @@ mod tests {
let data = BlockchainTestData::default();
let provider_rw = factory.provider_rw().unwrap();
provider_rw.insert_block(data.genesis.clone().try_recover().unwrap()).unwrap();
provider_rw.insert_block(&data.genesis.clone().try_recover().unwrap()).unwrap();
provider_rw
.write_state(
&ExecutionOutcome { first_block: 0, receipts: vec![vec![]], ..Default::default() },
@@ -3368,7 +3368,7 @@ mod tests {
// insert blocks 1-3 with receipts
for i in 0..3 {
provider_rw.insert_block(data.blocks[i].0.clone()).unwrap();
provider_rw.insert_block(&data.blocks[i].0).unwrap();
provider_rw.write_state(&data.blocks[i].1, crate::OriginalValuesKnown::No).unwrap();
}
provider_rw.commit().unwrap();
@@ -3389,7 +3389,7 @@ mod tests {
let data = BlockchainTestData::default();
let provider_rw = factory.provider_rw().unwrap();
provider_rw.insert_block(data.genesis.clone().try_recover().unwrap()).unwrap();
provider_rw.insert_block(&data.genesis.clone().try_recover().unwrap()).unwrap();
provider_rw
.write_state(
&ExecutionOutcome { first_block: 0, receipts: vec![vec![]], ..Default::default() },
@@ -3397,7 +3397,7 @@ mod tests {
)
.unwrap();
for i in 0..3 {
provider_rw.insert_block(data.blocks[i].0.clone()).unwrap();
provider_rw.insert_block(&data.blocks[i].0).unwrap();
provider_rw.write_state(&data.blocks[i].1, crate::OriginalValuesKnown::No).unwrap();
}
provider_rw.commit().unwrap();
@@ -3433,7 +3433,7 @@ mod tests {
let provider_rw = factory.provider_rw().unwrap();
for block in blocks {
provider_rw.insert_block(block.try_recover().unwrap()).unwrap();
provider_rw.insert_block(&block.try_recover().unwrap()).unwrap();
}
provider_rw.commit().unwrap();
@@ -3452,7 +3452,7 @@ mod tests {
let data = BlockchainTestData::default();
let provider_rw = factory.provider_rw().unwrap();
provider_rw.insert_block(data.genesis.clone().try_recover().unwrap()).unwrap();
provider_rw.insert_block(&data.genesis.clone().try_recover().unwrap()).unwrap();
provider_rw
.write_state(
&ExecutionOutcome { first_block: 0, receipts: vec![vec![]], ..Default::default() },
@@ -3460,7 +3460,7 @@ mod tests {
)
.unwrap();
for i in 0..3 {
provider_rw.insert_block(data.blocks[i].0.clone()).unwrap();
provider_rw.insert_block(&data.blocks[i].0).unwrap();
provider_rw.write_state(&data.blocks[i].1, crate::OriginalValuesKnown::No).unwrap();
}
provider_rw.commit().unwrap();
@@ -4760,7 +4760,7 @@ mod tests {
block_num,
BlockParams { tx_count: Some(tx_count), ..Default::default() },
);
provider_rw.insert_block(block.try_recover().unwrap()).unwrap();
provider_rw.insert_block(&block.try_recover().unwrap()).unwrap();
}
};

View File

@@ -463,7 +463,9 @@ mod tests {
let provider = factory.database_provider_rw().unwrap();
let mut tx_count = 0u64;
for block in &blocks {
provider.insert_block(block.clone().try_recover().expect("recover block")).unwrap();
provider
.insert_block(&block.clone().try_recover().expect("recover block"))
.unwrap();
for tx in &block.body().transactions {
let hash = tx.trie_hash();
tx_hashes.push(hash);
@@ -603,7 +605,9 @@ mod tests {
let provider = factory.database_provider_rw().unwrap();
let mut tx_count = 0u64;
for block in &blocks {
provider.insert_block(block.clone().try_recover().expect("recover block")).unwrap();
provider
.insert_block(&block.clone().try_recover().expect("recover block"))
.unwrap();
for tx in &block.body().transactions {
let hash = tx.trie_hash();
rocksdb.put::<tables::TransactionHashNumbers>(hash, &tx_count).unwrap();
@@ -667,7 +671,9 @@ mod tests {
let provider = factory.database_provider_rw().unwrap();
// Insert ALL blocks (0-5) to write transactions to static files
for block in &blocks {
provider.insert_block(block.clone().try_recover().expect("recover block")).unwrap();
provider
.insert_block(&block.clone().try_recover().expect("recover block"))
.unwrap();
for tx in &block.body().transactions {
let hash = tx.trie_hash();
tx_hashes.push(hash);
@@ -831,7 +837,9 @@ mod tests {
let provider = factory.database_provider_rw().unwrap();
for block in &blocks {
provider.insert_block(block.clone().try_recover().expect("recover block")).unwrap();
provider
.insert_block(&block.clone().try_recover().expect("recover block"))
.unwrap();
// Store transaction hash -> tx_number mappings in RocksDB
for tx in &block.body().transactions {

View File

@@ -53,7 +53,7 @@ pub trait BlockWriter {
/// and transition in the block.
fn insert_block(
&self,
block: RecoveredBlock<Self::Block>,
block: &RecoveredBlock<Self::Block>,
) -> ProviderResult<StoredBlockBodyIndices>;
/// Appends a batch of block bodies extending the canonical chain. This is invoked during
@@ -63,7 +63,7 @@ pub trait BlockWriter {
/// Bodies are passed as [`Option`]s, if body is `None` the corresponding block is empty.
fn append_block_bodies(
&self,
bodies: Vec<(BlockNumber, Option<<Self::Block as Block>::Body>)>,
bodies: Vec<(BlockNumber, Option<&<Self::Block as Block>::Body>)>,
) -> ProviderResult<()>;
/// Removes all blocks above the given block number from the database.

View File

@@ -28,7 +28,7 @@ pub trait BlockBodyWriter<Provider, Body: BlockBody> {
fn write_block_bodies(
&self,
provider: &Provider,
bodies: Vec<(BlockNumber, Option<Body>)>,
bodies: Vec<(BlockNumber, Option<&Body>)>,
) -> ProviderResult<()>;
/// Removes all block bodies above the given block number from the database.
@@ -102,7 +102,7 @@ where
fn write_block_bodies(
&self,
provider: &Provider,
bodies: Vec<(u64, Option<alloy_consensus::BlockBody<T, H>>)>,
bodies: Vec<(u64, Option<&alloy_consensus::BlockBody<T, H>>)>,
) -> ProviderResult<()> {
let mut ommers_cursor = provider.tx_ref().cursor_write::<tables::BlockOmmers<H>>()?;
let mut withdrawals_cursor =
@@ -113,11 +113,12 @@ where
// Write ommers if any
if !body.ommers.is_empty() {
ommers_cursor.append(block_number, &StoredBlockOmmers { ommers: body.ommers })?;
ommers_cursor
.append(block_number, &StoredBlockOmmers { ommers: body.ommers.clone() })?;
}
// Write withdrawals if any
if let Some(withdrawals) = body.withdrawals &&
if let Some(withdrawals) = body.withdrawals.clone() &&
!withdrawals.is_empty()
{
withdrawals_cursor.append(block_number, &StoredBlockWithdrawals { withdrawals })?;
@@ -212,7 +213,7 @@ where
fn write_block_bodies(
&self,
_provider: &Provider,
_bodies: Vec<(u64, Option<alloy_consensus::BlockBody<T, H>>)>,
_bodies: Vec<(u64, Option<&alloy_consensus::BlockBody<T, H>>)>,
) -> ProviderResult<()> {
// noop
Ok(())

View File

@@ -218,7 +218,7 @@ fn run_case(
.unwrap();
provider
.insert_block(genesis_block.clone())
.insert_block(&genesis_block)
.map_err(|err| Error::block_failed(0, Default::default(), err))?;
// Increment block number for receipts static file
@@ -249,7 +249,7 @@ fn run_case(
// Insert the block into the database
provider
.insert_block(block.clone())
.insert_block(block)
.map_err(|err| Error::block_failed(block_number, Default::default(), err))?;
// Commit static files, so we can query the headers for stateless execution below
provider