Skip to content

Commit

Permalink
Refactor DatabaseMessageProof impls
Browse files Browse the repository at this point in the history
  • Loading branch information
bvrooman committed May 10, 2024
1 parent 8ba540a commit 7d42421
Show file tree
Hide file tree
Showing 7 changed files with 215 additions and 173 deletions.
2 changes: 1 addition & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/).

### Changed

- [#1891](https://github.com/FuelLabs/fuel-core/pull/1891): Regenesis now preserves `FuelBlockMerkleData` and `FuelBlockMerkleMetadata` in the off-chain table. These tables are checked when querying message proofs.
- [#1891](https://github.com/FuelLabs/fuel-core/pull/1891): Regenesis now preserves `FuelBlockMerkleData` and `FuelBlockMerkleMetadata` in the off-chain table. These tables are checked when querying message proofs.
- [#1886](https://github.com/FuelLabs/fuel-core/pull/1886): Use ref to `Block` in validation code
- [#1876](https://github.com/FuelLabs/fuel-core/pull/1876): Updated benchmark to include the worst scenario for `CROO` opcode. Also include consensus parameters in bench output.
- [#1879](https://github.com/FuelLabs/fuel-core/pull/1879): Return the old behaviour for the `discovery_works` test.
Expand Down
98 changes: 1 addition & 97 deletions crates/fuel-core/src/database/block.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,7 @@ use crate::{
database_description::off_chain::OffChain,
Database,
},
fuel_core_graphql_api::storage::{
blocks::FuelBlockIdsToHeights,
old::{
OldFuelBlockMerkleData,
OldFuelBlockMerkleMetadata,
},
},
fuel_core_graphql_api::storage::blocks::FuelBlockIdsToHeights,
};
use fuel_core_storage::{
iter::{
Expand All @@ -18,15 +12,9 @@ use fuel_core_storage::{
},
not_found,
tables::{
merkle::{
DenseMetadataKey,
FuelBlockMerkleData,
FuelBlockMerkleMetadata,
},
FuelBlocks,
Transactions,
},
Error as StorageError,
Result as StorageResult,
StorageAsRef,
};
Expand All @@ -38,8 +26,6 @@ use fuel_core_types::{
},
primitives::BlockId,
},
entities::relayer::message::MerkleProof,
fuel_merkle::binary::MerkleTree,
fuel_types::BlockHeight,
};
use itertools::Itertools;
Expand All @@ -51,46 +37,6 @@ impl Database<OffChain> {
.get(id)
.map(|v| v.map(|v| v.into_owned()))
}

pub fn block_history_proof(
&self,
message_block_height: &BlockHeight,
commit_block_height: &BlockHeight,
) -> StorageResult<MerkleProof> {
if message_block_height > commit_block_height {
Err(anyhow::anyhow!(
"The `message_block_height` is higher than `commit_block_height`"
))?;
}

let message_merkle_metadata = self
.storage::<OldFuelBlockMerkleMetadata>()
.get(&DenseMetadataKey::Primary(*message_block_height))?
.ok_or(not_found!(OldFuelBlockMerkleMetadata))?;

let commit_merkle_metadata = self
.storage::<OldFuelBlockMerkleMetadata>()
.get(&DenseMetadataKey::Primary(*commit_block_height))?
.ok_or(not_found!(OldFuelBlockMerkleMetadata))?;

let storage = self;
let tree: MerkleTree<OldFuelBlockMerkleData, _> =
MerkleTree::load(storage, commit_merkle_metadata.version())
.map_err(|err| StorageError::Other(anyhow::anyhow!(err)))?;

let proof_index = message_merkle_metadata
.version()
.checked_sub(1)
.ok_or(anyhow::anyhow!("The count of leafs - messages is zero"))?;
let (_, proof_set) = tree
.prove(proof_index)
.map_err(|err| StorageError::Other(anyhow::anyhow!(err)))?;

Ok(MerkleProof {
proof_set,
proof_index,
})
}
}

impl Database {
Expand Down Expand Up @@ -134,48 +80,6 @@ impl Database {
}
}

impl Database {
pub fn block_history_proof(
&self,
message_block_height: &BlockHeight,
commit_block_height: &BlockHeight,
) -> StorageResult<MerkleProof> {
if message_block_height > commit_block_height {
Err(anyhow::anyhow!(
"The `message_block_height` is higher than `commit_block_height`"
))?;
}

let message_merkle_metadata = self
.storage::<FuelBlockMerkleMetadata>()
.get(&DenseMetadataKey::Primary(*message_block_height))?
.ok_or(not_found!(FuelBlockMerkleMetadata))?;

let commit_merkle_metadata = self
.storage::<FuelBlockMerkleMetadata>()
.get(&DenseMetadataKey::Primary(*commit_block_height))?
.ok_or(not_found!(FuelBlockMerkleMetadata))?;

let storage = self;
let tree: MerkleTree<FuelBlockMerkleData, _> =
MerkleTree::load(storage, commit_merkle_metadata.version())
.map_err(|err| StorageError::Other(anyhow::anyhow!(err)))?;

let proof_index = message_merkle_metadata
.version()
.checked_sub(1)
.ok_or(anyhow::anyhow!("The count of leafs - messages is zero"))?;
let (_, proof_set) = tree
.prove(proof_index)
.map_err(|err| StorageError::Other(anyhow::anyhow!(err)))?;

Ok(MerkleProof {
proof_set,
proof_index,
})
}
}

#[allow(clippy::arithmetic_side_effects)]
#[cfg(test)]
mod tests {
Expand Down
15 changes: 9 additions & 6 deletions crates/fuel-core/src/graphql_api/database.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,10 @@ use fuel_core_storage::{
IterDirection,
},
not_found,
tables::Transactions,
tables::{
merkle::DenseMerkleMetadata,
Transactions,
},
transactional::AtomicView,
Error as StorageError,
IsNotFound,
Expand Down Expand Up @@ -335,15 +338,15 @@ impl OffChainDatabase for ReadView {
self.off_chain.old_blocks(height, direction)
}

fn old_block_merkle_data(&self, _version: &u64) -> StorageResult<Option<Primitive>> {
todo!()
fn old_block_merkle_data(&self, version: &u64) -> StorageResult<Primitive> {
self.off_chain.old_block_merkle_data(version)
}

fn old_block_merkle_metadata(
&self,
_version: &u64,
) -> StorageResult<Option<Primitive>> {
todo!()
height: &BlockHeight,
) -> StorageResult<DenseMerkleMetadata> {
self.off_chain.old_block_merkle_metadata(height)
}

fn old_block_consensus(&self, height: &BlockHeight) -> StorageResult<Consensus> {
Expand Down
70 changes: 64 additions & 6 deletions crates/fuel-core/src/graphql_api/ports.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,14 @@ use fuel_core_storage::{
IterDirection,
},
tables::{
merkle::DenseMerkleMetadata,
Coins,
ContractsAssets,
ContractsRawCode,
Messages,
},
Error as StorageError,
Mappable,
Result as StorageResult,
StorageInspect,
};
Expand Down Expand Up @@ -98,15 +100,12 @@ pub trait OffChainDatabase: Send + Sync + DatabaseMessageProof {
direction: IterDirection,
) -> BoxedIter<'_, StorageResult<CompressedBlock>>;

fn old_block_merkle_data(
&self,
version: &u64,
) -> StorageResult<Option<binary::Primitive>>;
fn old_block_merkle_data(&self, version: &u64) -> StorageResult<binary::Primitive>;

fn old_block_merkle_metadata(
&self,
version: &u64,
) -> StorageResult<Option<binary::Primitive>>;
height: &BlockHeight,
) -> StorageResult<DenseMerkleMetadata>;

fn old_block_consensus(&self, height: &BlockHeight) -> StorageResult<Consensus>;

Expand Down Expand Up @@ -189,6 +188,25 @@ pub trait DatabaseChain {
fn da_height(&self) -> StorageResult<DaBlockHeight>;
}

/// Trait that defines getters for Block Merkle data and metadata
pub trait DatabaseMerkle {
type TableType: Mappable<
Key = u64,
Value = binary::Primitive,
OwnedValue = binary::Primitive,
>;

fn merkle_data(&self, version: &u64) -> StorageResult<binary::Primitive>;

fn merkle_metadata(&self, height: &BlockHeight)
-> StorageResult<DenseMerkleMetadata>;

fn load_merkle_tree(
&self,
version: u64,
) -> StorageResult<binary::MerkleTree<Self::TableType, &Self>>;
}

#[async_trait]
pub trait TxPoolPort: Send + Sync {
fn transaction(&self, id: TxId) -> Option<Transaction>;
Expand Down Expand Up @@ -236,6 +254,46 @@ pub trait DatabaseMessageProof: Send + Sync {
) -> StorageResult<MerkleProof>;
}

impl<T> DatabaseMessageProof for T
where
T: Send
+ Sync
+ DatabaseMerkle
+ StorageInspect<<T as DatabaseMerkle>::TableType, Error = StorageError>,
{
fn block_history_proof(
&self,
message_block_height: &BlockHeight,
commit_block_height: &BlockHeight,
) -> StorageResult<MerkleProof> {
if message_block_height > commit_block_height {
Err(anyhow::anyhow!(
"The `message_block_height` is higher than `commit_block_height`"
))?;
}

let message_merkle_metadata = self.merkle_metadata(message_block_height)?;
let commit_merkle_metadata = self.merkle_metadata(commit_block_height)?;
let version = commit_merkle_metadata.version();
let tree = self
.load_merkle_tree(version)
.map_err(|err| StorageError::Other(anyhow::anyhow!(err)))?;

let proof_index = message_merkle_metadata
.version()
.checked_sub(1)
.ok_or(anyhow::anyhow!("The count of leafs - messages is zero"))?;
let (_, proof_set) = tree
.prove(proof_index)
.map_err(|err| StorageError::Other(anyhow::anyhow!(err)))?;

Ok(MerkleProof {
proof_set,
proof_index,
})
}
}

#[async_trait::async_trait]
pub trait P2pPort: Send + Sync {
async fn all_peer_info(&self) -> anyhow::Result<Vec<PeerInfo>>;
Expand Down
38 changes: 0 additions & 38 deletions crates/fuel-core/src/service/adapters/graphql_api.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,18 +5,10 @@ use super::{
StaticGasPrice,
};
use crate::{
database::{
database_description::{
off_chain::OffChain,
on_chain::OnChain,
},
Database,
},
fuel_core_graphql_api::ports::{
worker,
BlockProducerPort,
ConsensusProvider,
DatabaseMessageProof,
GasPriceEstimate,
P2pPort,
TxPoolPort,
Expand All @@ -28,13 +20,11 @@ use crate::{
};
use async_trait::async_trait;
use fuel_core_services::stream::BoxStream;
use fuel_core_storage::Result as StorageResult;
use fuel_core_txpool::{
service::TxStatusMessage,
types::TxId,
};
use fuel_core_types::{
entities::relayer::message::MerkleProof,
fuel_tx::{
Bytes32,
ConsensusParameters,
Expand Down Expand Up @@ -94,34 +84,6 @@ impl TxPoolPort for TxPoolAdapter {
}
}

impl DatabaseMessageProof for Database<OffChain> {
fn block_history_proof(
&self,
message_block_height: &BlockHeight,
commit_block_height: &BlockHeight,
) -> StorageResult<MerkleProof> {
Database::<OffChain>::block_history_proof(
self,
message_block_height,
commit_block_height,
)
}
}

impl DatabaseMessageProof for Database<OnChain> {
fn block_history_proof(
&self,
message_block_height: &BlockHeight,
commit_block_height: &BlockHeight,
) -> StorageResult<MerkleProof> {
Database::<OnChain>::block_history_proof(
self,
message_block_height,
commit_block_height,
)
}
}

#[async_trait]
impl BlockProducerPort for BlockProducerAdapter {
async fn dry_run_txs(
Expand Down
Loading

0 comments on commit 7d42421

Please sign in to comment.