Skip to content
This repository has been archived by the owner on Nov 29, 2023. It is now read-only.

Commit

Permalink
Merge pull request #6 from 0xPolygonID/cibuild
Browse files Browse the repository at this point in the history
Cibuild
  • Loading branch information
olomix authored Nov 8, 2023
2 parents 3b7cad9 + e0f4c6b commit c082736
Show file tree
Hide file tree
Showing 13 changed files with 504 additions and 85 deletions.
192 changes: 192 additions & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,192 @@
name: Build

on:
push:
branches:
- main
- cibuild

jobs:
build-linux:
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v4
with:
submodules: "recursive"

- name: install requirements
uses: awalsh128/cache-apt-pkgs-action@v1
with:
packages: curl xz-utils build-essential cmake m4 nasm
version: 1.0

- name: Cache gmp build
uses: actions/cache@v3
with:
path: |
depends/gmp
depends/gmp-6.2.1.tar.xz
key: ${{ runner.os }}-gmp-${{ hashFiles('build_gmp.sh') }}-2

- name: build gmp android arm64
run: if [[ ! -d "depends/gmp/package_android_arm64" ]]; then ./build_gmp.sh android; fi

- name: build gmp android x86_64
run: if [[ ! -d "depends/gmp/package_android_x86_64" ]]; then ./build_gmp.sh android_x86_64; fi

- name: build gmp android x86_64
run: if [[ ! -d "depends/gmp/package" ]]; then ./build_gmp.sh host; fi

- name: Build prover Android ARM64
run: |
mkdir build_prover_android && cd build_prover_android
cmake .. -DTARGET_PLATFORM=ANDROID -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=../package_android
make -j4 && make install
- name: Build prover Android x86_64
run: |
mkdir build_prover_android_x86_64 && cd build_prover_android_x86_64
cmake .. -DTARGET_PLATFORM=ANDROID_x86_64 -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=../package_android_x86_64
make -j4 && make install
- name: Build prover Linux
run: |
mkdir build_prover && cd build_prover
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=../package
make -j4 && make install
- name: upload Android ARM64 artifacts
uses: actions/upload-artifact@v3
with:
name: rapidsnark-Android-arm64
path: |
package_android
if-no-files-found: error

- name: upload Android x86_64 artifacts
uses: actions/upload-artifact@v3
with:
name: rapidsnark-Android-x86_64
path: |
package_android_x86_64
if-no-files-found: error

- name: upload Linux x86_64 artifacts
uses: actions/upload-artifact@v3
with:
name: rapidsnark-Linux-x86_64
path: |
package
if-no-files-found: error

build-apple-arm64:
runs-on: macos-13-xlarge
steps:
- uses: actions/checkout@v4
with:
submodules: "recursive"

- name: Cache gmp build
uses: actions/cache@v3
with:
path: |
depends/gmp
depends/gmp-6.2.1.tar.xz
key: ${{ runner.os }}-gmp-arm64-${{ hashFiles('build_gmp.sh') }}

- name: build
run: |
if [[ ! -d "depends/gmp/package_ios_arm64" ]]; then ./build_gmp.sh ios; fi
if [[ ! -d "depends/gmp/package_iphone_simulator" ]]; then ./build_gmp.sh ios_simulator; fi
if [[ ! -d "depends/gmp/package_macos_arm64" ]]; then ./build_gmp.sh macos_arm64; fi
mkdir build_prover_ios && cd build_prover_ios
cmake .. -GXcode -DTARGET_PLATFORM=IOS -DCMAKE_INSTALL_PREFIX=../package_ios
xcodebuild -destination 'generic/platform=iOS' -scheme rapidsnarkStatic -project rapidsnark.xcodeproj -configuration Release
cp ../depends/gmp/package_ios_arm64/lib/libgmp.a src/Release-iphoneos
cd ../
mkdir build_prover_ios_simulator && cd build_prover_ios_simulator
cmake .. -GXcode -DTARGET_PLATFORM=IOS -DCMAKE_INSTALL_PREFIX=../package_ios_simulator -DUSE_ASM=NO
xcodebuild -destination 'generic/platform=iOS Simulator' -scheme rapidsnarkStatic -project rapidsnark.xcodeproj
cp ../depends/gmp/package_iphone_simulator/lib/libgmp.a src/Debug-iphonesimulator
cd ../
mkdir build_prover_macos_arm64 && cd build_prover_macos_arm64
cmake .. -DTARGET_PLATFORM=macos_arm64 -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=../package_macos_arm64
make -j4 && make install
- name: test prover
run: |
set -x
set -e
npm install -g snarkjs
package_macos_arm64/bin/prover testdata/circuit_final.zkey testdata/witness.wtns proof.json public.json
snarkjs groth16 verify testdata/verification_key.json public.json proof.json
- name: upload iOS artifacts
uses: actions/upload-artifact@v3
with:
name: rapidsnark-iOS
path: |
build_prover_ios/src/Release-iphoneos
if-no-files-found: error

