Skip to content

Commit 18d6fb3

Browse files
author
Adrian Nagy
committed
WIP: archive send precomputed blocks - AWS
1 parent 3f963fd commit 18d6fb3

File tree

8 files changed

+308
-41
lines changed

8 files changed

+308
-41
lines changed

cli/src/commands/node/mod.rs

Lines changed: 45 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ use node::p2p::identity::SecretKey;
1717
use node::service::Recorder;
1818
use node::SnarkerStrategy;
1919

20-
use openmina_node_native::{tracing, NodeBuilder};
20+
use openmina_node_native::{archive::ArchiveStorageOptions, tracing, NodeBuilder};
2121

2222
/// Openmina node
2323
#[derive(Debug, clap::Args)]
@@ -141,6 +141,24 @@ pub struct Node {
141141
/// Enable archive mode (seding blocks to the archive process).
142142
#[arg(long, env)]
143143
pub archive_address: Option<Url>,
144+
145+
/// Enable local precomputed storage.
146+
#[arg(long, env)]
147+
pub archive_local_storage: bool,
148+
149+
// TODO(adonagy): Sort out this... Do we want to support the ocaml options 1:1?
150+
// we could move the addrss to an env var, just like gcp and aws
151+
/// Enable archiver process.
152+
#[arg(long, env)]
153+
pub archive_archiver_process: bool,
154+
155+
/// Enable GCP precomputed storage.
156+
#[arg(long, env)]
157+
pub archive_gcp_storage: bool,
158+
159+
/// Enable AWS precomputed storage.
160+
#[arg(long, env)]
161+
pub archive_aws_storage: bool,
144162
}
145163

146164
impl Node {
@@ -272,6 +290,30 @@ impl Node {
272290
}
273291
}
274292

