diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml index 084d830d..063b4619 100644 --- a/.github/workflows/build-and-test.yml +++ b/.github/workflows/build-and-test.yml @@ -19,8 +19,10 @@ jobs: cargo install --path circom - name: Prepare CI run: ./scripts/prepare_ci.sh - - name: Build + - name: Build for iOS run: ./scripts/build_ios.sh x86_64 debug + - name: Build for android + run: ./scripts/build_android.sh arm64 debug - name: Run core tests run: cd mopro-core && cargo test -- --nocapture - name: Run ffi tests diff --git a/README.md b/README.md index 0dd12c86..61cfe715 100644 --- a/README.md +++ b/README.md @@ -74,12 +74,17 @@ To update bindings, run `./scripts/update_bindings.sh simulator|device debug|rel #### Build and Update Bindings -To build bindings for android simulator, run +To build bindings for android simulator debug mode, run ```sh -./scripts/build_android.sh +./scripts/build_android.sh arm64 debug ``` +- **Device types:** `x86_64`, `x86`, `arm`, `arm64` + Check your device architecture here: https://doc.e.foundation/devices + For Android Studio simulator (Pixel series), choose `arm64` +- **Mode:** `debug`, `release` + ## Community and Talks Join the Telegram group [here](https://t.me/zkmopro). diff --git a/mopro-android/Example/app/src/main/java/com/example/mopro/MainActivity.kt b/mopro-android/Example/app/src/main/java/com/example/mopro/MainActivity.kt index 7a8b5c30..357f127f 100644 --- a/mopro-android/Example/app/src/main/java/com/example/mopro/MainActivity.kt +++ b/mopro-android/Example/app/src/main/java/com/example/mopro/MainActivity.kt @@ -41,6 +41,7 @@ class MainActivity : ComponentActivity() { @Composable fun ProofComponent() { + var initTime by remember { mutableStateOf("init time:") } var provingTime by remember { mutableStateOf("proving time:") } var verifyingTime by remember { mutableStateOf("verifying time: ") } var valid by remember { mutableStateOf("valid:") } @@ -293,11 +294,37 @@ fun ProofComponent() { Box(modifier = Modifier.fillMaxSize().padding(16.dp), contentAlignment = Alignment.Center) { Button( onClick = { - val startTime = System.currentTimeMillis() - res = uniffi.mopro.generateProof2(inputs) - val endTime = System.currentTimeMillis() - provingTime = "proving time: " + (endTime - startTime).toString() + " ms" - } + Thread( + Runnable { + val startTime = System.currentTimeMillis() + uniffi.mopro.initializeMopro() + val endTime = System.currentTimeMillis() + initTime = + "init time: " + + (endTime - startTime).toString() + + " ms" + } + ) + .start() + }, + modifier = Modifier.padding(bottom = 80.dp) + ) { Text(text = "init") } + Button( + onClick = { + Thread( + Runnable { + val startTime = System.currentTimeMillis() + res = uniffi.mopro.generateProof2(inputs) + val endTime = System.currentTimeMillis() + provingTime = + "proving time: " + + (endTime - startTime).toString() + + " ms" + } + ) + .start() + }, + modifier = Modifier.padding(top = 20.dp) ) { Text(text = "generate proof") } Button( onClick = { @@ -306,16 +333,17 @@ fun ProofComponent() { val endTime = System.currentTimeMillis() verifyingTime = "verifying time: " + (endTime - startTime).toString() + " ms" }, - modifier = Modifier.padding(top = 100.dp) + modifier = Modifier.padding(top = 120.dp) ) { Text(text = "verify proof") } Text( text = "Keccak256 proof", - modifier = Modifier.padding(bottom = 80.dp), + modifier = Modifier.padding(bottom = 180.dp), fontWeight = FontWeight.Bold ) - Text(text = valid, modifier = Modifier.padding(top = 250.dp).width(200.dp)) - Text(text = provingTime, modifier = Modifier.padding(top = 300.dp).width(200.dp)) + Text(text = initTime, modifier = Modifier.padding(top = 200.dp).width(200.dp)) + Text(text = provingTime, modifier = Modifier.padding(top = 250.dp).width(200.dp)) + Text(text = valid, modifier = Modifier.padding(top = 300.dp).width(200.dp)) Text(text = verifyingTime, modifier = Modifier.padding(top = 350.dp).width(200.dp)) } } diff --git a/scripts/build_android.sh b/scripts/build_android.sh index 3a9f1105..0c164877 100755 --- a/scripts/build_android.sh +++ b/scripts/build_android.sh @@ -5,30 +5,81 @@ PROJECT_DIR=$(pwd) # Color definitions DEFAULT='\033[0m' RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[0;33m' + +# Function to handle exit +handle_exit() { + # $? is a special variable that holds the exit code of the last command executed + if [ $? -ne 0 ]; then + echo -e "\n${RED}Script did not finish successfully!${DEFAULT}" + fi +} + +# Set the trap +trap handle_exit EXIT + +print_action() { + printf "\n${GREEN}$1${DEFAULT}\n" +} + +print_warning() { + printf "\n${YELLOW}$1${DEFAULT}\n" +} + +# Check for the device type argument +if [[ "$1" == "x86_64" ]]; then + ARCHITECTURE="x86_64-linux-android" + FOLDER="x86_64" + elif [[ "$1" == "x86" ]]; then + ARCHITECTURE="i686-linux-android" + FOLDER="x86" + elif [[ "$1" == "arm" ]]; then + ARCHITECTURE="armv7-linux-androideabi" + FOLDER="armeabi-v7a" + elif [[ "$1" == "arm64" ]]; then + ARCHITECTURE="aarch64-linux-android" + FOLDER="arm64-v8a" +else + echo -e "${RED}Error: Please specify either 'x86_64', 'x86', 'arm' or 'arm64' as the first argument.${DEFAULT}" + exit 1 +fi + +# Check for the build mode argument +if [[ "$2" == "debug" ]]; then + BUILD_MODE="debug" + LIB_DIR="debug" + COMMAND="" + elif [[ "$2" == "release" ]]; then + BUILD_MODE="release" + LIB_DIR="release" + COMMAND="--release" +else + echo -e "${RED}Error: Please specify either 'debug' or 'release' as the second argument.${DEFAULT}" + exit 1 +fi cd ${PROJECT_DIR}/mopro-ffi -cargo build --lib \ ---target x86_64-linux-android \ ---target i686-linux-android \ ---target armv7-linux-androideabi \ ---target aarch64-linux-android +# Print appropriate message based on device type +print_action "Using $ARCHITECTURE libmopro_ffi.a ($LIB_DIR) static library..." +print_warning "This only works on $FOLDER devices!" + +print_action "[android] Build target in $BUILD_MODE mode" +cargo build --lib ${COMMAND} --target ${ARCHITECTURE} +print_action "[android] Copy files in mopro-android/Example/jniLibs/" for binary in target/*/*/libmopro_ffi.so; do file $binary; done -mkdir -p jniLibs/arm64-v8a/ && \ -cp target/aarch64-linux-android/debug/libmopro_ffi.so jniLibs/arm64-v8a/libuniffi_mopro.so && \ -mkdir -p jniLibs/armeabi-v7a/ && \ -cp target/armv7-linux-androideabi/debug/libmopro_ffi.so jniLibs/armeabi-v7a/libuniffi_mopro.so && \ -mkdir -p jniLibs/x86/ && \ -cp target/i686-linux-android/debug/libmopro_ffi.so jniLibs/x86/libuniffi_mopro.so && \ -mkdir -p jniLibs/x86_64/ && \ -cp target/x86_64-linux-android/debug/libmopro_ffi.so jniLibs/x86_64/libuniffi_mopro.so +mkdir -p jniLibs/${FOLDER}/ && \ +cp target/${ARCHITECTURE}/${LIB_DIR}/libmopro_ffi.so jniLibs/${FOLDER}/libuniffi_mopro.so -cargo run --features=uniffi/cli \ - --bin uniffi-bindgen \ - generate src/mopro.udl \ - --language kotlin +print_action "[android] Generating Kotlin bindings in $BUILD_MODE mode..." +cargo run --features=uniffi/cli ${COMMAND} \ +--bin uniffi-bindgen \ +generate src/mopro.udl \ +--language kotlin +print_action "[android] Copy Kotlin bindings to mopro-android/Example" cp -r ${PROJECT_DIR}/mopro-ffi/jniLibs/ ${PROJECT_DIR}/mopro-android/Example/app/src/main/jniLibs/ -cp -r ${PROJECT_DIR}/mopro-ffi/src/uniffi/ ${PROJECT_DIR}/mopro-android/Example/app/src/main/java/uniffi/ \ No newline at end of file +cp -r ${PROJECT_DIR}/mopro-ffi/src/uniffi/ ${PROJECT_DIR}/mopro-android/Example/app/src/main/java/uniffi/