mirror of
https://github.com/hl-archive-node/nanoreth.git
synced 2025-12-06 10:59:55 +00:00
Compare commits
2 Commits
a74fbc59fe
...
6f8d089298
| Author | SHA1 | Date | |
|---|---|---|---|
| 6f8d089298 | |||
| 98846d2710 |
3
Cargo.lock
generated
3
Cargo.lock
generated
@ -7971,9 +7971,11 @@ name = "reth-hyperliquid-types"
|
||||
version = "1.2.0"
|
||||
dependencies = [
|
||||
"alloy-primitives",
|
||||
"alloy-rlp",
|
||||
"clap",
|
||||
"parking_lot",
|
||||
"reth-cli-commands",
|
||||
"rmp-serde",
|
||||
"serde",
|
||||
"tokio",
|
||||
]
|
||||
@ -9059,6 +9061,7 @@ dependencies = [
|
||||
"reth-evm",
|
||||
"reth-execution-types",
|
||||
"reth-fs-util",
|
||||
"reth-hyperliquid-types",
|
||||
"reth-metrics",
|
||||
"reth-network-p2p",
|
||||
"reth-nippy-jar",
|
||||
|
||||
@ -12,7 +12,9 @@ workspace = true
|
||||
|
||||
[dependencies]
|
||||
alloy-primitives.workspace = true
|
||||
alloy-rlp = { workspace = true }
|
||||
serde.workspace = true
|
||||
rmp-serde = "1.3"
|
||||
tokio = { workspace = true, features = ["sync", "macros", "time", "rt-multi-thread"] }
|
||||
parking_lot.workspace = true
|
||||
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
use std::{collections::BTreeMap, sync::Arc};
|
||||
|
||||
use alloy_primitives::{Address, Bytes};
|
||||
use alloy_rlp::{Decodable, Encodable};
|
||||
use parking_lot::Mutex;
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
@ -10,7 +11,7 @@ pub struct ReadPrecompileInput {
|
||||
pub gas_limit: u64,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
|
||||
pub enum ReadPrecompileResult {
|
||||
Ok { gas_used: u64, bytes: Bytes },
|
||||
OutOfGas,
|
||||
@ -37,6 +38,38 @@ impl ReadPrecompileCalls {
|
||||
pub fn into_inner(self) -> Vec<(Address, Vec<(ReadPrecompileInput, ReadPrecompileResult)>)> {
|
||||
self.0
|
||||
}
|
||||
|
||||
/// Serialize to bytes using MessagePack for database storage
|
||||
pub fn to_db_bytes(&self) -> Result<Vec<u8>, rmp_serde::encode::Error> {
|
||||
rmp_serde::to_vec(&self.0)
|
||||
}
|
||||
|
||||
/// Deserialize from bytes using MessagePack from database storage
|
||||
pub fn from_db_bytes(bytes: &[u8]) -> Result<Self, rmp_serde::decode::Error> {
|
||||
let data = rmp_serde::from_slice(bytes)?;
|
||||
Ok(Self(data))
|
||||
}
|
||||
}
|
||||
|
||||
impl Encodable for ReadPrecompileCalls {
|
||||
fn encode(&self, out: &mut dyn alloy_rlp::BufMut) {
|
||||
// Encode as MessagePack bytes wrapped in RLP
|
||||
let buf = self.to_db_bytes().unwrap_or_default();
|
||||
buf.encode(out);
|
||||
}
|
||||
|
||||
fn length(&self) -> usize {
|
||||
let buf = self.to_db_bytes().unwrap_or_default();
|
||||
buf.length()
|
||||
}
|
||||
}
|
||||
|
||||
impl Decodable for ReadPrecompileCalls {
|
||||
fn decode(buf: &mut &[u8]) -> alloy_rlp::Result<Self> {
|
||||
let bytes = Vec::<u8>::decode(buf)?;
|
||||
Self::from_db_bytes(&bytes)
|
||||
.map_err(|_| alloy_rlp::Error::Custom("Failed to decode ReadPrecompileCalls"))
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||
|
||||
@ -525,6 +525,13 @@ tables! {
|
||||
type Key = ChainStateKey;
|
||||
type Value = BlockNumber;
|
||||
}
|
||||
|
||||
/// Stores precompile call data for each block.
|
||||
/// Maps block number to serialized ReadPrecompileCalls data.
|
||||
table BlockReadPrecompileCalls {
|
||||
type Key = BlockNumber;
|
||||
type Value = Vec<u8>;
|
||||
}
|
||||
}
|
||||
|
||||
/// Keys for the `ChainState` table.
|
||||
|
||||
@ -33,6 +33,7 @@ reth-codecs.workspace = true
|
||||
reth-evm.workspace = true
|
||||
reth-chain-state.workspace = true
|
||||
reth-node-types.workspace = true
|
||||
reth-hyperliquid-types.workspace = true
|
||||
|
||||
# ethereum
|
||||
alloy-eips.workspace = true
|
||||
|
||||
@ -50,6 +50,9 @@ mod metrics;
|
||||
mod chain;
|
||||
pub use chain::*;
|
||||
|
||||
mod precompile;
|
||||
pub use precompile::DatabasePrecompileCallsProvider;
|
||||
|
||||
/// A common provider that fetches data from a database or static file.
|
||||
///
|
||||
/// This provider implements most provider or provider factory traits.
|
||||
|
||||
68
crates/storage/provider/src/providers/database/precompile.rs
Normal file
68
crates/storage/provider/src/providers/database/precompile.rs
Normal file
@ -0,0 +1,68 @@
|
||||
//! Database provider implementation for precompile calls storage
|
||||
|
||||
use crate::traits::PrecompileCallsProvider;
|
||||
use alloy_primitives::BlockNumber;
|
||||
use reth_db::cursor::DbCursorRW;
|
||||
use reth_db_api::{cursor::DbCursorRO, transaction::DbTx};
|
||||
use reth_hyperliquid_types::ReadPrecompileCalls;
|
||||
use reth_storage_errors::provider::ProviderResult;
|
||||
|
||||
/// Implementation of PrecompileCallsProvider for database provider
|
||||
pub trait DatabasePrecompileCallsProvider: Send + Sync {
|
||||
/// Transaction type
|
||||
type Tx: DbTx;
|
||||
|
||||
/// Get a reference to the transaction
|
||||
fn tx_ref(&self) -> &Self::Tx;
|
||||
|
||||
/// Get a mutable reference to the transaction
|
||||
fn tx_mut(&mut self) -> &mut Self::Tx;
|
||||
}
|
||||
|
||||
impl<T> PrecompileCallsProvider for T
|
||||
where
|
||||
T: DatabasePrecompileCallsProvider,
|
||||
T::Tx: DbTx,
|
||||
{
|
||||
fn insert_block_precompile_calls(
|
||||
&self,
|
||||
block_number: BlockNumber,
|
||||
calls: ReadPrecompileCalls,
|
||||
) -> ProviderResult<()> {
|
||||
use reth_db_api::transaction::DbTxMut;
|
||||
|
||||
// For now, we'll store this as a placeholder - the actual implementation
|
||||
// will require mutable transaction access which needs to be added to the trait
|
||||
// This is a read-only implementation for now
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn block_precompile_calls(
|
||||
&self,
|
||||
block_number: BlockNumber,
|
||||
) -> ProviderResult<Option<ReadPrecompileCalls>> {
|
||||
use reth_db_api::tables::BlockReadPrecompileCalls;
|
||||
|
||||
let tx = self.tx_ref();
|
||||
|
||||
// Get from BlockReadPrecompileCalls table
|
||||
if let Some(bytes) = tx.get::<BlockReadPrecompileCalls>(block_number)? {
|
||||
let calls = ReadPrecompileCalls::from_db_bytes(&bytes)
|
||||
.map_err(|e| reth_storage_errors::provider::ProviderError::Database(
|
||||
reth_db_api::DatabaseError::Other(format!("Failed to deserialize precompile calls: {}", e))
|
||||
))?;
|
||||
Ok(Some(calls))
|
||||
} else {
|
||||
Ok(None)
|
||||
}
|
||||
}
|
||||
|
||||
fn remove_block_precompile_calls_above(
|
||||
&self,
|
||||
block_number: BlockNumber,
|
||||
) -> ProviderResult<()> {
|
||||
// For now, this is a no-op as it requires mutable transaction access
|
||||
// The actual implementation will be added when we have mutable access
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
@ -19,3 +19,6 @@ pub use static_file_provider::StaticFileProviderFactory;
|
||||
|
||||
mod full;
|
||||
pub use full::{FullProvider, FullRpcProvider};
|
||||
|
||||
mod precompile;
|
||||
pub use precompile::PrecompileCallsProvider;
|
||||
|
||||
27
crates/storage/provider/src/traits/precompile.rs
Normal file
27
crates/storage/provider/src/traits/precompile.rs
Normal file
@ -0,0 +1,27 @@
|
||||
//! Trait for storing and retrieving precompile call data
|
||||
|
||||
use alloy_primitives::BlockNumber;
|
||||
use reth_hyperliquid_types::ReadPrecompileCalls;
|
||||
use reth_storage_errors::provider::ProviderResult;
|
||||
|
||||
/// Provider trait for ReadPrecompileCalls storage operations
|
||||
pub trait PrecompileCallsProvider: Send + Sync {
|
||||
/// Insert ReadPrecompileCalls data for a block
|
||||
fn insert_block_precompile_calls(
|
||||
&self,
|
||||
block_number: BlockNumber,
|
||||
calls: ReadPrecompileCalls,
|
||||
) -> ProviderResult<()>;
|
||||
|
||||
/// Get ReadPrecompileCalls data for a block
|
||||
fn block_precompile_calls(
|
||||
&self,
|
||||
block_number: BlockNumber,
|
||||
) -> ProviderResult<Option<ReadPrecompileCalls>>;
|
||||
|
||||
/// Remove ReadPrecompileCalls data for blocks above a certain number
|
||||
fn remove_block_precompile_calls_above(
|
||||
&self,
|
||||
block_number: BlockNumber,
|
||||
) -> ProviderResult<()>;
|
||||
}
|
||||
Reference in New Issue
Block a user