- name: upload iOS Simulator artifacts
uses: actions/upload-artifact@v3
with:
name: rapidsnark-iOS-Simulator
path: |
build_prover_ios_simulator/src/Debug-iphonesimulator
if-no-files-found: error

- name: upload macOS arm64 artifacts
uses: actions/upload-artifact@v3
with:
name: rapidsnark-macOS-arm64
path: |
package_macos_arm64
if-no-files-found: error

build-apple-x86_64:
runs-on: macos-13
steps:
- uses: actions/checkout@v4
with:
submodules: "recursive"

- name: Cache gmp build
uses: actions/cache@v3
with:
path: |
depends/gmp
depends/gmp-6.2.1.tar.xz
key: ${{ runner.os }}-gmp-x86_64-${{ hashFiles('build_gmp.sh') }}-2

- name: install dependencies
run: |
brew install nasm
- name: build
run: |
if [[ ! -d "depends/gmp/package_macos_x86_64" ]]; then ./build_gmp.sh macos_x86_64; fi
mkdir build_prover_macos_x86_64 && cd build_prover_macos_x86_64
cmake .. -DTARGET_PLATFORM=macos_x86_64 -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=../package_macos_x86_64
make -j4 && make install
- name: test prover
run: |
set -x
set -e
npm install -g snarkjs
package_macos_x86_64/bin/prover testdata/circuit_final.zkey testdata/witness.wtns proof.json public.json
snarkjs groth16 verify testdata/verification_key.json public.json proof.json
- name: upload macOS x86_64 artifacts
uses: actions/upload-artifact@v3
with:
name: rapidsnark-macOS-x86_64
path: |
package_macos_x86_64
if-no-files-found: error
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -75,3 +75,5 @@ package*

build/fq_asm.o
build/fr_asm.o

.idea/
2 changes: 1 addition & 1 deletion .gitmodules
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
url = https://github.com/nlohmann/json.git
[submodule "depends/ffiasm"]
path = depends/ffiasm
url = https://github.com/nixw4/ffiasm.git
url = https://github.com/0xPolygonID/ffiasm
branch = master
[submodule "depends/circom_runtime"]
path = depends/circom_runtime
Expand Down
90 changes: 58 additions & 32 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,55 +8,55 @@ You should have installed gcc, cmake, libsodium, and gmp (development)

In ubuntu:

````
sudo apt-get install build-essential cmake libgmp-dev libsodium-dev nasm
````
```
sudo apt-get install build-essential cmake libgmp-dev libsodium-dev nasm curl m4
```

## Compile prover in standalone mode

### Compile prover for x86_64 host machine

````sh
```sh
git submodule init
git submodule update
./build_gmp.sh host
mkdir build_prover && cd build_prover
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=../package
make -j4 && make install
````
```

### Compile prover for macOS arm64 host machine

````sh
```sh
git submodule init
git submodule update
./build_gmp.sh host_noasm
mkdir build_prover && cd build_prover
cmake .. -DTARGET_PLATFORM=arm64_host -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=../package
./build_gmp.sh macos_arm64
mkdir build_prover_macos_arm64 && cd build_prover_macos_arm64
cmake .. -DTARGET_PLATFORM=macos_arm64 -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=../package_macos_arm64
make -j4 && make install
````
```

