Skip to content

Commit 253a4b5

Browse files
committed
Dedup wasm/non-wasm code in proofs/verifiers.rs
Just use `async` methods everywhere, and poll manually the future in non-wasm context
1 parent 4522f26 commit 253a4b5

File tree

3 files changed

+65
-115
lines changed

3 files changed

+65
-115
lines changed

ledger/src/proofs/verifiers.rs

Lines changed: 52 additions & 112 deletions
Original file line numberDiff line numberDiff line change
@@ -68,44 +68,28 @@ fn cache_path(kind: Kind) -> Option<PathBuf> {
6868
super::circuit_blobs::home_base_dir().map(|p| p.join(cache_filename(kind)))
6969
}
7070

71-
macro_rules! read_cache {
72-
($kind: expr, $digest: expr) => {{
73-
#[cfg(not(target_family = "wasm"))]
74-
let data = super::circuit_blobs::fetch(&cache_filename($kind))
75-
.context("fetching verifier index failed")?;
76-
#[cfg(target_family = "wasm")]
77-
let data = super::circuit_blobs::fetch(&cache_filename($kind))
78-
.await
79-
.context("fetching verifier index failed")?;
80-
let mut slice = data.as_slice();
81-
let mut d = [0; 32];
82-
// source digest
83-
slice.read_exact(&mut d).context("reading source digest")?;
84-
if d != $digest {
85-
anyhow::bail!("source digest verification failed");
86-
}
87-
88-
// index digest
89-
slice.read_exact(&mut d).context("reading index digest")?;
90-
91-
let mut hasher = Sha256::new();
92-
hasher.update(slice);
93-
let digest = hasher.finalize();
94-
if d != digest.as_slice() {
95-
anyhow::bail!("verifier index digest verification failed");
96-
}
97-
Ok(super::caching::verifier_index_from_bytes(slice)?)
98-
}};
99-
}
71+
async fn read_cache(kind: Kind, digest: &[u8]) -> anyhow::Result<VerifierIndex<Fq>> {
72+
let data = super::circuit_blobs::fetch(&cache_filename(kind))
73+
.await
74+
.context("fetching verifier index failed")?;
75+
let mut slice = data.as_slice();
76+
let mut d = [0; 32];
77+
// source digest
78+
slice.read_exact(&mut d).context("reading source digest")?;
79+
if d != digest {
80+
anyhow::bail!("source digest verification failed");
81+
}
10082

101-
#[cfg(not(target_family = "wasm"))]
102-
fn read_cache(kind: Kind, digest: &[u8]) -> anyhow::Result<VerifierIndex<Fq>> {
103-
read_cache!(kind, digest)
104-
}
83+
// index digest
84+
slice.read_exact(&mut d).context("reading index digest")?;
10585

106-
#[cfg(target_family = "wasm")]
107-
async fn read_cache(kind: Kind, digest: &[u8]) -> anyhow::Result<VerifierIndex<Fq>> {
108-
read_cache!(kind, digest)
86+
let mut hasher = Sha256::new();
87+
hasher.update(slice);
88+
let digest = hasher.finalize();
89+
if d != digest.as_slice() {
90+
anyhow::bail!("verifier index digest verification failed");
91+
}
92+
Ok(super::caching::verifier_index_from_bytes(slice)?)
10993
}
11094

11195
#[cfg(not(target_family = "wasm"))]
@@ -130,46 +114,31 @@ fn write_cache(kind: Kind, index: &VerifierIndex<Fq>, digest: &[u8]) -> anyhow::
130114
Ok(())
131115
}
132116

133-
macro_rules! make_with_ext_cache {
134-
($kind: expr, $data: expr) => {{
135-
let verifier_index: VerifierIndex<Fq> = serde_json::from_str($data).unwrap();
136-
let mut hasher = Sha256::new();
137-
hasher.update($data);
138-
let src_index_digest = hasher.finalize();
139-
140-
#[cfg(not(target_family = "wasm"))]
141-
let cache = read_cache($kind, &src_index_digest);
142-
#[cfg(target_family = "wasm")]
143-
let cache = read_cache($kind, &src_index_digest).await;
144-
145-
match cache {
146-
Ok(verifier_index) => {
147-
info!(system_time(); "Verifier index is loaded");
148-
verifier_index
149-
}
150-
Err(err) => {
151-
warn!(system_time(); "Cannot load verifier index: {err}");
152-
let index = make_verifier_index(verifier_index);
153-
#[cfg(not(target_family = "wasm"))]
154-
if let Err(err) = write_cache($kind, &index, &src_index_digest) {
155-
warn!(system_time(); "Cannot store verifier index to cache file: {err}");
156-
} else {
157-
info!(system_time(); "Stored verifier index to cache file");
158-
}
159-
index
160-
}
161-
}
162-
}}
163-
}
117+
async fn make_with_ext_cache(kind: Kind, data: &str) -> VerifierIndex<Fq> {
118+
let verifier_index: VerifierIndex<Fq> = serde_json::from_str(data).unwrap();
119+
let mut hasher = Sha256::new();
120+
hasher.update(data);
121+
let src_index_digest = hasher.finalize();
164122

165-
#[cfg(not(target_family = "wasm"))]
166-
fn make_with_ext_cache(kind: Kind, data: &str) -> VerifierIndex<Fq> {
167-
make_with_ext_cache!(kind, data)
168-
}
123+
let cache = read_cache(kind, &src_index_digest).await;
169124

170-
#[cfg(target_family = "wasm")]
171-
async fn make_with_ext_cache(kind: Kind, data: &str) -> VerifierIndex<Fq> {
172-
make_with_ext_cache!(kind, data)
125+
match cache {
126+
Ok(verifier_index) => {
127+
info!(system_time(); "Verifier index is loaded");
128+
verifier_index
129+
}
130+
Err(err) => {
131+
warn!(system_time(); "Cannot load verifier index: {err}");
132+
let index = make_verifier_index(verifier_index);
133+
#[cfg(not(target_family = "wasm"))]
134+
if let Err(err) = write_cache(kind, &index, &src_index_digest) {
135+
warn!(system_time(); "Cannot store verifier index to cache file: {err}");
136+
} else {
137+
info!(system_time(); "Stored verifier index to cache file");
138+
}
139+
index
140+
}
141+
}
173142
}
174143

175144
#[derive(Serialize, Deserialize, Debug, Clone)]
@@ -215,23 +184,8 @@ impl TransactionVerifier {
215184
}
216185
}
217186

