Skip to content

Commit da62c9b

Browse files
authored
chore(client + ci): precompile annotation checks (#390)
* chore: kzg_eval precompile * feat: bump to revm_precompile 0.16.1 * wip * chore: precompile * works * add * addgs * ci.yaml * remove unnecessary tests * ci * add * range elf * add
1 parent c29d4d6 commit da62c9b

File tree

9 files changed

+95
-150
lines changed

9 files changed

+95
-150
lines changed

.github/workflows/ci.yaml

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
name: Cargo Tests
2+
3+
on:
4+
pull_request:
5+
branches:
6+
- main
7+
push:
8+
branches:
9+
- main
10+
11+
jobs:
12+
tests:
13+
runs-on:
14+
- runs-on
15+
- runner=64cpu-linux-x64
16+
- run-id=${{ github.run_id }}
17+
steps:
18+
- name: Checkout code
19+
uses: actions/checkout@v4
20+
- run: rustup toolchain install stable --profile minimal
21+
- uses: Swatinem/rust-cache@v2
22+
- name: Check
23+
run: cargo check --release
24+
- name: Build
25+
run: cargo build --release
26+
- name: Test
27+
run: cargo test --release
28+
env:
29+
L2_NODE_RPC: ${{ secrets.L2_NODE_RPC }}
30+
L1_RPC: ${{ secrets.L1_RPC }}
31+
L1_BEACON_RPC: ${{ secrets.L1_BEACON_RPC }}
32+
L2_RPC: ${{ secrets.L2_RPC }}
33+
REPO_OWNER: ${{ github.repository_owner }}
34+
REPO_NAME: ${{ github.event.repository.name }}
35+
PR_NUMBER: ${{ github.event.pull_request.number }}
36+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
37+
POST_TO_GITHUB: ${{ github.event_name == 'pull_request' }}

.github/workflows/compile.yaml

Lines changed: 0 additions & 24 deletions
This file was deleted.

.github/workflows/integration-tests.yml

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -22,25 +22,11 @@ jobs:
2222
- name: Setup CI
2323
uses: ./.github/actions/setup
2424

25-
- name: OP Sepolia cost estimator on recent block range
25+
- name: Run cost estimator on recent block range
2626
run: |
2727
RUST_LOG=info cargo run --bin cost-estimator --release -- --rolling
2828
env:
2929
L2_NODE_RPC: ${{ secrets.L2_NODE_RPC }}
3030
L1_RPC: ${{ secrets.L1_RPC }}
3131
L1_BEACON_RPC: ${{ secrets.L1_BEACON_RPC }}
3232
L2_RPC: ${{ secrets.L2_RPC }}
33-
34-
- name: Run multi script
35-
run: |
36-
cargo test --test "multi" --release
37-
env:
38-
L2_NODE_RPC: ${{ secrets.L2_NODE_RPC }}
39-
L1_RPC: ${{ secrets.L1_RPC }}
40-
L1_BEACON_RPC: ${{ secrets.L1_BEACON_RPC }}
41-
L2_RPC: ${{ secrets.L2_RPC }}
42-
REPO_OWNER: ${{ github.repository_owner }}
43-
REPO_NAME: ${{ github.event.repository.name }}
44-
PR_NUMBER: ${{ github.event.pull_request.number }}
45-
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
46-
POST_TO_GITHUB: ${{ github.event_name == 'pull_request' }}

Cargo.lock

Lines changed: 13 additions & 13 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ maili-registry = { version = "0.2.6", default-features = false }
102102
maili-genesis = { version = "0.2.6", default-features = false }
103103

104104
# Revm
105-
revm = { version = "19.4.0", default-features = false, features = ["kzg-rs"] }
105+
revm = { version = "19.5.0", default-features = false, features = ["kzg-rs"] }
106106

107107
# SP1
108108
sp1-lib = { version = "4.1.0", features = ["verify"] }

elf/aggregation-elf

-80 Bytes
Binary file not shown.

elf/range-elf

19.6 KB
Binary file not shown.

utils/client/src/precompiles/mod.rs

Lines changed: 43 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -35,20 +35,30 @@ macro_rules! create_annotated_precompile {
3535
};
3636
}
3737