### Compile prover for linux arm64 host machine

````sh
```sh
git submodule init
git submodule update
./build_gmp.sh host
mkdir build_prover && cd build_prover
cmake .. -DTARGET_PLATFORM=arm64_host -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=../package
make -j4 && make install
````
```

### Compile prover for linux arm64 machine

````sh
```sh
git submodule init
git submodule update
./build_gmp.sh host
mkdir build_prover && cd build_prover
cmake .. -DTARGET_PLATFORM=aarch64 -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=../package_aarch64
make -j4 && make install
````
```

### Compile prover for Android

Expand All @@ -66,73 +66,99 @@ Set the value of ANDROID_NDK environment variable to the absolute path of Androi

Examples:

````sh
```sh
export ANDROID_NDK=/home/test/Android/Sdk/ndk/23.1.7779620 # NDK is installed by "SDK Manager" in Android Studio.
export ANDROID_NDK=/home/test/android-ndk-r23b # NDK is installed as a stand-alone package.
````
```

Prerequisites if build on Ubuntu:

```sh
apt-get install curl xz-utils build-essential cmake m4 nasm
```

Compilation:

````sh
```sh
git submodule init
git submodule update
./build_gmp.sh android
mkdir build_prover_android && cd build_prover_android
cmake .. -DTARGET_PLATFORM=ANDROID -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=../package_android
make -j4 && make install
````
```

### Compile prover for iOS

Install Xcode.
Install Xcode

````sh
```sh
git submodule init
git submodule update
./build_gmp.sh ios
mkdir build_prover_ios && cd build_prover_ios
cmake .. -GXcode -DTARGET_PLATFORM=IOS -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=../package_ios
````
cmake .. -GXcode -DTARGET_PLATFORM=IOS -DCMAKE_INSTALL_PREFIX=../package_ios
xcodebuild -destination 'generic/platform=iOS' -scheme rapidsnarkStatic -project rapidsnark.xcodeproj -configuration Release
```
Open generated Xcode project and compile prover.

## Build for iOS emulator

Install Xcode

```sh
git submodule init
git submodule update
./build_gmp.sh ios_simulator
mkdir build_prover_ios_simulator && cd build_prover_ios_simulator
cmake .. -GXcode -DTARGET_PLATFORM=IOS -DCMAKE_INSTALL_PREFIX=../package_ios_simulator -DUSE_ASM=NO
xcodebuild -destination 'generic/platform=iOS Simulator' -scheme rapidsnarkStatic -project rapidsnark.xcodeproj
```

Files that you need to copy to your XCode project to link against Rapidsnark:
* build_prover_ios_simulator/src/Debug-iphonesimulator/librapidsnark.a
* build_prover_ios_simulator/src/Debug-iphonesimulator/libfq.a
* build_prover_ios_simulator/src/Debug-iphonesimulator/libfr.a
* depends/gmp/package_iphone_simulator/lib/libgmp.a

## Building proof

You have a full prover compiled in the build directory.

So you can replace snarkjs command:

````sh
```sh
snarkjs groth16 prove <circuit.zkey> <witness.wtns> <proof.json> <public.json>
````
```

by this one
````sh
```sh
./package/bin/prover <circuit.zkey> <witness.wtns> <proof.json> <public.json>
````
```

## Compile prover in server mode

````sh
```sh
npm install
git submodule init
git submodule update
npx task createFieldSources
npx task buildPistache
npx task buildProverServer
````
```

## Launch prover in server mode
````sh
```sh
./build/proverServer <port> <circuit1_zkey> <circuit2_zkey> ... <circuitN_zkey>
````
```

For every `circuit.circom` you have to generate with circom with --c option the `circuit_cpp` and after compilation you have to copy the executable into the `build` folder so the server can generate the witness and then the proof based on this witness.
You have an example of the usage calling the server endpoints to generate the proof with Nodejs in `/tools/request.js`.

To test a request you should pass an `input.json` as a parameter to the request call.
````sh
```sh
node tools/request.js <input.json> <circuit>
````
```

## Benchmark

Expand Down
Loading

0 comments on commit c082736

Please sign in to comment.