Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add program_segment_size argument to verify_secure_runner & run_from_entrypoint #928

Merged
merged 54 commits into from
Apr 3, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
54 commits
Select commit Hold shift + click to select a range
844d01c
Change instance def ratios to Option
fmoletta Mar 7, 2023
fe06559
Move builtin runner ratios to option
fmoletta Mar 7, 2023
64ce3c6
Modify methods to accomodate dynamic ratios
fmoletta Mar 7, 2023
2a0db12
Misc fixes
fmoletta Mar 7, 2023
0e123f0
Misc fixes
fmoletta Mar 7, 2023
0057d69
Fix wrong impl
fmoletta Mar 7, 2023
0ac1ca8
Fix tests
fmoletta Mar 7, 2023
f8894df
Fix tests
fmoletta Mar 7, 2023
73d1e69
Add dynamic layout
fmoletta Mar 7, 2023
9b4af24
Fix wrong impl
fmoletta Mar 7, 2023
e1e0142
Fix tests
fmoletta Mar 7, 2023
bed64e5
Merge branch '0.11' into dynamic-layout
fmoletta Mar 8, 2023
5d00463
Merge branch '0.11' into dynamic-layout
fmoletta Mar 9, 2023
3558a61
Merge branch '0.11' into dynamic-layout
fmoletta Mar 10, 2023
9aeaed6
Merge branch '0.11' into dynamic-layout
fmoletta Mar 17, 2023
f7e7ceb
Expose instances_per_component
fmoletta Mar 17, 2023
f7d3720
Move get_used_cells_and_allocated_sizes to mod
fmoletta Mar 17, 2023
5c1fa2f
Move get_allocated_memory_units to mod
fmoletta Mar 17, 2023
f3d4c34
Finnish prev tasks
fmoletta Mar 17, 2023
f79bbd0
Fix test
fmoletta Mar 17, 2023
5b76b60
Initial progress
fmoletta Mar 20, 2023
993d060
Add builtin specific methods
fmoletta Mar 20, 2023
3c8ef1d
Add SegmentArenaBuiltinRunner to BuiltinRunner enum
fmoletta Mar 20, 2023
7b960af
implement final_stack for segmen arena nuiltin runner
fmoletta Mar 20, 2023
141507e
Add other methods
fmoletta Mar 20, 2023
de988c5
Integrate into runner
fmoletta Mar 20, 2023
9bdf562
Remove error from initialize_segments
fmoletta Mar 20, 2023
a431769
Fix comment
fmoletta Mar 20, 2023
019ab32
Add test
fmoletta Mar 20, 2023
2a9ae2f
Add tests for segment arena builtin
fmoletta Mar 20, 2023
2c6e6f1
Merge branch '0.11' into dynamic-layout
fmoletta Mar 21, 2023
cfabe78
Merge branch 'dynamic-layout' into segment-arena-builtin
fmoletta Mar 21, 2023
a232453
Fix
fmoletta Mar 21, 2023
c91aabd
Merge branch '0.11' into dynamic-layout
fmoletta Mar 22, 2023
8d904f7
fix get_perm_range_check_limit
fmoletta Mar 22, 2023
7d48d4a
Fix get_range_check_usage
fmoletta Mar 22, 2023
12736d9
Fix test values
fmoletta Mar 22, 2023
e203b09
Merge branch 'dynamic-layout' into segment-arena-builtin
fmoletta Mar 22, 2023
f8aca9f
Merge branch '0.11' into dynamic-layout
fmoletta Mar 27, 2023
7916604
Merge branch 'dynamic-layout' into segment-arena-builtin
fmoletta Mar 27, 2023
30c7583
expose program base for starknet reasons
fmoletta Mar 27, 2023
ecd3619
Update src/vm/runners/builtin_runner/mod.rs
fmoletta Mar 29, 2023
a655937
Merge branch '0.11' into segment-arena-builtin
fmoletta Mar 29, 2023
8f56444
Add optional program_size argument to verify_secure_runner & run_from…
fmoletta Mar 29, 2023
ec087cf
Fix build
Oppen Mar 30, 2023
6b3d897
Merge branch '0.11' into segment-arena-builtin
Oppen Mar 30, 2023
0d5e396
Merge branch '0.11' into segment-arena-builtin
Oppen Mar 31, 2023
da58e60
Add nostd Vec import
fmoletta Mar 31, 2023
9a5f06f
Merge branch 'segment-arena-builtin' of github.com:lambdaclass/cairo-…
fmoletta Mar 31, 2023
5307f97
Merge branch 'segment-arena-builtin' into verify-secure-program-segme…
fmoletta Mar 31, 2023
99c9bb8
Fix wasm import
fmoletta Mar 31, 2023
a68bddc
Merge branch '0.11' into segment-arena-builtin
fmoletta Mar 31, 2023
dd3a494
Merge branch 'segment-arena-builtin' into verify-secure-program-segme…
fmoletta Mar 31, 2023
635b51d
Expose get_segment_size (#934)
fmoletta Apr 3, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/cairo_run.rs
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ pub fn cairo_run(
cairo_runner.finalize_segments(&mut vm)?;
}
if secure_run {
verify_secure_runner(&cairo_runner, true, &mut vm)?;
verify_secure_runner(&cairo_runner, true, None, &mut vm)?;
}
cairo_runner.relocate(&mut vm, cairo_run_config.relocate_mem)?;

Expand Down
3 changes: 3 additions & 0 deletions src/vm/errors/memory_errors.rs
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,9 @@ pub enum MemoryError {
ExpectedRelocatable(Relocatable),
#[error("Unknown memory cell at address {0}")]
UnknownMemoryCell(Relocatable),
// SegmentArenaBuiltin
#[error("segment_arena_builtin: assert used >= INITIAL_SEGMENT_SIZE")]
InvalidUsedSizeSegmentArena,
}

#[derive(Debug, PartialEq, Eq, Error)]
Expand Down
53 changes: 48 additions & 5 deletions src/vm/runners/builtin_runner/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,12 @@ mod keccak;
mod output;
mod poseidon;
mod range_check;
mod segment_arena;
mod signature;

pub use self::keccak::KeccakBuiltinRunner;
pub use self::poseidon::PoseidonBuiltinRunner;
pub use self::segment_arena::SegmentArenaBuiltinRunner;
pub use bitwise::BitwiseBuiltinRunner;
pub use ec_op::EcOpBuiltinRunner;
pub use hash::HashBuiltinRunner;
Expand All @@ -35,6 +37,7 @@ pub const BITWISE_BUILTIN_NAME: &str = "bitwise";
pub const EC_OP_BUILTIN_NAME: &str = "ec_op";
pub const KECCAK_BUILTIN_NAME: &str = "keccak";
pub const POSEIDON_BUILTIN_NAME: &str = "poseidon";
pub const SEGMENT_ARENA_BUILTIN_NAME: &str = "segment_arena";

/* NB: this enum is no accident: we may need (and cairo-rs-py *does* need)
* structs containing this to be `Send`. The only two ways to achieve that
Expand All @@ -54,6 +57,7 @@ pub enum BuiltinRunner {
Keccak(KeccakBuiltinRunner),
Signature(SignatureBuiltinRunner),
Poseidon(PoseidonBuiltinRunner),
SegmentArena(SegmentArenaBuiltinRunner),
}

impl BuiltinRunner {
Expand All @@ -70,6 +74,9 @@ impl BuiltinRunner {
BuiltinRunner::Keccak(ref mut keccak) => keccak.initialize_segments(segments),
BuiltinRunner::Signature(ref mut signature) => signature.initialize_segments(segments),
BuiltinRunner::Poseidon(ref mut poseidon) => poseidon.initialize_segments(segments),
BuiltinRunner::SegmentArena(ref mut segment_arena) => {
segment_arena.initialize_segments(segments)
}
}
}

Expand All @@ -83,6 +90,7 @@ impl BuiltinRunner {
BuiltinRunner::Keccak(ref keccak) => keccak.initial_stack(),
BuiltinRunner::Signature(ref signature) => signature.initial_stack(),
BuiltinRunner::Poseidon(ref poseidon) => poseidon.initial_stack(),
BuiltinRunner::SegmentArena(ref segment_arena) => segment_arena.initial_stack(),
}
}

Expand All @@ -107,6 +115,9 @@ impl BuiltinRunner {
BuiltinRunner::Poseidon(ref mut poseidon) => {
poseidon.final_stack(segments, stack_pointer)
}
BuiltinRunner::SegmentArena(ref mut segment_arena) => {
segment_arena.final_stack(segments, stack_pointer)
}
}
}

Expand All @@ -116,7 +127,7 @@ impl BuiltinRunner {
vm: &VirtualMachine,
) -> Result<usize, memory_errors::MemoryError> {
match *self {
BuiltinRunner::Output(_) => Ok(0),
BuiltinRunner::Output(_) | BuiltinRunner::SegmentArena(_) => Ok(0),
_ => {
match self.ratio() {
None => {
Expand Down Expand Up @@ -158,6 +169,8 @@ impl BuiltinRunner {
BuiltinRunner::Keccak(ref keccak) => keccak.base(),
BuiltinRunner::Signature(ref signature) => signature.base(),
BuiltinRunner::Poseidon(ref poseidon) => poseidon.base(),
//Warning, returns only the segment index, base offset will be 3
BuiltinRunner::SegmentArena(ref segment_arena) => segment_arena.base(),
}
}

Expand All @@ -166,7 +179,7 @@ impl BuiltinRunner {
BuiltinRunner::Bitwise(bitwise) => bitwise.ratio(),
BuiltinRunner::EcOp(ec) => ec.ratio(),
BuiltinRunner::Hash(hash) => hash.ratio(),
BuiltinRunner::Output(_) => None,
BuiltinRunner::Output(_) | BuiltinRunner::SegmentArena(_) => None,
BuiltinRunner::RangeCheck(range_check) => range_check.ratio(),
BuiltinRunner::Keccak(keccak) => keccak.ratio(),
BuiltinRunner::Signature(ref signature) => signature.ratio(),
Expand All @@ -184,6 +197,9 @@ impl BuiltinRunner {
BuiltinRunner::Keccak(ref keccak) => keccak.add_validation_rule(memory),
BuiltinRunner::Signature(ref signature) => signature.add_validation_rule(memory),
BuiltinRunner::Poseidon(ref poseidon) => poseidon.add_validation_rule(memory),
BuiltinRunner::SegmentArena(ref segment_arena) => {
segment_arena.add_validation_rule(memory)
}
}
}

Expand All @@ -205,13 +221,19 @@ impl BuiltinRunner {
signature.deduce_memory_cell(address, memory)
}
BuiltinRunner::Poseidon(ref poseidon) => poseidon.deduce_memory_cell(address, memory),
BuiltinRunner::SegmentArena(ref segment_arena) => {
segment_arena.deduce_memory_cell(address, memory)
}
}
}

pub fn get_memory_accesses(
&self,
vm: &VirtualMachine,
) -> Result<Vec<Relocatable>, MemoryError> {
if let BuiltinRunner::SegmentArena(_) = self {
return Ok(vec![]);
}
let base = self.base();
let segment_size = vm
.segments
Expand All @@ -235,6 +257,9 @@ impl BuiltinRunner {
BuiltinRunner::Keccak(ref keccak) => keccak.get_memory_segment_addresses(),
BuiltinRunner::Signature(ref signature) => signature.get_memory_segment_addresses(),
BuiltinRunner::Poseidon(ref poseidon) => poseidon.get_memory_segment_addresses(),
BuiltinRunner::SegmentArena(ref segment_arena) => {
segment_arena.get_memory_segment_addresses()
}
}
}

Expand All @@ -248,6 +273,9 @@ impl BuiltinRunner {
BuiltinRunner::Keccak(ref keccak) => keccak.get_used_cells(segments),
BuiltinRunner::Signature(ref signature) => signature.get_used_cells(segments),
BuiltinRunner::Poseidon(ref poseidon) => poseidon.get_used_cells(segments),
BuiltinRunner::SegmentArena(ref segment_arena) => {
segment_arena.get_used_cells(segments)
}
}
}

Expand All @@ -264,6 +292,9 @@ impl BuiltinRunner {
BuiltinRunner::Keccak(ref keccak) => keccak.get_used_instances(segments),
BuiltinRunner::Signature(ref signature) => signature.get_used_instances(segments),
BuiltinRunner::Poseidon(ref poseidon) => poseidon.get_used_instances(segments),
BuiltinRunner::SegmentArena(ref segment_arena) => {
segment_arena.get_used_instances(segments)
}
}
}

Expand Down Expand Up @@ -310,6 +341,7 @@ impl BuiltinRunner {
BuiltinRunner::Keccak(builtin) => builtin.cells_per_instance,
BuiltinRunner::Signature(builtin) => builtin.cells_per_instance,
BuiltinRunner::Poseidon(builtin) => builtin.cells_per_instance,
BuiltinRunner::SegmentArena(builtin) => builtin.cells_per_instance,
}
}

Expand All @@ -323,6 +355,7 @@ impl BuiltinRunner {
BuiltinRunner::Keccak(builtin) => builtin.n_input_cells,
BuiltinRunner::Signature(builtin) => builtin.n_input_cells,
BuiltinRunner::Poseidon(builtin) => builtin.n_input_cells,
BuiltinRunner::SegmentArena(builtin) => builtin.n_input_cells_per_instance,
}
}

Expand All @@ -332,7 +365,7 @@ impl BuiltinRunner {
BuiltinRunner::EcOp(builtin) => builtin.instances_per_component,
BuiltinRunner::Hash(builtin) => builtin.instances_per_component,
BuiltinRunner::RangeCheck(builtin) => builtin.instances_per_component,
BuiltinRunner::Output(_) => 0,
BuiltinRunner::Output(_) | BuiltinRunner::SegmentArena(_) => 1,
BuiltinRunner::Keccak(builtin) => builtin.instances_per_component,
BuiltinRunner::Signature(builtin) => builtin.instances_per_component,
BuiltinRunner::Poseidon(builtin) => builtin.instances_per_component,
Expand All @@ -349,11 +382,12 @@ impl BuiltinRunner {
BuiltinRunner::Keccak(_) => KECCAK_BUILTIN_NAME,
BuiltinRunner::Signature(_) => SIGNATURE_BUILTIN_NAME,
BuiltinRunner::Poseidon(_) => POSEIDON_BUILTIN_NAME,
BuiltinRunner::SegmentArena(_) => SEGMENT_ARENA_BUILTIN_NAME,
}
}

pub fn run_security_checks(&self, vm: &VirtualMachine) -> Result<(), VirtualMachineError> {
if let BuiltinRunner::Output(_) = self {
if let BuiltinRunner::Output(_) | BuiltinRunner::SegmentArena(_) = self {
return Ok(());
}
let cells_per_instance = self.cells_per_instance() as usize;
Expand Down Expand Up @@ -417,7 +451,7 @@ impl BuiltinRunner {
vm: &VirtualMachine,
) -> Result<(usize, usize), MemoryError> {
match self {
BuiltinRunner::Output(_) => {
BuiltinRunner::Output(_) | BuiltinRunner::SegmentArena(_) => {
let used = self.get_used_cells(&vm.segments)?;
Ok((used, used))
}
Expand Down Expand Up @@ -448,6 +482,9 @@ impl BuiltinRunner {
BuiltinRunner::Keccak(ref mut keccak) => keccak.stop_ptr = Some(stop_ptr),
BuiltinRunner::Signature(ref mut signature) => signature.stop_ptr = Some(stop_ptr),
BuiltinRunner::Poseidon(ref mut poseidon) => poseidon.stop_ptr = Some(stop_ptr),
BuiltinRunner::SegmentArena(ref mut segment_arena) => {
segment_arena.stop_ptr = Some(stop_ptr)
}
}
}
}
Expand Down Expand Up @@ -500,6 +537,12 @@ impl From<PoseidonBuiltinRunner> for BuiltinRunner {
}
}

impl From<SegmentArenaBuiltinRunner> for BuiltinRunner {
fn from(runner: SegmentArenaBuiltinRunner) -> Self {
BuiltinRunner::SegmentArena(runner)
}
}

#[cfg(test)]
mod tests {
use super::*;
Expand Down
Loading