Skip to content
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
70 changes: 64 additions & 6 deletions .github/workflows/circuits-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,17 @@ on:
- "circuits/circuits/**"
- ".github/workflows/artifacts.yml"
workflow_dispatch:
inputs:
circuit-type:
description: 'Circuits to build (comma-separated: register, register_id, register_aadhaar, disclose, dsc). Leave empty to build all.'
required: false
type: string
default: ''
circuit-name:
description: 'Circuit names to build (comma-separated: register_sha256_sha224_sha224_ecdsa_secp224r1, dsc_sha256_rsa_65537_4096). Cannot be used with circuit-type.'
required: false
type: string
default: ''

concurrency:
group: circuits-build-${{ github.workflow }}-${{ github.ref }}
Expand Down Expand Up @@ -139,14 +150,61 @@ jobs:
- name: Print Circom version
run: circom --version

- name: Download previous artifacts
if: github.event_name == 'workflow_dispatch' && (inputs.circuit-type != '' || inputs.circuit-name != '')
uses: actions/download-artifact@v4
with:
name: circuits
path: output/
continue-on-error: true

- name: Build cpp circuits
run: |
chmod +x circuits/scripts/build/build_cpp.sh && \
./circuits/scripts/build/build_cpp.sh register &&
./circuits/scripts/build/build_cpp.sh register_id &&
./circuits/scripts/build/build_cpp.sh register_aadhaar &&
./circuits/scripts/build/build_cpp.sh disclose &&
./circuits/scripts/build/build_cpp.sh dsc
chmod +x circuits/scripts/build/build_cpp.sh
chmod +x circuits/scripts/build/build_single_circuit.sh

# Validate inputs - only one should be provided
if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then
if [[ "${{ inputs.circuit-type }}" != "" && "${{ inputs.circuit-name }}" != "" ]]; then
echo " Error: Cannot provide both circuit-type and circuit-name. Use only one."
exit 1
fi
fi

# Check what type of build to perform
if [[ "${{ github.event_name }}" == "workflow_dispatch" && "${{ inputs.circuit-name }}" != "" ]]; then
# Build circuits by name
INPUT_CIRCUITS="${{ inputs.circuit-name }}"
INPUT_CIRCUITS=$(echo "$INPUT_CIRCUITS" | tr -d ' ')
IFS=',' read -ra CIRCUITS_ARRAY <<< "$INPUT_CIRCUITS"

echo "Building selected circuits: ${{ inputs.circuit-name }}"
for circuit_name in "${CIRCUITS_ARRAY[@]}"; do
echo "Building circuit: $circuit_name"
./circuits/scripts/build/build_single_circuit.sh "$circuit_name"
done

elif [[ "${{ github.event_name }}" == "workflow_dispatch" && "${{ inputs.circuit-type }}" != "" ]]; then
# Build circuits by type
INPUT_CIRCUITS="${{ inputs.circuit-type }}"
INPUT_CIRCUITS=$(echo "$INPUT_CIRCUITS" | tr -d ' ')
IFS=',' read -ra CIRCUITS_ARRAY <<< "$INPUT_CIRCUITS"

echo "Building selected circuits: ${{ inputs.circuit-type }}"
for circuit in "${CIRCUITS_ARRAY[@]}"; do
echo "Building circuit: $circuit"
./circuits/scripts/build/build_cpp.sh "$circuit"
done

else
# Build all circuits (default behavior)
echo "Building all circuits (default behavior)"
./circuits/scripts/build/build_cpp.sh register
./circuits/scripts/build/build_cpp.sh register_id
./circuits/scripts/build/build_cpp.sh register_aadhaar
./circuits/scripts/build/build_cpp.sh disclose
./circuits/scripts/build/build_cpp.sh dsc
fi

- name: Upload Artifact
uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4
Expand Down
236 changes: 236 additions & 0 deletions circuits/scripts/build/build_single_circuit.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,236 @@
#!/bin/bash

# Build a single circuit by name

