-
Notifications
You must be signed in to change notification settings - Fork 13
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Implement remaining hints in
keccak
module (#276)
* Add hint codes * Move divrem hint codes to math hint codes * Finish implementation of unsignedDivRem hint * Add some fields to range check builtin runner * WIP implementation of signedDivRem hint * Dummy commit * Save work in progress * Add FeltFromBigInt function * Add unsigned div rem integration test * Implement UnsafeKeccak * Update dependencies * Add unit test * Fix division bug and make integration test pass * Fix hash * Save work in progress * Add unit tests * Add integration test * Finished unit test for divrem hints * Remove unused commented code * Add missing file * Add constant + GetStructFieldRelocatable + start hint * Add test file * Add MemorySegmentManager.GetFeltRange * Progress * Finish hint * Add unit test * Add integration test * Remove nParts and bound from range check runner fields, add method to calculate bound from constant and add test to assert bound is never zero * Remove unused input parameter to NewRangeCheckBuiltinRunner * Change number to constant in Bound impl * Add hint + test * Add integration tests * Add hint + tests * Add hint * Fix test * Add test * Implement CAIRO_KECCAK_FINALIZE * Extract aliased constants * Fix index out of range * Fix var name * Make error more expressive * Fix hint * Add test, fix test * Add test files * Implement keccakWriteArgs * Extend hint parsing * Update program.go * Fix DivCeil * Add integration test * Fix DivCeil * v2 * Fix bug * Fix bug but better * Update keccak_add_uint256.cairo * Update cairo_run_test.go --------- Co-authored-by: Mariano Nicolini <[email protected]>
- Loading branch information
1 parent
64e07f9
commit d638fec
Showing
13 changed files
with
616 additions
and
5 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
%builtins range_check bitwise | ||
|
||
from starkware.cairo.common.cairo_keccak.keccak import cairo_keccak, finalize_keccak | ||
from starkware.cairo.common.uint256 import Uint256 | ||
from starkware.cairo.common.cairo_builtins import BitwiseBuiltin | ||
from starkware.cairo.common.alloc import alloc | ||
|
||
func main{range_check_ptr: felt, bitwise_ptr: BitwiseBuiltin*}() { | ||
alloc_locals; | ||
|
||
let (keccak_ptr: felt*) = alloc(); | ||
let keccak_ptr_start = keccak_ptr; | ||
|
||
let (inputs: felt*) = alloc(); | ||
|
||
assert inputs[0] = 8031924123371070792; | ||
assert inputs[1] = 560229490; | ||
|
||
let n_bytes = 16; | ||
|
||
let (res: Uint256) = cairo_keccak{keccak_ptr=keccak_ptr}(inputs=inputs, n_bytes=n_bytes); | ||
|
||
assert res.low = 293431514620200399776069983710520819074; | ||
assert res.high = 317109767021952548743448767588473366791; | ||
|
||
finalize_keccak(keccak_ptr_start=keccak_ptr_start, keccak_ptr_end=keccak_ptr); | ||
|
||
return (); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
%builtins output range_check bitwise | ||
|
||
from starkware.cairo.common.keccak_utils.keccak_utils import keccak_add_uint256 | ||
from starkware.cairo.common.uint256 import Uint256 | ||
from starkware.cairo.common.cairo_builtins import BitwiseBuiltin | ||
from starkware.cairo.common.alloc import alloc | ||
from starkware.cairo.common.serialize import serialize_word | ||
|
||
func main{output_ptr: felt*, range_check_ptr, bitwise_ptr: BitwiseBuiltin*}() { | ||
alloc_locals; | ||
|
||
let (inputs) = alloc(); | ||
let inputs_start = inputs; | ||
|
||
let num = Uint256(34623634663146736, 598249824422424658356); | ||
|
||
keccak_add_uint256{inputs=inputs_start}(num=num, bigend=0); | ||
|
||
assert inputs[0] = 34623634663146736; | ||
assert inputs[1] = 0; | ||
assert inputs[2] = 7954014063719006644; | ||
assert inputs[3] = 32; | ||
|
||
serialize_word(inputs[0]); | ||
serialize_word(inputs[1]); | ||
serialize_word(inputs[2]); | ||
serialize_word(inputs[3]); | ||
|
||
return (); | ||
} | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,107 @@ | ||
%builtins range_check bitwise | ||
|
||
from starkware.cairo.common.keccak import unsafe_keccak, unsafe_keccak_finalize, KeccakState | ||
from starkware.cairo.common.cairo_keccak.keccak import cairo_keccak, finalize_keccak | ||
from starkware.cairo.common.keccak_utils.keccak_utils import keccak_add_uint256 | ||
from starkware.cairo.common.alloc import alloc | ||
from starkware.cairo.common.uint256 import Uint256 | ||
from starkware.cairo.common.cairo_builtins import BitwiseBuiltin | ||
from starkware.cairo.common.math import unsigned_div_rem | ||
|
||
func fill_array(array: felt*, base: felt, step: felt, array_length: felt, iter: felt) { | ||
if (iter == array_length) { | ||
return (); | ||
} | ||
assert array[iter] = base + step * iter; | ||
return fill_array(array, base, step, array_length, iter + 1); | ||
} | ||
|
||
func test_integration{range_check_ptr: felt, bitwise_ptr: BitwiseBuiltin*}(iter: felt, last: felt) { | ||
alloc_locals; | ||
if (iter == last) { | ||
return (); | ||
} | ||
|
||
let (data_1: felt*) = alloc(); | ||
let data_len: felt = 15; | ||
let chunk_len: felt = 5; | ||
|
||
fill_array(data_1, iter, iter + 1, data_len, 0); | ||
|
||
let (low_1: felt, high_1: felt) = unsafe_keccak(data_1, chunk_len); | ||
let (low_2: felt, high_2: felt) = unsafe_keccak(data_1 + chunk_len, chunk_len); | ||
let (low_3: felt, high_3: felt) = unsafe_keccak(data_1 + 2 * chunk_len, chunk_len); | ||
|
||
// With the results of unsafe_keccak, create an array to pass to unsafe_keccak_finalize | ||
// through a KeccakState | ||
let (data_2: felt*) = alloc(); | ||
assert data_2[0] = low_1; | ||
assert data_2[1] = high_1; | ||
assert data_2[2] = low_2; | ||
assert data_2[3] = high_2; | ||
assert data_2[4] = low_3; | ||
assert data_2[5] = high_3; | ||
|
||
let keccak_state: KeccakState = KeccakState(start_ptr=data_2, end_ptr=data_2 + 6); | ||
let res_1: Uint256 = unsafe_keccak_finalize(keccak_state); | ||
|
||
let (data_3: felt*) = alloc(); | ||
|
||
// This is done to make sure that the numbers inserted in data_3 | ||
// fit in a u64 | ||
let (q, r) = unsigned_div_rem(res_1.low, 18446744073709551615); | ||
assert data_3[0] = q; | ||
let (q, r) = unsigned_div_rem(res_1.high, 18446744073709551615); | ||
assert data_3[1] = q; | ||
|
||
let (keccak_ptr: felt*) = alloc(); | ||
let keccak_ptr_start = keccak_ptr; | ||
|
||
let res_2: Uint256 = cairo_keccak{keccak_ptr=keccak_ptr}(data_3, 16); | ||
|
||
finalize_keccak(keccak_ptr_start=keccak_ptr_start, keccak_ptr_end=keccak_ptr); | ||
|
||
let (inputs) = alloc(); | ||
let inputs_start = inputs; | ||
keccak_add_uint256{inputs=inputs_start}(num=res_2, bigend=0); | ||
|
||
// These values are hardcoded for last = 10 | ||
// Since we are dealing with hash functions and using the output of one of them | ||
// as the input of the other, asserting only the last results of the iteration | ||
// should be enough | ||
if (iter == last - 1 and last == 10) { | ||
assert res_2.low = 3896836249413878817054429671793519200; | ||
assert res_2.high = 253424239110447628170109510737834198489; | ||
assert inputs[0] = 16681956707691293280; | ||
assert inputs[1] = 211247916371739620; | ||
assert inputs[2] = 6796127878994642393; | ||
assert inputs[3] = 13738155530201662906; | ||
} | ||
|
||
// These values are hardcoded for last = 100 | ||
// This should be used for benchmarking. | ||
if (iter == last - 1 and last == 100) { | ||
assert res_2.low = 52798800345724801884797411011515944813; | ||
assert res_2.high = 159010026777930121161844734347918361509; | ||
assert inputs[0] = 14656556134934286189; | ||
assert inputs[1] = 2862228701973161639; | ||
assert inputs[2] = 206697371206337445; | ||
assert inputs[3] = 8619950823980503604; | ||
} | ||
|
||
return test_integration{range_check_ptr=range_check_ptr, bitwise_ptr=bitwise_ptr}( | ||
iter + 1, last | ||
); | ||
} | ||
|
||
func run_test{range_check_ptr: felt, bitwise_ptr: BitwiseBuiltin*}(last: felt) { | ||
test_integration(0, last); | ||
return (); | ||
} | ||
|
||
func main{range_check_ptr: felt, bitwise_ptr: BitwiseBuiltin*}() { | ||
run_test(10); | ||
return (); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.