38-
pub(crate) const ANNOTATED_BN_ADD: PrecompileWithAddress =
39-
create_annotated_precompile!(bn128::add::ISTANBUL, "bn-add");
40-
pub(crate) const ANNOTATED_BN_MUL: PrecompileWithAddress =
41-
create_annotated_precompile!(bn128::mul::ISTANBUL, "bn-mul");
42-
pub(crate) const ANNOTATED_BN_PAIR: PrecompileWithAddress =
43-
create_annotated_precompile!(bn128::pair::ISTANBUL, "bn-pair");
44-
pub(crate) const ANNOTATED_KZG_EVAL: PrecompileWithAddress = create_annotated_precompile!(
45-
revm::precompile::kzg_point_evaluation::POINT_EVALUATION,
46-
"kzg-eval"
47-
);
48-
pub(crate) const ANNOTATED_EC_RECOVER: PrecompileWithAddress =
49-
create_annotated_precompile!(revm::precompile::secp256k1::ECRECOVER, "ec-recover");
50-
pub(crate) const ANNOTATED_P256_VERIFY: PrecompileWithAddress =
51-
create_annotated_precompile!(revm::precompile::secp256r1::P256VERIFY, "p256-verify");
38+
/// Tuples of the original and annotated precompiles.
39+
// TODO: Add kzg_point_evaluation once it has standard precompile support in revm-precompile 0.17.0.
40+
const PRECOMPILES: &[(PrecompileWithAddress, PrecompileWithAddress)] = &[
41+
(
42+
bn128::add::ISTANBUL,
43+
create_annotated_precompile!(bn128::add::ISTANBUL, "bn-add"),
44+
),
45+
(
46+
bn128::mul::ISTANBUL,
47+
create_annotated_precompile!(bn128::mul::ISTANBUL, "bn-mul"),
48+
),
49+
(
50+
bn128::pair::ISTANBUL,
51+
create_annotated_precompile!(bn128::pair::ISTANBUL, "bn-pair"),
52+
),
53+
(
54+
revm::precompile::secp256k1::ECRECOVER,
55+
create_annotated_precompile!(revm::precompile::secp256k1::ECRECOVER, "ec-recover"),
56+
),
57+
(
58+
revm::precompile::secp256r1::P256VERIFY,
59+
create_annotated_precompile!(revm::precompile::secp256r1::P256VERIFY, "p256-verify"),
60+
),
61+
];
5262

5363
// Source: https://github.com/anton-rs/kona/blob/main/bin/client/src/fault/handler/mod.rs#L20-L42
5464
pub fn zkvm_handle_register<F, H>(handler: &mut EvmHandler<'_, (), &mut State<&mut TrieDB<F, H>>>)
@@ -62,19 +72,25 @@ where
6272
let mut ctx_precompiles = spec_to_generic!(spec_id, {
6373
revm::optimism::load_precompiles::<SPEC, (), &mut State<&mut TrieDB<F, H>>>()
6474
});
65-
66-
// Extend with ZKVM-accelerated precompiles and annotated precompiles that track the
67-
// cycle count.
68-
let override_precompiles = [
69-
ANNOTATED_BN_ADD,
70-
ANNOTATED_BN_MUL,
71-
ANNOTATED_BN_PAIR,
72-
ANNOTATED_KZG_EVAL,
73-
ANNOTATED_EC_RECOVER,
74-
ANNOTATED_P256_VERIFY,
75-
];
76-
ctx_precompiles.extend(override_precompiles);
77-
75+
// Add the annotated precompiles.
76+
ctx_precompiles.extend(PRECOMPILES.iter().map(|p| p.1.clone()).take(1));
7877
ctx_precompiles
7978
});
8079
}
80+
81+
#[cfg(test)]
82+
mod tests {
83+
use super::*;
84+
85+
#[test]
86+
fn test_precompile_standard() {
87+
// Check each precompile which was annotated is a standard precompile.
88+
for precompile in PRECOMPILES {
89+
assert!(
90+
matches!(precompile.0 .1, Precompile::Standard(_)),
91+
"{:?} is not a standard precompile",
92+
precompile.0
93+
);
94+
}
95+
}
96+
}

