Skip to content

Comparisons and overflow/underflow on Felt #202

@PhilippGackstatter

Description

@PhilippGackstatter

Felt Comparison

https://docs.miden.xyz/builder/tutorials/rust-compiler/miden-bank/constants-constraints#safe-felt-comparisons says:

Never use <, >, <=, or >= operators directly on Felt values. They produce incorrect results due to field element ordering.

Is this still accurate? It looks like miden_field::Felt properly uses the built-in instructions for this which shouldn't produce "incorrect" results (I'm not sure what exactly we mean by that).

Safe Arithmetic

Similarly, the miden bank tutorial has a large section on the dangers of underflows: https://docs.miden.xyz/builder/tutorials/rust-compiler/miden-bank/asset-management#step-2-add-the-withdraw-method-skeleton.

Ideally this would be easy for users to avoid, e.g. by implementing checked* arithmetic for the miden_field::Felt type , so users can easily do things like current_balance.checked_sub(withdraw_amount).expect("insufficient balance").

If correct/agreed, we'd have to open an issue in miden-crypto.

An even safer alternative, at least for on-chain users, would be to let impl Add for Felt (and all such related impls) panic instead of wrap around. We'd implement wrapping_add and such instead for explicit use. In other words, it'd be ideal to follow the safe design of arithmetic functionality on the Rust primitive types and have Felt::{wrapping_add, checked_add, overflowing_add, ...}.

Maybe we could selectively do this only for the miden_field::Felt type in wasm32, which would be ideal to not have to touch the non-wasm parts, though even that might be doable.

cc @greenhat for thoughts

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions