Skip to content

Commit

Permalink
Merge pull request #14 from iosis-tech/bootloader
Browse files Browse the repository at this point in the history
chunk_felt_array & starknet signature
  • Loading branch information
Okm165 authored Apr 29, 2024
2 parents c57b6f3 + 08e74b3 commit e5f160c
Show file tree
Hide file tree
Showing 43 changed files with 1,274 additions and 258 deletions.
2 changes: 1 addition & 1 deletion .cargo/config.toml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
[env]
RUST_LOG = "info"
CAIRO_PATH = "cairo"
BOOTLOADER_PATH = "bootloader/recursive_with_poseidon/simple_bootloader.cairo"
BOOTLOADER_PATH = "bootloader/starknet/simple_bootloader.cairo"
BOOTLOADER_OUT_NAME = "bootloader.json"
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -24,4 +24,6 @@ Cargo.lock
Scarb.lock
.snfoundry_cache/

stone-prover
stone-prover

bootloader*.json
3 changes: 1 addition & 2 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,8 @@ license-file = "LICENSE"
async-process = "2.2.0"
async-stream = "0.3.5"
bincode = "1.3"
cairo-felt = "0.9.1"
cairo-proof-parser = { git = "https://github.com/Okm165/cairo-proof-parser", rev = "97a04bbee07330311b38d6f4cecfed3acb237626" }
cairo-vm = { git = "https://github.com/lambdaclass/cairo-vm.git" }
futures = "0.3.30"
futures-core = "0.3.30"
futures-util = "0.3.30"
Expand Down Expand Up @@ -61,7 +61,6 @@ tokio = { version = "1.36", features = ["full"] }
tokio-util = "0.7.10"
tracing = "0.1.37"
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
zip-extensions = "0.6.2"

sharp-p2p-common = { path = "crates/common" }
sharp-p2p-compiler = { path = "crates/compiler" }
Expand Down
2 changes: 1 addition & 1 deletion Makefile.toml
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ script = [
"docker cp -L ${container_id}:/bin/cpu_air_verifier $HOME/.local/bin",
]

[tasks.setup]
[tasks.install]
workspace = false
dependencies = [
"python-requirements-install",
Expand Down
37 changes: 31 additions & 6 deletions cairo/bootloader/objects.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,33 +32,58 @@ def get_program(self) -> StrippedProgram:
return self.cairo_pie.program


@dataclasses.dataclass(frozen=True)
class FieldElementsData:
data_len: int
data: List[int]

def deserialize(self) -> bytes:
FIELD_ELEMENT_CHUNK_SIZE = 31
v = []
for i in range(0, len(self.data) - 1):
data = self.data[i].to_bytes(FIELD_ELEMENT_CHUNK_SIZE, "big")
v.extend([0] * (FIELD_ELEMENT_CHUNK_SIZE - len(data)) + list(data))

data = self.data[-1].to_bytes(FIELD_ELEMENT_CHUNK_SIZE, "big")
data = [0] * (FIELD_ELEMENT_CHUNK_SIZE - len(data)) + list(data)
v.extend(
data[
(
FIELD_ELEMENT_CHUNK_SIZE * len(self.data) - self.data_len
) : FIELD_ELEMENT_CHUNK_SIZE
]
)
return bytes(v)


@dataclasses.dataclass(frozen=True)
class JobData(Task):
reward: int
num_of_steps: int
cairo_pie_compressed: List[int]
registry_address: str
cairo_pie_compressed: FieldElementsData
registry_address: int

def load_task(self) -> "CairoPieTask":
return CairoPieTask(
cairo_pie=CairoPie.deserialize(bytes(self.cairo_pie_compressed)),
cairo_pie=CairoPie.deserialize(self.cairo_pie_compressed.deserialize()),
use_poseidon=True,
)


@dataclasses.dataclass(frozen=True)
class Job(Task):
job_data: JobData
public_key: List[int]
signature: List[int]
public_key: int
signature_r: int
signature_s: int

def load_task(self) -> "CairoPieTask":
return self.job_data.load_task()


@marshmallow_dataclass.dataclass(frozen=True)
class SimpleBootloaderInput(ValidatedMarshmallowDataclass):
public_key: List[int]
public_key: int
job: Job

fact_topologies_path: Optional[str]
Expand Down
File renamed without changes.
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@
OUTPUT_BUILTIN,
PEDERSEN_BUILTIN,
RANGE_CHECK_BUILTIN,
ECDSA_BUILTIN,
BITWISE_BUILTIN,
EC_OP_BUILTIN,
POSEIDON_BUILTIN,
]
)
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,11 @@ from builtin_selection.inner_select_builtins import inner_select_builtins
from builtin_selection.select_input_builtins import select_input_builtins
from builtin_selection.validate_builtins import validate_builtins
from common.builtin_poseidon.poseidon import PoseidonBuiltin, poseidon_hash_many
from common.cairo_builtins import HashBuiltin
from common.cairo_builtins import HashBuiltin, EcOpBuiltin
from common.hash_chain import hash_chain
from common.bool import TRUE
from common.registers import get_ap, get_fp_and_pc
from common.signature import check_ecdsa_signature

const BOOTLOADER_VERSION = 0;