218-
#[cfg(not(target_family = "wasm"))]
219-
impl BlockVerifier {
220-
pub fn make() -> Self {
221-
BLOCK_VERIFIER
222-
.get_or_init(|| {
223-
Self(Arc::new(make_with_ext_cache(
224-
Self::kind(),
225-
Self::src_json(),
226-
)))
227-
})
228-
.clone()
229-
}
230-
}
231-
232-
#[cfg(target_family = "wasm")]
233187
impl BlockVerifier {
234-
async fn make_impl() -> Self {
188+
pub async fn make_async() -> Self {
235189
if let Some(v) = BLOCK_VERIFIER.get() {
236190
v.clone()
237191
} else {
@@ -242,33 +196,14 @@ impl BlockVerifier {
242196
}
243197
}
244198

245-
#[cfg(not(test))]
246-
pub async fn make() -> Self {
247-
Self::make_impl().await
248-
}
249-
#[cfg(test)]
250-
pub fn make() -> Self {
251-
tokio::runtime::Handle::current().block_on(async { Self::make_impl().await })
252-
}
253-
}
254-
255-
#[cfg(not(target_family = "wasm"))]
256-
impl TransactionVerifier {
199+
#[cfg(not(target_family = "wasm"))]
257200
pub fn make() -> Self {
258-
TX_VERIFIER
259-
.get_or_init(|| {
260-
Self(Arc::new(make_with_ext_cache(
261-
Self::kind(),
262-
Self::src_json(),
263-
)))
264-
})
265-
.clone()
201+
super::provers::block_on(Self::make_async())
266202
}
267203
}
268204

269-
#[cfg(target_family = "wasm")]
270205
impl TransactionVerifier {
271-
pub async fn make() -> Self {
206+
pub async fn make_async() -> Self {
272207
if let Some(v) = TX_VERIFIER.get() {
273208
v.clone()
274209
} else {
@@ -278,6 +213,11 @@ impl TransactionVerifier {
278213
TX_VERIFIER.get_or_init(move || verifier).clone()
279214
}
280215
}
216+
217+
#[cfg(not(target_family = "wasm"))]
218+
pub fn make() -> Self {
219+
super::provers::block_on(Self::make_async())
220+
}
281221
}
282222

283223
impl std::ops::Deref for BlockVerifier {

ledger/src/staged_ledger/staged_ledger.rs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5945,6 +5945,15 @@ mod tests {
59455945
assert_eq!(reference, serde_json::to_string(&hash).unwrap());
59465946
}
59475947

5948+
#[cfg(not(target_family = "wasm"))]
5949+
fn verifier_wrapper<F: std::future::Future>(future: F) -> F::Output {
5950+
crate::proofs::provers::block_on(future)
5951+
}
5952+
#[cfg(target_family = "wasm")]
5953+
fn verifier_wrapper<F: std::future::Future>(future: F) -> F::Output {
5954+
futures::executor::block_on(future)
5955+
}
5956+
59485957
#[test]
59495958
fn apply_berkeleynet() {
59505959
#[allow(unused)]
@@ -6009,7 +6018,8 @@ mod tests {
60096018
pending_coinbase_collection: pending_coinbase,
60106019
};
60116020

6012-
let block_verifier = crate::proofs::verifiers::BlockVerifier::make();
6021+
let block_verifier =
6022+
verifier_wrapper(crate::proofs::verifiers::BlockVerifier::make_async());
60136023

60146024
println!("initialized in {:?}", now.elapsed());
60156025

node/web/src/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,8 @@ pub async fn run(block_producer: Option<String>) -> RpcSender {
5454
async fn setup_node(
5555
block_producer: Option<AccountSecretKey>,
5656
) -> openmina_node_common::Node<NodeService> {
57-
let block_verifier_index = BlockVerifier::make().await;
58-
let work_verifier_index = TransactionVerifier::make().await;
57+
let block_verifier_index = BlockVerifier::make_async().await;
58+
let work_verifier_index = TransactionVerifier::make_async().await;
5959

6060
let genesis_config = ::node::config::DEVNET_CONFIG.clone();
6161
let mut node_builder: NodeBuilder = NodeBuilder::new(None, genesis_config);

0 commit comments

Comments
 (0)