Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
Original file line number Diff line number Diff line change
@@ -1,12 +1,24 @@
%builtins output range_check poseidon
%builtins output pedersen range_check ec_op poseidon

from starkware.cairo.common.alloc import alloc
from starkware.cairo.common.bool import FALSE
from starkware.cairo.common.cairo_builtins import PoseidonBuiltin
from starkware.cairo.common.cairo_builtins import PoseidonBuiltin, HashBuiltin, EcOpBuiltin
from starkware.cairo.common.ec_point import EcPoint
from starkware.starknet.core.aggregator.combine_blocks import combine_blocks
from starkware.starknet.core.os.output import OsOutput, serialize_os_output

func main{output_ptr: felt*, range_check_ptr, poseidon_ptr: PoseidonBuiltin*}() {
from starkware.starknet.core.os.os_config.os_config import (
get_public_keys_hash,
get_starknet_os_config_hash,
StarknetOsConfig,
)

func main{
output_ptr: felt*,
pedersen_ptr: HashBuiltin*,
range_check_ptr,
ec_op_ptr: EcOpBuiltin*,
poseidon_ptr: PoseidonBuiltin*,
}() {
alloc_locals;

local os_program_hash: felt;
Expand Down Expand Up @@ -36,6 +48,24 @@ func main{output_ptr: felt*, range_check_ptr, poseidon_ptr: PoseidonBuiltin*}()
tempvar use_kzg_da = nondet %{ program_input["use_kzg_da"] %};
tempvar full_output = nondet %{ program_input["full_output"] %};

// Guess the committee's public keys.
local public_keys: felt*;
local n_keys: felt;
%{
public_keys = program_input["public_keys"] if program_input["public_keys"] is not None else []
if len(public_keys) == 0:
ids.public_keys = 0
else:
ids.public_keys = segments.gen_arg(public_keys)
ids.n_keys = len(public_keys)
%}

check_public_keys{hash_ptr=pedersen_ptr}(
n_keys=n_keys,
public_keys=public_keys,
starknet_os_config_hash=os_outputs[0].header.starknet_os_config_hash,
);

// Compute the aggregated output.
let combined_output = combine_blocks(
n=n_tasks,
Expand All @@ -53,7 +83,13 @@ func main{output_ptr: felt*, range_check_ptr, poseidon_ptr: PoseidonBuiltin*}()
assert output_ptr[0] = n_tasks;
let output_ptr = output_ptr + 1;

output_blocks(n_tasks=n_tasks, os_outputs=os_outputs, os_program_hash=os_program_hash);
output_blocks(
n_tasks=n_tasks,
os_outputs=os_outputs,
os_program_hash=os_program_hash,
n_keys=n_keys,
public_keys=public_keys,
);

// Output the combined result. This represents the "output" of the aggregator.
%{
Expand All @@ -67,7 +103,13 @@ func main{output_ptr: felt*, range_check_ptr, poseidon_ptr: PoseidonBuiltin*}()
)
kzg_manager = KzgManager(polynomial_coefficients_to_kzg_commitment_callback)
%}
serialize_os_output(os_output=combined_output, replace_keys_with_aliases=FALSE);

serialize_os_output(
os_output=combined_output,
replace_keys_with_aliases=FALSE,
n_keys=n_keys,
public_keys=public_keys,
);

%{
import json
Expand All @@ -84,9 +126,9 @@ func main{output_ptr: felt*, range_check_ptr, poseidon_ptr: PoseidonBuiltin*}()

// Outputs the given OsOutput instances, with the size of the output and the program hash
// (to match the bootloader output format).
func output_blocks{output_ptr: felt*, range_check_ptr, poseidon_ptr: PoseidonBuiltin*}(
n_tasks: felt, os_outputs: OsOutput*, os_program_hash: felt
) {
func output_blocks{
output_ptr: felt*, range_check_ptr, ec_op_ptr: EcOpBuiltin*, poseidon_ptr: PoseidonBuiltin*
}(n_tasks: felt, os_outputs: OsOutput*, os_program_hash: felt, n_keys: felt, public_keys: felt*) {
if (n_tasks == 0) {
return ();
}
Expand All @@ -107,12 +149,37 @@ func output_blocks{output_ptr: felt*, range_check_ptr, poseidon_ptr: PoseidonBui
# we need to disable page creation.
__serialize_data_availability_create_pages__ = False
%}
serialize_os_output(os_output=&os_outputs[0], replace_keys_with_aliases=FALSE);
serialize_os_output(
os_output=&os_outputs[0],
replace_keys_with_aliases=FALSE,
n_keys=n_keys,
public_keys=public_keys,
);

// Compute the size of the output, including the program hash and the output size fields.
assert output_size_placeholder = output_ptr - output_start;

return output_blocks(
n_tasks=n_tasks - 1, os_outputs=&os_outputs[1], os_program_hash=os_program_hash
n_tasks=n_tasks - 1,
os_outputs=&os_outputs[1],
os_program_hash=os_program_hash,
n_keys=n_keys,
public_keys=public_keys,
);
}

func check_public_keys{hash_ptr: HashBuiltin*}(
n_keys: felt, public_keys: felt*, starknet_os_config_hash: felt
) {
let (public_keys_hash) = get_public_keys_hash(n_keys=n_keys, public_keys=public_keys);
tempvar chain_id = nondet %{ program_input["chain_id"] %};
tempvar fee_token_address = nondet %{ program_input["fee_token_address"] %};
tempvar guessed_starknet_os_config = new StarknetOsConfig(
chain_id=chain_id, fee_token_address=fee_token_address, public_keys_hash=public_keys_hash
);
let (guessed_starknet_os_config_hash) = get_starknet_os_config_hash(
starknet_os_config=guessed_starknet_os_config
);
assert guessed_starknet_os_config_hash = starknet_os_config_hash;
return ();
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,14 @@ from starkware.starknet.core.os.contract_class.deprecated_compiled_class import
)
from starkware.starknet.core.os.os_config.os_config import StarknetOsConfig

// Struct to group compiled class facts parameters.
struct CompiledClassFactsBundle {
n_compiled_class_facts: felt,
compiled_class_facts: CompiledClassFact*,
n_deprecated_compiled_class_facts: felt,
deprecated_compiled_class_facts: DeprecatedCompiledClassFact*,
}

// Represents information that is the same throughout the block.
struct BlockContext {
// Parameters for select_builtins.
Expand Down Expand Up @@ -48,10 +56,8 @@ struct BlockContext {
func get_block_context{range_check_ptr}(
execute_syscalls_ptr: felt*,
execute_deprecated_syscalls_ptr: felt*,
n_compiled_class_facts: felt,
compiled_class_facts: CompiledClassFact*,
n_deprecated_compiled_class_facts: felt,
deprecated_compiled_class_facts: DeprecatedCompiledClassFact*,
compiled_class_facts_bundle: CompiledClassFactsBundle*,
public_keys_hash: felt,
) -> (block_context: BlockContext*) {
alloc_locals;
let (builtin_params) = get_builtin_params();
Expand All @@ -65,10 +71,10 @@ func get_block_context{range_check_ptr}(
tempvar block_timestamp_for_validate = divided_block_timestamp * VALIDATE_TIMESTAMP_ROUNDING;
local block_context: BlockContext = BlockContext(
builtin_params=builtin_params,
n_compiled_class_facts=n_compiled_class_facts,
compiled_class_facts=compiled_class_facts,
n_deprecated_compiled_class_facts=n_deprecated_compiled_class_facts,
deprecated_compiled_class_facts=deprecated_compiled_class_facts,
n_compiled_class_facts=compiled_class_facts_bundle.n_compiled_class_facts,
compiled_class_facts=compiled_class_facts_bundle.compiled_class_facts,
n_deprecated_compiled_class_facts=compiled_class_facts_bundle.n_deprecated_compiled_class_facts,
deprecated_compiled_class_facts=compiled_class_facts_bundle.deprecated_compiled_class_facts,
block_info_for_execute=new BlockInfo(
block_number=block_number,
block_timestamp=block_timestamp,
Expand All @@ -82,6 +88,7 @@ func get_block_context{range_check_ptr}(
starknet_os_config=StarknetOsConfig(
chain_id=nondet %{ os_hints_config.starknet_os_config.chain_id %},
fee_token_address=nondet %{ os_hints_config.starknet_os_config.fee_token_address %},
public_keys_hash=public_keys_hash,
),
execute_syscalls_ptr=execute_syscalls_ptr,
execute_deprecated_syscalls_ptr=execute_deprecated_syscalls_ptr,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ struct SelectableBuiltins {
range_check: felt,
ecdsa: felt,
bitwise: BitwiseBuiltin*,
ec_op: felt,
ec_op: EcOpBuiltin*,
poseidon: PoseidonBuiltin*,
segment_arena: SegmentArenaBuiltin*,
range_check96: felt*,
Expand Down
Loading
Loading