utils/host/src/fetcher.rs

Lines changed: 0 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -994,73 +994,3 @@ impl OPSuccinctDataFetcher {
994994
}
995995
}
996996
}
997-
998-
#[cfg(test)]
999-
mod tests {
1000-
use crate::fetcher::OPSuccinctDataFetcher;
1001-
use crate::fetcher::RunContext;
1002-
1003-
#[tokio::test]
1004-
#[cfg(test)]
1005-
async fn test_get_l1_head() {
1006-
use alloy_eips::BlockId;
1007-
1008-
dotenv::dotenv().ok();
1009-
let fetcher = OPSuccinctDataFetcher::new_with_rollup_config(RunContext::Dev)
1010-
.await
1011-
.unwrap();
1012-
let latest_l2_block = fetcher.get_l2_header(BlockId::latest()).await.unwrap();
1013-
1014-
// Get the L2 block number from 1 hour ago.
1015-
let l2_end_block = latest_l2_block.number
1016-
- ((60 * 60) / fetcher.rollup_config.as_ref().unwrap().block_time);
1017-
1018-
let _ = fetcher.get_l1_head(l2_end_block).await.unwrap();
1019-
}
1020-
1021-
#[tokio::test]
1022-
#[cfg(test)]
1023-
async fn test_l2_safe_head_progression() {
1024-
use alloy_eips::BlockId;
1025-
use futures::StreamExt;
1026-
use maili_rpc::SafeHeadResponse;
1027-
1028-
use crate::fetcher::RPCMode;
1029-
1030-
dotenv::dotenv().ok();
1031-
let fetcher = OPSuccinctDataFetcher::new(RunContext::Dev);
1032-
let mut l2_safe_heads = Vec::new();
1033-
1034-
let latest_l1_block = fetcher.get_l1_header(BlockId::latest()).await.unwrap();
1035-
let latest_l1_block_number = latest_l1_block.number;
1036-
let l1_block_number_hex = format!("0x{:x}", latest_l1_block_number);
1037-
let _ = fetcher
1038-
.fetch_rpc_data_with_mode::<SafeHeadResponse>(
1039-
RPCMode::L2Node,
1040-
"optimism_safeHeadAtL1Block",
1041-
vec![l1_block_number_hex.into()],
1042-
)
1043-
.await
1044-
.unwrap();
1045-
1046-
let latest_l2_block = fetcher.get_l2_header(BlockId::latest()).await.unwrap();
1047-
1048-
let safe_heads =
1049-
futures::stream::iter(latest_l2_block.number - 500..=latest_l2_block.number)
1050-
.map(|block_num| {
1051-
let l1_block_number_hex = format!("0x{:x}", block_num);
1052-
fetcher.fetch_rpc_data_with_mode::<SafeHeadResponse>(
1053-
RPCMode::L2Node,
1054-
"optimism_safeHeadAtL1Block",
1055-
vec![l1_block_number_hex.into()],
1056-
)
1057-
})
1058-
.buffered(100)
1059-
.collect::<Vec<_>>()
1060-
.await;
1061-
1062-
for result in safe_heads.into_iter().flatten() {
1063-
l2_safe_heads.push(result.safe_head.number);
1064-
}
1065-
}
1066-
}

0 commit comments

Comments
 (0)