Expand All @@ -28,7 +30,9 @@ struct BuiltinData {
output: felt,
pedersen: felt,
range_check: felt,
ecdsa: felt,
bitwise: felt,
ec_op: felt,
poseidon: felt,
}

Expand Down Expand Up @@ -109,6 +113,21 @@ func execute_task{builtin_ptrs: BuiltinData*, self_range_check_ptr}(
use_poseidon=bool(ids.use_poseidon)), 'Computed hash does not match input.'
%}

local public_key: felt;
local signature_r: felt;
local signature_s: felt;
%{
ids.public_key = simple_bootloader_input.job.public_key
ids.signature_r = simple_bootloader_input.job.signature_r
ids.signature_s = simple_bootloader_input.job.signature_s
%}

let ec_op_ptr = cast(input_builtin_ptrs.ec_op, EcOpBuiltin*);
with ec_op_ptr {
let (res) = check_ecdsa_signature(message=hash, public_key=public_key, signature_r=signature_r, signature_s=signature_s);
assert res = TRUE;
}

// Set the program entry point, so the bootloader can later run the program.
local builtin_list: felt* = &program_header.builtin_list;
local n_builtins = program_header.n_builtins;
Expand All @@ -127,7 +146,9 @@ func execute_task{builtin_ptrs: BuiltinData*, self_range_check_ptr}(
output=output_ptr + 2,
pedersen=cast(pedersen_ptr, felt),
range_check=input_builtin_ptrs.range_check,
ecdsa=input_builtin_ptrs.ecdsa,
bitwise=input_builtin_ptrs.bitwise,
ec_op=cast(ec_op_ptr, felt),
poseidon=cast(poseidon_ptr, felt),
);

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from bootloader.recursive_with_poseidon.execute_task import BuiltinData, execute_task
from bootloader.starknet.execute_task import BuiltinData, execute_task
from common.cairo_builtins import HashBuiltin, PoseidonBuiltin
from common.registers import get_fp_and_pc

Expand All @@ -14,7 +14,9 @@ func run_simple_bootloader{
output_ptr: felt*,
pedersen_ptr: HashBuiltin*,
range_check_ptr,
ecdsa_ptr,
bitwise_ptr,
ec_op_ptr,
poseidon_ptr: PoseidonBuiltin*,
}() {
alloc_locals;
Expand All @@ -41,7 +43,9 @@ func run_simple_bootloader{
output=cast(output_ptr, felt),
pedersen=cast(pedersen_ptr, felt),
range_check=task_range_check_ptr,
ecdsa=ecdsa_ptr,
bitwise=bitwise_ptr,
ec_op=ec_op_ptr,
poseidon=cast(poseidon_ptr, felt),
);

Expand All @@ -50,15 +54,19 @@ func run_simple_bootloader{
output='output',
pedersen='pedersen',
range_check='range_check',
ecdsa='ecdsa',
bitwise='bitwise',
ec_op='ec_op',
poseidon='poseidon',
);

local builtin_instance_sizes: BuiltinData = BuiltinData(
output=1,
pedersen=3,
range_check=1,
ecdsa=2,
bitwise=5,
ec_op=7,
poseidon=6,
);

Expand All @@ -83,7 +91,9 @@ func run_simple_bootloader{
let output_ptr = cast(builtin_ptrs.output, felt*);
let pedersen_ptr = cast(builtin_ptrs.pedersen, HashBuiltin*);
let range_check_ptr = builtin_ptrs.range_check;
let ecdsa_ptr = builtin_ptrs.ecdsa;
let bitwise_ptr = builtin_ptrs.bitwise;
let ec_op_ptr = builtin_ptrs.ec_op;
let poseidon_ptr = cast(builtin_ptrs.poseidon, PoseidonBuiltin*);

// 'execute_tasks' runs untrusted code and uses the range_check builtin to verify that
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
%builtins output pedersen range_check bitwise poseidon
%builtins output pedersen range_check ecdsa bitwise ec_op poseidon

from bootloader.recursive_with_poseidon.run_simple_bootloader import (
from bootloader.starknet.run_simple_bootloader import (
run_simple_bootloader,
)
from common.cairo_builtins import HashBuiltin, PoseidonBuiltin
Expand All @@ -10,7 +10,9 @@ func main{
output_ptr: felt*,
pedersen_ptr: HashBuiltin*,
range_check_ptr,
ecdsa_ptr,
bitwise_ptr,
ec_op_ptr,
poseidon_ptr: PoseidonBuiltin*,
}() {
%{
Expand Down
3 changes: 3 additions & 0 deletions cairo/common/bool.cairo
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
// Represents boolean values in Cairo.
const FALSE = 0;
const TRUE = 1;
6 changes: 3 additions & 3 deletions cairo/common/cairo_builtins.cairo
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from starkware.cairo.common.ec_point import EcPoint
from starkware.cairo.common.keccak_state import KeccakBuiltinState
from starkware.cairo.common.poseidon_state import PoseidonBuiltinState
from common.ec_point import EcPoint
from common.keccak_state import KeccakBuiltinState
from common.poseidon_state import PoseidonBuiltinState

// Specifies the hash builtin memory structure.
struct HashBuiltin {
Expand Down
Loading

0 comments on commit e5f160c

Please sign in to comment.