# SYNOPSIS 
Rust to Javascript/Webassembly compilation of [ethereum-bn128.rs](https://github.com/ewasm/ethereum-bn128.rs).

Derived largely from [rustbn.js](https://github.com/ethereumjs/rustbn.js) and recompiled used [`wasm-pack`](https://rustwasm.github.io/docs/wasm-pack/introduction.html)

Internally it uses the [Parity fork](https://github.com/paritytech/bn) of the [Zcash bn
pairing cryptography library](https://github.com/zcash/bn), implementing an efficient bilinear pairing on the Barreto-Naehrig (BN) curve. 

It implements helpers to support the functionality defined in [EIP-196](https://eips.ethereum.org/EIPS/eip-196) and [EIP-197](https://eips.ethereum.org/EIPS/eip-197).

## Installation

Clone this repo and build following the [Compilation] instructions below.

## Usage

Import the module:

```
import { initRustBN } from 'rustbn'

const bn128 = await initRustBN()
```

Curve Addition

```
let inputHexString = ...
let outputHexString = bn128.ec_add(inputHexString)
```

Curve Multiplication

```
let inputHexString = ...
let outputHexString = bn128.ec_mul(inputHexString)
```

Curve Pairing
```
let inputHexString = ...
let outputHexString = bn128.ec_pairing(inputHexString)
```

## Developer

### Building the module

For basic setup:

- Install `rust` and `wasm-pack` via the [`wasm-pack` prerequisites](https://rustwasm.github.io/docs/wasm-pack/prerequisites/index.html)
- Clone this repo
- Install JS dependencies - `npm i`
- Run `npm run build:wasm` to compile the Rust code to WASM
- Run `npm run wasm2b64` to convert the WASM bytecode to a base64 string consumable by the Typescript wrapper
- Run `npm run build` to build the final JS outputs

### Build Outputs

The build process outputs both CommonJS and ESM builds of the library and specifies entry points based on the `main`, `module`, and alternatively the `exports` fields in `package.json`. Both builds start with the wasm build from `wasm-bindgen` which is then loaded by a Typescript wrapper of the WASM output.  Our Typescript code is slightly different than the original Javascript generated by `wasm-bindgen` because the default ESM output would require a bundler.  

## License

Licensed under either of

 * MIT license, ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT)
 * Apache License, Version 2.0 ([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0)

at your option.

Copyright 2016 [Zcash Electric Coin Company](https://z.cash/). The Zcash Company promises to maintain the "bn" crate on crates.io under this MIT/Apache-2.0 dual license.
 
