diff --git a/integration_tests/cairozero_test.go b/integration_tests/cairozero_test.go index 1bfe3d1c..c13cf918 100644 --- a/integration_tests/cairozero_test.go +++ b/integration_tests/cairozero_test.go @@ -288,8 +288,20 @@ func runPythonVm(testFilename, path string) (time.Duration, string, string, erro // A file without this suffix will use the default ("plain") layout. if strings.HasSuffix(testFilename, ".small.cairo") { args = append(args, "--layout", "small") + } else if strings.HasSuffix(testFilename, ".dex.cairo") { + args = append(args, "--layout", "dex") + } else if strings.HasSuffix(testFilename, ".recursive.cairo") { + args = append(args, "--layout", "recursive") } else if strings.HasSuffix(testFilename, ".starknet_with_keccak.cairo") { args = append(args, "--layout", "starknet_with_keccak") + } else if strings.HasSuffix(testFilename, ".starknet.cairo") { + args = append(args, "--layout", "starknet") + } else if strings.HasSuffix(testFilename, ".recursive_large_output.cairo") { + args = append(args, "--layout", "recursive_large_output") + } else if strings.HasSuffix(testFilename, ".recursive_with_poseidon.cairo") { + args = append(args, "--layout", "recursive_with_poseidon") + } else if strings.HasSuffix(testFilename, ".all_solidity.cairo") { + args = append(args, "--layout", "all_solidity") } cmd := exec.Command("cairo-run", args...) @@ -321,8 +333,20 @@ func runVm(path string) (time.Duration, string, string, string, error) { layout := "plain" if strings.Contains(path, ".small") { layout = "small" + } else if strings.Contains(path, ".dex") { + layout = "dex" + } else if strings.Contains(path, ".recursive") { + layout = "recursive" } else if strings.Contains(path, ".starknet_with_keccak") { layout = "starknet_with_keccak" + } else if strings.Contains(path, ".starknet") { + layout = "starknet" + } else if strings.Contains(path, ".recursive_large_output") { + layout = "recursive_large_output" + } else if strings.Contains(path, ".recursive_with_poseidon") { + layout = "recursive_with_poseidon" + } else if strings.Contains(path, ".all_solidity") { + layout = "all_solidity" } cmd := exec.Command( @@ -351,7 +375,6 @@ func runVm(path string) (time.Duration, string, string, string, error) { } return elapsed, traceOutput, memoryOutput, string(res), nil - } func decodeProof(traceLocation string, memoryLocation string) ([]vm.Trace, []*fp.Element, error) { diff --git a/pkg/vm/builtins/layouts.go b/pkg/vm/builtins/layouts.go index 2a464ff4..59baeb4d 100644 --- a/pkg/vm/builtins/layouts.go +++ b/pkg/vm/builtins/layouts.go @@ -24,6 +24,10 @@ type Layout struct { Builtins []LayoutBuiltin } +func getPlainLayout() Layout { + return Layout{Name: "plain", RcUnits: 16, Builtins: []LayoutBuiltin{}} +} + func getSmallLayout() Layout { return Layout{Name: "small", RcUnits: 16, Builtins: []LayoutBuiltin{ {Runner: &Output{}, Builtin: starknet.Output}, @@ -33,8 +37,34 @@ func getSmallLayout() Layout { }} } -func getPlainLayout() Layout { - return Layout{Name: "plain", RcUnits: 16, Builtins: []LayoutBuiltin{}} +func getDexLayout() Layout { + return Layout{Name: "dex", RcUnits: 4, Builtins: []LayoutBuiltin{ + {Runner: &Output{}, Builtin: starknet.Output}, + {Runner: &Pedersen{ratio: 8}, Builtin: starknet.Pedersen}, + {Runner: &RangeCheck{ratio: 8, RangeCheckNParts: 8}, Builtin: starknet.RangeCheck}, + {Runner: &ECDSA{ratio: 512}, Builtin: starknet.ECDSA}, + }} +} + +func getRecursiveLayout() Layout { + return Layout{Name: "recursive", RcUnits: 4, Builtins: []LayoutBuiltin{ + {Runner: &Output{}, Builtin: starknet.Output}, + {Runner: &Pedersen{ratio: 128}, Builtin: starknet.Pedersen}, + {Runner: &RangeCheck{ratio: 8, RangeCheckNParts: 8}, Builtin: starknet.RangeCheck}, + {Runner: &Bitwise{ratio: 8}, Builtin: starknet.Bitwise}, + }} +} + +func getStarknetLayout() Layout { + return Layout{Name: "starknet", RcUnits: 4, Builtins: []LayoutBuiltin{ + {Runner: &Output{}, Builtin: starknet.Output}, + {Runner: &Pedersen{ratio: 32}, Builtin: starknet.Pedersen}, + {Runner: &RangeCheck{ratio: 16, RangeCheckNParts: 8}, Builtin: starknet.RangeCheck}, + {Runner: &ECDSA{ratio: 2048}, Builtin: starknet.ECDSA}, + {Runner: &Bitwise{ratio: 64}, Builtin: starknet.Bitwise}, + {Runner: &EcOp{ratio: 1024, cache: make(map[uint64]fp.Element)}, Builtin: starknet.ECOP}, + {Runner: &Poseidon{ratio: 32, cache: make(map[uint64]fp.Element)}, Builtin: starknet.Poseidon}, + }} } func getStarknetWithKeccakLayout() Layout { @@ -50,14 +80,57 @@ func getStarknetWithKeccakLayout() Layout { }} } +func getRecursiveLargeOutputLayout() Layout { + return Layout{Name: "recursive_large_output", RcUnits: 4, Builtins: []LayoutBuiltin{ + {Runner: &Output{}, Builtin: starknet.Output}, + {Runner: &Pedersen{ratio: 128}, Builtin: starknet.Pedersen}, + {Runner: &RangeCheck{ratio: 8, RangeCheckNParts: 8}, Builtin: starknet.RangeCheck}, + {Runner: &Bitwise{ratio: 8}, Builtin: starknet.Bitwise}, + {Runner: &Poseidon{ratio: 8, cache: make(map[uint64]fp.Element)}, Builtin: starknet.Poseidon}, + }} +} + +func getRecursiveWithPoseidonLayout() Layout { + return Layout{Name: "recursive_with_poseidon", RcUnits: 4, Builtins: []LayoutBuiltin{ + {Runner: &Output{}, Builtin: starknet.Output}, + {Runner: &Pedersen{ratio: 256}, Builtin: starknet.Pedersen}, + {Runner: &RangeCheck{ratio: 16, RangeCheckNParts: 8}, Builtin: starknet.RangeCheck}, + {Runner: &Bitwise{ratio: 16}, Builtin: starknet.Bitwise}, + {Runner: &Poseidon{ratio: 64, cache: make(map[uint64]fp.Element)}, Builtin: starknet.Poseidon}, + }} +} + +func getAllSolidityLayout() Layout { + return Layout{Name: "recursive_with_poseidon", RcUnits: 8, Builtins: []LayoutBuiltin{ + {Runner: &Output{}, Builtin: starknet.Output}, + {Runner: &Pedersen{ratio: 8}, Builtin: starknet.Pedersen}, + {Runner: &RangeCheck{ratio: 8, RangeCheckNParts: 8}, Builtin: starknet.RangeCheck}, + {Runner: &ECDSA{ratio: 512}, Builtin: starknet.ECDSA}, + {Runner: &Bitwise{ratio: 256}, Builtin: starknet.Bitwise}, + {Runner: &EcOp{ratio: 256, cache: make(map[uint64]fp.Element)}, Builtin: starknet.ECOP}, + }} +} + func GetLayout(layout string) (Layout, error) { switch layout { - case "small": - return getSmallLayout(), nil case "plain": return getPlainLayout(), nil + case "small": + return getSmallLayout(), nil + case "dex": + return getDexLayout(), nil + case "recursive": + return getRecursiveLayout(), nil + case "starknet": + return getStarknetLayout(), nil case "starknet_with_keccak": return getStarknetWithKeccakLayout(), nil + case "recursive_large_output": + return getRecursiveLargeOutputLayout(), nil + case "recursive_with_poseidon": + return getRecursiveWithPoseidonLayout(), nil + case "all_solidity": + return getAllSolidityLayout(), nil case "": return getPlainLayout(), nil default: