Skip to content
Merged
Show file tree
Hide file tree
Changes from 4 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
3 changes: 1 addition & 2 deletions docs/docs/dev_docs/contracts/syntax/functions.md
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ Oracles introduce **non-determinism** into a circuit, and thus are `unconstraine

### A few useful inbuilt oracles

- [`compute_selector`](https://github.com/AztecProtocol/aztec-packages/blob/master/yarn-project/aztec-nr/aztec/src/oracle/compute_selector.nr) - Computes the selector of a function. This is useful for when you want to call a function from within a circuit, but don't have an interface at hand and don't want to hardcode the selector in hex.
- [`compute_selector`](https://github.com/AztecProtocol/aztec-packages/blob/master/yarn-project/aztec-nr/aztec/src/selector.nr) - Computes the selector of a function. This is useful for when you want to call a function from within a circuit, but don't have an interface at hand and don't want to hardcode the selector in hex.
- [`debug_log`](https://github.com/AztecProtocol/aztec-packages/blob/master/yarn-project/aztec-nr/aztec/src/oracle/debug_log.nr) - Provides a couple of debug functions that can be used to log information to the console.
- [`auth_witness`](https://github.com/AztecProtocol/aztec-packages/blob/master/yarn-project/aztec-nr/aztec/src/oracle/auth_witness.nr) - Provides a way to fetch the authentication witness for a given address. This is useful when building account contracts to support approve-like functionality.
- [`get_l1_to_l2_message`](https://github.com/AztecProtocol/aztec-packages/blob/master/yarn-project/aztec-nr/aztec/src/oracle/get_l1_to_l2_message.nr) - Useful for application that receive messages from L1 to be consumed on L2, such as token bridges or other cross-chain applications.
Expand Down Expand Up @@ -307,7 +307,6 @@ When a [`Storage` struct](./storage.md) is declared within a contract, the `stor

Any state variables declared in the `Storage` struct can now be accessed as normal struct members.


**Returning the function context to the kernel.**
#include_code context-example-finish /yarn-project/noir-contracts/src/contracts/docs_example_contract/src/main.nr rust

Expand Down
6 changes: 0 additions & 6 deletions yarn-project/acir-simulator/src/acvm/oracle/oracle.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,12 +23,6 @@ import { TypedOracle } from './typed_oracle.js';
export class Oracle {
constructor(private typedOracle: TypedOracle, private log = createDebugLogger('aztec:simulator:oracle')) {}

computeSelector(...args: ACVMField[][]): ACVMField {
const signature = oracleDebugCallToFormattedStr(args);
const selector = this.typedOracle.computeSelector(signature);
return toACVMField(selector);
}

getRandomField(): ACVMField {
const val = this.typedOracle.getRandomField();
return toACVMField(val);
Expand Down
4 changes: 0 additions & 4 deletions yarn-project/acir-simulator/src/acvm/oracle/typed_oracle.ts
Original file line number Diff line number Diff line change
Expand Up @@ -60,10 +60,6 @@ export interface L1ToL2MessageOracleReturnData extends MessageLoadOracleInputs {
* and are unavailable by default.
*/
export abstract class TypedOracle {
computeSelector(signature: string): Fr {
return FunctionSelector.fromSignature(signature).toField();
}

getRandomField(): Fr {
return Fr.random();
}
Expand Down
2 changes: 1 addition & 1 deletion yarn-project/aztec-nr/authwit/src/account.nr
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ mod entrypoint;
mod auth;

use dep::aztec::context::{PrivateContext, PublicContext, Context};
use dep::aztec::oracle::compute_selector::compute_selector;
use dep::aztec::selector::compute_selector;
use dep::aztec::state_vars::{map::Map, public_state::PublicState};
use dep::aztec::types::type_serialization::bool_serialization::{BoolSerializationMethods,BOOL_SERIALIZED_LEN};

Expand Down
1 change: 1 addition & 0 deletions yarn-project/aztec-nr/aztec/src/lib.nr
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ mod note;
mod oracle;
mod private_call_stack_item;
mod public_call_stack_item;
mod selector;
mod state_vars;
mod types;
mod utils;
1 change: 0 additions & 1 deletion yarn-project/aztec-nr/aztec/src/oracle.nr
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,3 @@ mod public_call;
mod notes;
mod storage;
mod logs;
mod compute_selector;
6 changes: 0 additions & 6 deletions yarn-project/aztec-nr/aztec/src/oracle/compute_selector.nr

This file was deleted.

15 changes: 15 additions & 0 deletions yarn-project/aztec-nr/aztec/src/selector.nr
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
use crate::utils::field_from_bytes;

global SELECTOR_SIZE = 4;

fn compute_selector<N>(signature: str<N>) -> Field {
let bytes = signature.as_bytes();
let hash = dep::std::hash::keccak256(bytes, bytes.len() as u32);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

proving a keccak scares me

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One selector compute:

fn main(signature: str<10>) -> pub Field {
    compute_selector(signature)
}

is

+---------+------------------------+--------------+----------------------+
| Package | Language               | ACIR Opcodes | Backend Circuit Size |
+---------+------------------------+--------------+----------------------+
| test    | PLONKCSat { width: 3 } | 17           | 54830                |
+---------+------------------------+--------------+----------------------+
%                                                                                      

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's not great, maybe we should switch to a different hash for selectors? But the computation needs to be proven, else a malicious PXE could call other function in the target

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note: this will only be executed in-circuit for non-constant signatures. For constant signatures the keccak gets simplified away:

fn main() -> pub Field {
    compute_selector("foo and bar")
}
+---------+------------------------+--------------+----------------------+
| Package | Language               | ACIR Opcodes | Backend Circuit Size |
+---------+------------------------+--------------+----------------------+
| test    | PLONKCSat { width: 3 } | 1            | 7                    |
+---------+------------------------+--------------+----------------------+


let mut selector_be_bytes = [0; SELECTOR_SIZE];
for i in 0..SELECTOR_SIZE {
selector_be_bytes[i] = hash[i];
}

field_from_bytes(selector_be_bytes, true)
}
16 changes: 16 additions & 0 deletions yarn-project/aztec-nr/aztec/src/utils.nr
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,20 @@ fn arr_copy_slice<T, N, M>(
dst[i] = src[i + offset];
}
dst
}

fn field_from_bytes<N>(bytes: [u8; N], big_endian: bool) -> Field {
assert(bytes.len() as u32 < 32, "field_from_bytes: N must be less than 32");
let mut as_field = 0;
let mut offset = 1;
for i in 0..N {
let mut index = i;
if big_endian {
index = N - i - 1;
}
as_field += (bytes[index] as Field) * offset;
offset *= 256;
}

as_field
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ contract Benchmarking {
use dep::aztec::{
context::{Context},
note::note_getter_options::NoteGetterOptions,
oracle::compute_selector::compute_selector,
selector::compute_selector,
log::emit_unencrypted_log,
state_vars::{map::Map, public_state::PublicState, set::Set},
types::type_serialization::field_serialization::{FieldSerializationMethods, FIELD_SERIALIZED_LEN},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ contract CardGame {
note_header::NoteHeader,
utils as note_utils,
},
oracle::compute_selector::compute_selector
selector::compute_selector
};

use crate::cards::{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ contract Child {
use dep::aztec::{
abi::CallContext,
context::{PrivateContext, PublicContext, Context},
oracle::compute_selector::compute_selector,
selector::compute_selector,
log::emit_unencrypted_log,
state_vars::public_state::PublicState,
types::type_serialization::field_serialization::{FieldSerializationMethods, FIELD_SERIALIZED_LEN},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ contract Escrow {
utils as note_utils,
},
oracle::get_public_key::get_public_key,
oracle::compute_selector::compute_selector,
selector::compute_selector,
state_vars::set::Set,
};

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ use dep::aztec::context::{

use crate::asset::Asset;
use dep::aztec::constants_gen::RETURN_VALUES_LENGTH;
use dep::aztec::oracle::compute_selector::compute_selector;
use dep::aztec::selector::compute_selector;

struct PriceFeed {
address: Field,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ contract Lending {
use dep::std::option::Option;
use dep::aztec::{
context::{PrivateContext, PublicContext, Context},
oracle::compute_selector::compute_selector,
selector::compute_selector,
state_vars::{
map::Map,
public_state::PublicState,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ contract NonNativeToken {
note_header::NoteHeader,
utils as note_utils,
},
oracle::compute_selector::compute_selector,
selector::compute_selector,
state_vars::{map::Map, public_state::PublicState, set::Set},
types::type_serialization::field_serialization::{
FieldSerializationMethods, FIELD_SERIALIZED_LEN,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
// A contract used along with `Child` contract to test nested calls.
contract Parent {
use dep::aztec::oracle::compute_selector::compute_selector;
use dep::aztec::selector::compute_selector;

#[aztec(private)]
fn constructor() {}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ contract TokenBridge {
FieldSerializationMethods, FIELD_SERIALIZED_LEN,
},
types::address::{AztecAddress, EthereumAddress},
oracle::compute_selector::compute_selector,
selector::compute_selector,
};

use crate::token_interface::Token;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use dep::aztec::{
context::{ PrivateContext, PublicContext, Context },
oracle::compute_selector::compute_selector,
selector::compute_selector,
};

struct Token {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ contract Token {
aztec_address_serialization::{AztecAddressSerializationMethods, AZTEC_ADDRESS_SERIALIZED_LEN},
},
types::address::{AztecAddress},
oracle::compute_selector::compute_selector,
selector::compute_selector,
};

use dep::authwit::{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use dep::aztec::{
context::{ PrivateContext, PublicContext, Context },
oracle::compute_selector::compute_selector,
selector::compute_selector,
types::address::AztecAddress,
};

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ mod util;
contract Uniswap {
use dep::aztec::{
context::{PrivateContext, PublicContext, Context},
oracle::{compute_selector::compute_selector, context::get_portal_address},
oracle::{context::get_portal_address},
state_vars::{map::Map, public_state::PublicState},
types::address::{AztecAddress, EthereumAddress},
types::type_serialization::bool_serialization::{
Expand All @@ -16,6 +16,7 @@ contract Uniswap {
types::type_serialization::field_serialization::{
FieldSerializationMethods, FIELD_SERIALIZED_LEN,
},
selector::compute_selector,
};

use dep::authwit::auth::{IS_VALID_SELECTOR, assert_current_call_valid_authwit_public, compute_authwit_message_hash};
Expand Down