if [[ $# -ne 1 ]]; then
echo "Usage: $0 <circuit_name>"
echo "Example: $0 register_sha256_sha224_sha224_ecdsa_secp224r1"
exit 1
fi

CIRCUIT_NAME="$1"

# Function to extract circuit type from circuit name
extract_circuit_type() {
local name="$1"

# Special cases first
if [[ "$name" == "register_aadhaar" ]]; then
echo "register_aadhaar"
return
fi

if [[ "$name" =~ ^vc_and_disclose ]]; then
echo "vc_and_disclose"
return
fi

# For other patterns, extract based on underscores
if [[ "$name" =~ ^register_id_ ]]; then
echo "register_id"
return
fi

if [[ "$name" =~ ^register_ ]]; then
echo "register"
return
fi

if [[ "$name" =~ ^dsc_ ]]; then
echo "dsc"
return
fi

# If no pattern matches, return empty
echo ""
}

REGISTER_CIRCUITS=(
"register_sha1_sha1_sha1_rsa_64321_4096"
"register_sha1_sha1_sha1_ecdsa_brainpoolP224r1"
"register_sha1_sha1_sha1_ecdsa_secp256r1"
"register_sha256_sha1_sha1_rsa_65537_4096"
"register_sha1_sha1_sha1_rsa_65537_4096"
"register_sha1_sha256_sha256_rsa_65537_4096"
"register_sha224_sha224_sha224_ecdsa_brainpoolP224r1"
"register_sha256_sha224_sha224_ecdsa_secp224r1"
"register_sha256_sha256_sha224_ecdsa_secp224r1"
"register_sha256_sha256_sha256_ecdsa_brainpoolP256r1"
"register_sha256_sha256_sha256_ecdsa_brainpoolP384r1"
"register_sha256_sha256_sha256_ecdsa_secp256r1"
"register_sha256_sha256_sha256_ecdsa_secp384r1"
"register_sha256_sha256_sha256_rsa_3_4096"
"register_sha256_sha256_sha256_rsa_65537_4096"
"register_sha256_sha256_sha256_rsapss_3_32_2048"
"register_sha256_sha256_sha256_rsapss_65537_32_2048"
"register_sha256_sha256_sha256_rsapss_65537_32_3072"
"register_sha256_sha256_sha256_rsapss_65537_32_4096"
"register_sha256_sha256_sha256_rsapss_65537_64_2048"
"register_sha384_sha384_sha384_ecdsa_brainpoolP384r1"
"register_sha384_sha384_sha384_ecdsa_brainpoolP512r1"
"register_sha384_sha384_sha384_ecdsa_secp384r1"
"register_sha512_sha512_sha256_rsapss_65537_32_2048"
"register_sha384_sha384_sha384_rsapss_65537_48_2048"
"register_sha512_sha512_sha256_rsa_65537_4096"
"register_sha512_sha512_sha512_ecdsa_brainpoolP512r1"
"register_sha512_sha512_sha512_rsa_65537_4096"
"register_sha512_sha512_sha512_rsapss_65537_64_2048"
"register_sha512_sha512_sha512_ecdsa_secp521r1"
)

REGISTER_ID_CIRCUITS=(
"register_id_sha1_sha1_sha1_ecdsa_brainpoolP224r1"
"register_id_sha1_sha1_sha1_ecdsa_secp256r1"
"register_id_sha1_sha1_sha1_rsa_65537_4096"
"register_id_sha1_sha256_sha256_rsa_65537_4096"
"register_id_sha224_sha224_sha224_ecdsa_brainpoolP224r1"
"register_id_sha256_sha224_sha224_ecdsa_secp224r1"
"register_id_sha256_sha256_sha224_ecdsa_secp224r1"
"register_id_sha256_sha256_sha256_ecdsa_brainpoolP256r1"
"register_id_sha256_sha256_sha256_ecdsa_brainpoolP384r1"
"register_id_sha256_sha256_sha256_ecdsa_secp256r1"
"register_id_sha256_sha256_sha256_ecdsa_secp384r1"
"register_id_sha256_sha256_sha256_rsa_3_4096"
"register_id_sha256_sha256_sha256_rsa_65537_4096"
"register_id_sha256_sha256_sha256_rsapss_3_32_2048"
"register_id_sha256_sha256_sha256_rsapss_65537_32_2048"
"register_id_sha256_sha256_sha256_rsapss_65537_32_3072"
"register_id_sha256_sha256_sha256_rsapss_65537_64_2048"
"register_id_sha384_sha384_sha384_ecdsa_brainpoolP384r1"
"register_id_sha384_sha384_sha384_ecdsa_brainpoolP512r1"
"register_id_sha384_sha384_sha384_ecdsa_secp384r1"
"register_id_sha384_sha384_sha384_rsapss_65537_48_2048"
"register_id_sha512_sha512_sha256_rsa_65537_4096"
"register_id_sha512_sha512_sha512_ecdsa_brainpoolP512r1"
"register_id_sha512_sha512_sha512_ecdsa_secp521r1"
"register_id_sha512_sha512_sha512_rsa_65537_4096"
"register_id_sha512_sha512_sha512_rsapss_65537_64_2048"
)

REGISTER_AADHAAR_CIRCUITS=(
"register_aadhaar"
)

DISCLOSE_CIRCUITS=(
"vc_and_disclose"
"vc_and_disclose_id"
"vc_and_disclose_aadhaar"
)

DSC_CIRCUITS=(
"dsc_sha1_ecdsa_brainpoolP256r1"
"dsc_sha1_ecdsa_secp256r1"
"dsc_sha1_rsa_65537_4096"
"dsc_sha256_ecdsa_brainpoolP256r1"
"dsc_sha256_ecdsa_brainpoolP384r1"
"dsc_sha256_ecdsa_secp256r1"
"dsc_sha256_ecdsa_secp384r1"
"dsc_sha256_ecdsa_secp521r1"
"dsc_sha256_rsa_65537_4096"
"dsc_sha256_rsa_56611_4096"
"dsc_sha256_rsa_107903_4096"
"dsc_sha256_rsa_122125_4096"
"dsc_sha256_rsa_130689_4096"
"dsc_sha256_rsapss_3_32_3072"
"dsc_sha256_rsapss_65537_32_3072"
"dsc_sha256_rsapss_65537_32_4096"
"dsc_sha384_ecdsa_brainpoolP384r1"
"dsc_sha384_ecdsa_brainpoolP512r1"
"dsc_sha384_ecdsa_secp384r1"
"dsc_sha512_ecdsa_brainpoolP512r1"
"dsc_sha512_ecdsa_secp521r1"
"dsc_sha512_rsa_65537_4096"
"dsc_sha512_rsapss_65537_64_4096"
)

# Extract circuit type
CIRCUIT_TYPE=$(extract_circuit_type "$CIRCUIT_NAME")

if [[ -z "$CIRCUIT_TYPE" ]]; then
echo "❌ Error: Cannot determine circuit type from '$CIRCUIT_NAME'"
echo "Expected patterns: register_*, register_id_*, register_aadhaar, vc_and_disclose*, dsc_*"
exit 1
fi

# Function to check if circuit exists in array
circuit_exists_in_array() {
local circuit_name="$1"
shift
local array=("$@")

for item in "${array[@]}"; do
if [[ "$item" == "$circuit_name" ]]; then
return 0
fi
done
return 1
}

# Validate circuit exists in the appropriate array and set paths
case "$CIRCUIT_TYPE" in
"register")
if ! circuit_exists_in_array "$CIRCUIT_NAME" "${REGISTER_CIRCUITS[@]}"; then
echo "❌ Error: Circuit '$CIRCUIT_NAME' not found in REGISTER_CIRCUITS"
exit 1
fi
output="output/register"
basepath="./circuits/circuits/register/instances"
;;
"register_id")
if ! circuit_exists_in_array "$CIRCUIT_NAME" "${REGISTER_ID_CIRCUITS[@]}"; then
echo "❌ Error: Circuit '$CIRCUIT_NAME' not found in REGISTER_ID_CIRCUITS"
exit 1
fi
output="output/register"
basepath="./circuits/circuits/register_id/instances"
;;
"register_aadhaar")
if ! circuit_exists_in_array "$CIRCUIT_NAME" "${REGISTER_AADHAAR_CIRCUITS[@]}"; then
echo "❌ Error: Circuit '$CIRCUIT_NAME' not found in REGISTER_AADHAAR_CIRCUITS"
exit 1
fi
output="output/register"
basepath="./circuits/circuits/register/instances"
;;
"vc_and_disclose")
if ! circuit_exists_in_array "$CIRCUIT_NAME" "${DISCLOSE_CIRCUITS[@]}"; then
echo "❌ Error: Circuit '$CIRCUIT_NAME' not found in DISCLOSE_CIRCUITS"
exit 1
fi
output="output/disclose"
basepath="./circuits/circuits/disclose"
;;
"dsc")
if ! circuit_exists_in_array "$CIRCUIT_NAME" "${DSC_CIRCUITS[@]}"; then
echo "❌ Error: Circuit '$CIRCUIT_NAME' not found in DSC_CIRCUITS"
exit 1
fi
output="output/dsc"
basepath="./circuits/circuits/dsc/instances"
;;
*)
echo "❌ Error: Unknown circuit type '$CIRCUIT_TYPE'"
exit 1
;;
esac

# Create output directory
mkdir -p "$output"

filepath="$basepath/${CIRCUIT_NAME}.circom"

if [[ ! -f "$filepath" ]]; then
echo "❌ Error: Circuit file not found: $filepath"
exit 1
fi

# Compile circuit and C++ code
circom "$filepath" \
-l "node_modules" \
-l "node_modules/@zk-kit/binary-merkle-root.circom/src" \
-l "node_modules/circomlib/circuits" \
--O1 -c --output "$output" && \
cd "$output/${CIRCUIT_NAME}_cpp" && \
make

echo " Circuit '$CIRCUIT_NAME' built successfully!"
Loading