Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Aurura modexp #111

Merged
merged 5 commits into from
Aug 3, 2023
Merged
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
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ TBD

### Rust

Rust needs to be installed to compile the altbn128 library. The default way to install it on Linux or OS X is:
Rust needs to be installed to compile the arithmetic and bls12-381 libraries. The default way to install it on Linux or OS X is:

```
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
Expand Down
10 changes: 6 additions & 4 deletions arithmetic/arithmetic/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,15 +1,17 @@
[package]
name = "besu-native-arithmetic"
version = "0.11.0"
description = "Native arithemetic for EVM."
description = """Native arithemetic for EVM.
Derived from aurora - https://github.com/aurora-is-near/aurora-engine/tree/4ecee7ded1e6c78b69416e5b22388357316f7551/engine-modexp - originally CC0-1.0 license."""
license = "Apache-2.0"
authors = ["Danno Ferrin <danno.ferrin@shemnon.com>"]
authors = ["Aurora Labs <hello@aurora.dev>", "Danno Ferrin <danno.ferrin@shemnon.com>"]
repository = "https://github.com/hyperledger/besu-native"
edition = "2021"

[dependencies]
num-bigint = "0.4.3"
num-traits = "0.2.15"
ibig = { version = "0.3.6", default-features = false, features = ["num-traits"], optional = true }
num = { version = "0.4.0", default-features = false, features = ["alloc"] }
hex = { version = "0.4", default-features = false, features = ["alloc"] }
libc = "0.2"

[lib]
Expand Down
34 changes: 34 additions & 0 deletions arithmetic/arithmetic/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
# Besu native `modexp`

Originally from Aurora `modexp` [implementation](https://github.com/aurora-is-near/aurora-engine/tree/4ecee7ded1e6c78b69416e5b22388357316f7551/engine-modexp)

## What this crate is

This crate is an efficient implementation of the EVM `modexp` precompile.
This crate exposes a single public function

```rust
pub fn modexp(base: &[u8], exp: &[u8], modulus: &[u8]) -> Vec<u8>
```

This function takes the base, exponent and modulus as big-endian encoded bytes and returns the result in big-endian as well.

This crate is meant to be an efficient implementation, using as little memory as possible (for example, it does not copy the exponent slice).
The exponentiation is done using the ["binary method"](https://en.wikipedia.org/wiki/Exponentiation_by_squaring).
The multiplication steps within the exponentiation use ["Montgomery multiplication"](https://en.wikipedia.org/wiki/Montgomery_modular_multiplication).
In the case of even modulus, Montgomery multiplication does not apply directly.
However we can reduce the problem to one involving an odd modulus and one where the modulus is a power of two.
These two sub-problems can be solved efficiently (the former using Montgomery multiplication, the latter the modular arithmetic is trivial on a binary computer),
then the results are combined using the [Chinese remainder theorem](https://en.wikipedia.org/wiki/Chinese_remainder_theorem).

The primary academic references for this implementation are:

1. [Analyzing and Comparing Montgomery Multiplication Algorithms](https://www.microsoft.com/en-us/research/wp-content/uploads/1996/01/j37acmon.pdf)
2. [Montgomery Reduction with Even Modulus](http://www.people.vcu.edu/~jwang3/CMSC691/j34monex.pdf)
3. [A Cryptographic Library for the Motorola DSP56000](https://link.springer.com/content/pdf/10.1007/3-540-46877-3_21.pdf)
4. [The Art of Computer Programming Volume 2](https://www-cs-faculty.stanford.edu/~knuth/taocp.html)
Comment on lines +14 to +29
Copy link
Contributor

Choose a reason for hiding this comment

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

👍


## What this crate is NOT

This crate is not a general purpose big integer library.
If you need anything other than `modexp`, then you should use something like [num-bigint](https://crates.io/crates/num-bigint) or [ibig](https://crates.io/crates/ibig).
Loading