Skip to content

Commit e31dab3

Browse files
authored
feat: add secp256k1 ecrecover precompile (#1078)
patch crate: https://github.com/scroll-tech/elliptic-curves/tree/ceno/k256-13.4 test_secp256k1_ecrecover, runs 5 ecrecover: - with precompile: 3845214 steps - without: 65928672 steps
1 parent 21708bf commit e31dab3

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+1401
-91
lines changed

Cargo.lock

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

Cargo.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ members = [
44
"ceno_emul",
55
"ceno_host",
66
"ceno_rt",
7+
"ceno_syscall",
78
"ceno_zkvm",
89
"derive",
910
"examples-builder",
@@ -40,7 +41,7 @@ cfg-if = "1.0"
4041
clap = { version = "4.5", features = ["derive"] }
4142
criterion = { version = "0.5", features = ["html_reports"] }
4243
either = { version = "1.15.*", features = ["serde"] }
43-
generic-array = { version = "*", features = ["alloc", "serde"] }
44+
generic-array = { version = "1.2", features = ["alloc", "serde"] }
4445
itertools = "0.13"
4546
ndarray = "*"
4647
num-derive = "0.4"

ceno_emul/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ version.workspace = true
1212
[dependencies]
1313
anyhow.workspace = true
1414
ceno_rt = { path = "../ceno_rt" }
15+
ceno_syscall = { path = "../ceno_syscall" }
1516
elf = "0.7"
1617
ff_ext.workspace = true
1718
itertools.workspace = true

ceno_emul/src/syscalls.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ pub mod sha256;
99
// Using the same function codes as sp1:
1010
// https://github.com/succinctlabs/sp1/blob/013c24ea2fa15a0e7ed94f7d11a7ada4baa39ab9/crates/core/executor/src/syscalls/code.rs
1111

12-
pub use ceno_rt::syscalls::{
12+
pub use ceno_syscall::{
1313
BLS12381_ADD, BLS12381_DECOMPRESS, BLS12381_DOUBLE, BN254_ADD, BN254_DOUBLE, BN254_FP_ADD,
1414
BN254_FP_MUL, BN254_FP2_ADD, BN254_FP2_MUL, KECCAK_PERMUTE, SECP256K1_ADD,
1515
SECP256K1_DECOMPRESS, SECP256K1_DOUBLE, SECP256R1_ADD, SECP256R1_DECOMPRESS, SECP256R1_DOUBLE,

ceno_emul/src/syscalls/bn254/bn254_curve.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ impl SyscallSpec for Bn254AddSpec {
1313

1414
const REG_OPS_COUNT: usize = 2;
1515
const MEM_OPS_COUNT: usize = 2 * BN254_POINT_WORDS;
16-
const CODE: u32 = ceno_rt::syscalls::BN254_ADD;
16+
const CODE: u32 = ceno_syscall::BN254_ADD;
1717
}
1818

1919
pub struct Bn254DoubleSpec;
@@ -22,7 +22,7 @@ impl SyscallSpec for Bn254DoubleSpec {
2222

2323
const REG_OPS_COUNT: usize = 2;
2424
const MEM_OPS_COUNT: usize = BN254_POINT_WORDS;
25-
const CODE: u32 = ceno_rt::syscalls::BN254_DOUBLE;
25+
const CODE: u32 = ceno_syscall::BN254_DOUBLE;
2626
}
2727

2828
pub fn bn254_add(vm: &VMState) -> SyscallEffects {

ceno_emul/src/syscalls/bn254/bn254_fptower.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ impl SyscallSpec for Bn254FpAddSpec {
1717

1818
const REG_OPS_COUNT: usize = 2;
1919
const MEM_OPS_COUNT: usize = 2 * BN254_FP_WORDS;
20-
const CODE: u32 = ceno_rt::syscalls::BN254_FP_ADD;
20+
const CODE: u32 = ceno_syscall::BN254_FP_ADD;
2121
}
2222

2323
pub struct Bn254Fp2AddSpec;
@@ -26,7 +26,7 @@ impl SyscallSpec for Bn254Fp2AddSpec {
2626

2727
const REG_OPS_COUNT: usize = 2;
2828
const MEM_OPS_COUNT: usize = 2 * BN254_FP2_WORDS;
29-
const CODE: u32 = ceno_rt::syscalls::BN254_FP2_ADD;
29+
const CODE: u32 = ceno_syscall::BN254_FP2_ADD;
3030
}
3131

3232
pub struct Bn254FpMulSpec;
@@ -35,7 +35,7 @@ impl SyscallSpec for Bn254FpMulSpec {
3535

3636
const REG_OPS_COUNT: usize = 2;
3737
const MEM_OPS_COUNT: usize = 2 * BN254_FP_WORDS;
38-
const CODE: u32 = ceno_rt::syscalls::BN254_FP_MUL;
38+
const CODE: u32 = ceno_syscall::BN254_FP_MUL;
3939
}
4040

4141
pub struct Bn254Fp2MulSpec;
@@ -44,7 +44,7 @@ impl SyscallSpec for Bn254Fp2MulSpec {
4444

4545
const REG_OPS_COUNT: usize = 2;
4646
const MEM_OPS_COUNT: usize = 2 * BN254_FP2_WORDS;
47-
const CODE: u32 = ceno_rt::syscalls::BN254_FP2_MUL;
47+
const CODE: u32 = ceno_syscall::BN254_FP2_MUL;
4848
}
4949

5050
fn bn254_fptower_binary_op<

ceno_emul/src/syscalls/keccak_permute.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ impl SyscallSpec for KeccakSpec {
1515

1616
const REG_OPS_COUNT: usize = 1;
1717
const MEM_OPS_COUNT: usize = KECCAK_WORDS;
18-
const CODE: u32 = ceno_rt::syscalls::KECCAK_PERMUTE;
18+
const CODE: u32 = ceno_syscall::KECCAK_PERMUTE;
1919
const HAS_LOOKUPS: bool = true;
2020
}
2121

ceno_emul/src/syscalls/secp256k1.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,23 +14,23 @@ impl SyscallSpec for Secp256k1AddSpec {
1414

1515
const REG_OPS_COUNT: usize = 2;
1616
const MEM_OPS_COUNT: usize = 2 * SECP256K1_ARG_WORDS;
17-
const CODE: u32 = ceno_rt::syscalls::SECP256K1_ADD;
17+
const CODE: u32 = ceno_syscall::SECP256K1_ADD;
1818
}
1919

2020
impl SyscallSpec for Secp256k1DoubleSpec {
2121
const NAME: &'static str = "SECP256K1_DOUBLE";
2222

2323
const REG_OPS_COUNT: usize = 2;
2424
const MEM_OPS_COUNT: usize = SECP256K1_ARG_WORDS;
25-
const CODE: u32 = ceno_rt::syscalls::SECP256K1_DOUBLE;
25+
const CODE: u32 = ceno_syscall::SECP256K1_DOUBLE;
2626
}
2727

2828
impl SyscallSpec for Secp256k1DecompressSpec {
2929
const NAME: &'static str = "SECP256K1_DECOMPRESS";
3030

3131
const REG_OPS_COUNT: usize = 2;
3232
const MEM_OPS_COUNT: usize = 2 * COORDINATE_WORDS;
33-
const CODE: u32 = ceno_rt::syscalls::SECP256K1_DECOMPRESS;
33+
const CODE: u32 = ceno_syscall::SECP256K1_DECOMPRESS;
3434
}
3535

3636
// A secp256k1 point in uncompressed form takes 64 bytes

ceno_emul/src/syscalls/sha256.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ impl SyscallSpec for Sha256ExtendSpec {
1111

1212
const REG_OPS_COUNT: usize = 2;
1313
const MEM_OPS_COUNT: usize = SHA_EXTEND_WORDS;
14-
const CODE: u32 = ceno_rt::syscalls::SHA_EXTEND;
14+
const CODE: u32 = ceno_syscall::SHA_EXTEND;
1515
}
1616

1717
/// Wrapper type for the sha_extend argument that implements conversions

ceno_host/tests/test_elf.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -438,6 +438,18 @@ fn test_secp256k1_decompress() -> Result<()> {
438438
Ok(())
439439
}
440440

441+
#[test]
442+
fn test_secp256k1_ecrecover() -> Result<()> {
443+
let _ = ceno_host::run(
444+
CENO_PLATFORM,
445+
ceno_examples::secp256k1_ecrecover,
446+
&CenoStdin::default(),
447+
None,
448+
);
449+
450+
Ok(())
451+
}
452+
441453
#[test]
442454
fn test_sha256_extend() -> Result<()> {
443455
let program_elf = ceno_examples::sha_extend_syscall;

0 commit comments

Comments
 (0)