293+
let archive_storage_options = ArchiveStorageOptions::from_iter(
294+
[
295+
(
296+
self.archive_local_storage,
297+
ArchiveStorageOptions::LOCAL_PRECOMPUTED_STORAGE,
298+
),
299+
(
300+
self.archive_archiver_process,
301+
ArchiveStorageOptions::ARCHIVER_PROCESS,
302+
),
303+
(
304+
self.archive_gcp_storage,
305+
ArchiveStorageOptions::GCP_PRECOMPUTED_STORAGE,
306+
),
307+
(
308+
self.archive_aws_storage,
309+
ArchiveStorageOptions::AWS_PRECOMPUTED_STORAGE,
310+
),
311+
]
312+
.iter()
313+
.filter(|(enabled, _)| *enabled)
314+
.map(|(_, option)| option.clone()),
315+
);
316+
275317
if let Some(address) = self.archive_address {
276318
node::core::info!(
277319
summary = "Archive mode enabled",
@@ -281,7 +323,8 @@ impl Node {
281323
let socket_addrs = address.socket_addrs(|| None).expect("Invalid URL");
282324

283325
let socket_addr = socket_addrs.first().expect("No socket address found");
284-
node_builder.archive(*socket_addr);
326+
// TODO(adonagy): add options
327+
node_builder.archive(*socket_addr, archive_storage_options);
285328
}
286329

287330
if let Some(sec_key) = self.run_snarker {

mina-p2p-messages/src/v2/manual.rs

Lines changed: 56 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -741,23 +741,41 @@ pub enum ArchiveTransitionFronntierDiff {
741741
}
742742

743743
impl ArchiveTransitionFronntierDiff {
744-
pub fn accounts_accessed(&self) -> List<(crate::number::UInt64, MinaBaseAccountBinableArgStableV2)> {
744+
pub fn block(&self) -> Option<MinaBlockBlockStableV2> {
745745
match self {
746-
ArchiveTransitionFronntierDiff::BreadcrumbAdded { accounts_accessed, .. } => accounts_accessed.clone(),
746+
// TODO(adonagy): maybe we should use Arc here instead of cloning
747+
ArchiveTransitionFronntierDiff::BreadcrumbAdded { block, .. } => Some(block.0.clone()),
748+
_ => None,
749+
}
750+
}
751+
752+
pub fn accounts_accessed(
753+
&self,
754+
) -> List<(crate::number::UInt64, MinaBaseAccountBinableArgStableV2)> {
755+
match self {
756+
ArchiveTransitionFronntierDiff::BreadcrumbAdded {
757+
accounts_accessed, ..
758+
} => accounts_accessed.clone(),
747759
_ => List::new(),
748760
}
749761
}
750762

751763
pub fn accounts_created(&self) -> List<(MinaBaseAccountIdStableV2, CurrencyFeeStableV1)> {
752764
match self {
753-
ArchiveTransitionFronntierDiff::BreadcrumbAdded { accounts_created, .. } => accounts_created.clone(),
765+
ArchiveTransitionFronntierDiff::BreadcrumbAdded {
766+
accounts_created, ..
767+
} => accounts_created.clone(),
754768
_ => List::new(),
755769
}
756770
}
757771

758-
pub fn tokens_used(&self) -> List<(MinaBaseTokenIdStableV2, Option<MinaBaseAccountIdStableV2>)> {
772+
pub fn tokens_used(
773+
&self,
774+
) -> List<(MinaBaseTokenIdStableV2, Option<MinaBaseAccountIdStableV2>)> {
759775
match self {
760-
ArchiveTransitionFronntierDiff::BreadcrumbAdded { tokens_used, .. } => tokens_used.clone(),
776+
ArchiveTransitionFronntierDiff::BreadcrumbAdded { tokens_used, .. } => {
777+
tokens_used.clone()
778+
}
761779
_ => List::new(),
762780
}
763781
}
@@ -836,6 +854,39 @@ pub struct PrecomputedBlockData {
836854
pub data: PrecomputedBlock,
837855
}
838856

857+
impl PrecomputedBlock {
858+
pub fn with_version(&self, version: u32) -> PrecomputedBlockData {
859+
PrecomputedBlockData {
860+
version,
861+
data: self.clone(),
862+
}
863+
}
864+
}
865+
866+
impl TryFrom<ArchiveTransitionFronntierDiff> for PrecomputedBlock {
867+
type Error = String;
868+
869+
fn try_from(value: ArchiveTransitionFronntierDiff) -> Result<Self, Self::Error> {
870+
let block = value
871+
.block()
872+
.ok_or("Block not found in archive transition frontier diff")?;
873+
let res = Self {
874+
scheduled_time: block.header.protocol_state.body.blockchain_state.timestamp,
875+
protocol_state: block.header.protocol_state.clone(),
876+
protocol_state_proof: block.header.protocol_state_proof.as_ref().clone().into(),
877+
staged_ledger_diff: block.body.staged_ledger_diff,
878+
// TODO(adonagy): add the actual delta transition chain proof
879+
delta_transition_chain_proof: (LedgerHash::zero(), List::new()),
880+
protocol_version: block.header.current_protocol_version.clone(),
881+
proposed_protocol_version: None,
882+
accounts_accessed: value.accounts_accessed(),
883+
accounts_created: value.accounts_created(),
884+
tokens_used: value.tokens_used(),
885+
};
886+
Ok(res)
887+
}
888+
}
889+
839890
#[cfg(test)]
840891
mod tests {
841892
use std::fmt::Debug;

node/common/Cargo.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ sha3 = "0.10.8"
2121
ark-ff = { workspace = true }
2222
binprot = { git = "https://github.com/openmina/binprot-rs", rev = "400b52c" }
2323
binprot_derive = { git = "https://github.com/openmina/binprot-rs", rev = "400b52c" }
24+
bitflags = "2.8.0"
2425

2526
node = { path = "../../node", features = ["replay"] }
2627
openmina-core = { path = "../../core" }
@@ -41,6 +42,8 @@ tracing-appender = "0.2.3"
4142
libp2p-identity = { version = "=0.2.7", features = ["ed25519", "rand", "serde"] }
4243
mio = { version = "1.0.2", features = ["os-poll", "net"] }
4344
reqwest = { version = "0.12.8", features = ["blocking", "json"] }
45+
aws-config = { version = "1.1.7", features = ["behavior-version-latest"] }
46+
aws-sdk-s3 = "1.73.0"
4447

4548
[features]
4649
p2p-webrtc = ["node/p2p-webrtc"]

0 commit comments

Comments
 (0)